Seite 3 von 4

Verfasst: 01.04.2009 14:25
von TheSaint
Hallo Falko,
Falko hat geschrieben: Ich habe nun alles soweit angepasst, bis keine Fehlermeldung bei den Comate-funktionen auftauchen. Nun ist es so, wie Du es hast. Excel wird im Task nicht beendet.
vielen Dank das Du noch nicht aufgegeben hast. :)

Ich habe den Code ausgeführt und ich habe im Debugger
10 x Okay erhalten.
Jedoch bleibt es wie Du es schon festgestellt hast, Excel bleibt im
Taskmanager. :cry:

Dann liegt es ja gottseidank nicht an uns.
Könnte es sein, dass es bei Comate falsch verarbeitet wird?
Es ist nur eine Vermutung. In der gewünschten Konstellation
funktioniert der Quit() Befehl durch Comate nicht?

Nochmal vielen Dank für Deine Hilfe.

Verfasst: 01.04.2009 14:33
von CNESM
Hy,

also bei mir läuft der Code. Der Debugger gibt jedes mal "Okey" aus und im Task-Manager ist kein Excel mehr.

Was für ein Office verwendet ihr? Ich nutze Office 2007 und Office 2000.

Verfasst: 01.04.2009 14:41
von Falko
@CNESM

Ich nutze Office 2007 unter Vista X64.

Wenn ich die Debugs raus habe und bei Save = #True und Close
=#True einstelle, wird bei mir im Taskmanager das Excel entfernt.

Aber wenn ich hinter jeder Comatefunktion ein Error ausgeben lasse,
sind diese dann nicht Okay.

Somit habe ich überall, wo der Fehler auftauchte, die Trues
weggemacht und keine Errormeldungen erhalten, dafür bleibt aber
das Excel im Task hängen.

Achja, wichtig ist es bei diesem Test unter C:\ den Ordner Daten
anzulegen und dort eine leere Exceldatei Kassenbuch2008.xls
vorhanden zu haben.


Hast du das auch gemacht?

Gruß Falko

Verfasst: 01.04.2009 14:48
von CNESM
Also folgenden Code habe ich etwas angepasst. Läuf der bei euch?

Code: Alles auswählen

IncludePath #PB_Compiler_Home+"comate_pb4-3" 
XIncludeFile "COMate.pbi" 

Define.COMateObject ExcelObject, WorkBook 
Define.COMateObject ExcelObject, WorkSheet 
Define.COMateObject ExcelObject, Sheet 

ExcelObject = COMate_CreateObject("Excel.Application") 
Debug COMate_GetLastErrorDescription() 
ExcelObject\SetProperty("Visible = #False") 
Debug COMate_GetLastErrorDescription() 
ExcelObject\Invoke("Workbook\Open('C:\Test\Kassenbuch2008.xls')") 
Debug COMate_GetLastErrorDescription() 
If ExcelObject 
  intRow.i = 13 

    For a=1 To ExcelObject\GetIntegerProperty("Worksheets\Count") 
      TabName$ = ExcelObject\GetStringProperty("Worksheets("+ Str(a) +")\Name") 
        If Right(TabName$,4) = Str(2008) 
          WorkSheet = ExcelObject\Invoke("Sheets('" + TabName$ + "')\Activate") 
            While ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",8)\Value") <> "" 
              Cell6$ = ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",9)\Value") 
              ExcelObject\SetProperty("Cells(" + Str(intRow) + ",14) = "+ Cell6$ + "") 
              intRow + 1 
            Wend 
        intRow = 13 
        EndIf 
    Next 
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\SetProperty("DisplayAlerts = #False") 
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\Invoke("ActiveWorkbook\Save") 
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\Invoke("Workbooks\Close") 
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\SetProperty("DisplayAlerts = #True") 
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\Invoke("Quit()")
    Debug COMate_GetLastErrorDescription() 
    ExcelObject\Release()    
    Debug COMate_GetLastErrorDescription() 
Else 
  MessageRequester("COMate - Excel", "Couldn't create the application object!") 
EndIf 
Mit Save = #True sagst du Excel es wurden keine Änderungen vorgenommen und Excel speichert nicht. Daher schließt sich Excel OHNE Änderungen zu speichern.

Datei habe ich angelegt.

Verfasst: 01.04.2009 15:04
von Falko
Ok, nachdem du aus dem Zweizeiler einen gemacht hast, funktionitert es :allright:

Code: Alles auswählen

WorkSheet = ExcelObject\GetObjectProperty("Sheets('" + TabName$ + "')")
WorkSheet\Invoke("Activate()")
zu

Code: Alles auswählen

WorkSheet = ExcelObject\Invoke("Sheets('" + TabName$ + "')\Activate")
[Edit]
>>>Mit Save = #True sagst du Excel es wurden keine Änderungen vorgenommen und Excel speichert nicht. Daher schließt sich Excel OHNE Änderungen zu speichern.

Von der Beschreibung her, dachte ich, dass das nur Saved betrifft.
Zu mindestens, was ich gegoogld habe.

Eine schöne VBA-Script-Seite zum übernehmen für PB Comate, habe ich dazu noch hier gefunden.

http://www.kmbuss.de/Excel-CD/vba-codes.htm


[/Edit]

Gruß Falko

Verfasst: 01.04.2009 15:13
von TheSaint
Hallo CNESM,
CNESM hat geschrieben:Also folgenden Code habe ich etwas angepasst. Läuf der bei euch?
WAHNSINN. Es funktioniert.:allright: Die Tabelle wird geändert, sie wird gespeichert und ... EXCEL ist nicht mehr im Taskmanager. :D

Was hast Du denn jetzt geändert, damit es funktioniert?

Bin total begeistert.

Vielen Dank CNESM und
vielen Dank Falko für Eure Unterstützung und Geduld.

Verfasst: 01.04.2009 15:18
von TheSaint
Hallo Falko,

na da war ich wohl zu langsam mit meiner Frage. :)
Falko hat geschrieben:Ok, nachdem du aus dem Zweizeiler einen gemacht hast, funktionitert es :allright:

Code: Alles auswählen

WorkSheet = ExcelObject\GetObjectProperty("Sheets('" + TabName$ + "')")
WorkSheet\Invoke("Activate()")
zu

Code: Alles auswählen

WorkSheet = ExcelObject\Invoke("Sheets('" + TabName$ + "')\Activate")


Vielen Dank für die Erläuterung. Das es daran liegt, wäre ich nie im Leben drauf gekommen.
Falko hat geschrieben: Eine schöne VBA-Script-Seite zum übernehmen für PB Comate, habe ich dazu noch hier gefunden.

http://www.kmbuss.de/Excel-CD/vba-codes.htm

Danke für den Tipp mit der VBA-Code Seite.

Bin total begeistert. Nochmals Danke für Deine Hilfe und Geduld bei diesem Problem. :allright:

Verfasst: 01.04.2009 15:23
von CNESM

Code: Alles auswählen

WorkSheet = ExcelObject\GetObjectProperty("Sheets('" + TabName$ + "')") 
WorkSheet\Invoke("Activate()")
heisst in VBA übersetzt:

Code: Alles auswählen

Sheets(TabName)
Sheets(TabName).Activate
In VBA würde bei der ersten Zeile ein Fehler erscheinen.

Weiterhin war auch beim ermitteln des Zelleninhalts nicht angegeben, was Excel machen soll:

Code: Alles auswählen

ExcelObject\GetStringProperty("Cells(" + Str(intRow) + ",8)")
ist in VBA:

Code: Alles auswählen

Cells(intRow,8)
Müsste aber so heissen, sonst erscheint ebenfalls ein Fehler:

Code: Alles auswählen

Cells(intRow,8).Value
oder für ältere Versionen von Excel (Office 2000)

Code: Alles auswählen

Cells(intRow,8).Text
Zwei weitere sehr gute Foren sind:

http://www.office-loesung.de
http://www.herber.de
Von der Beschreibung her, dachte ich, dass das nur Saved betrifft.
Zu mindestens, was ich gegoogld habe.
Sorry, meinte natürlich saved :-)

Verfasst: 01.04.2009 15:32
von TheSaint
Hallo CNESM,

danke für die zusätzlichen Erläuterungen.

Komisch nur, dass die Excel Tabellen trotz dieser aufgeführten
Fehler, die Zellen richtig gefüllt hat und dann auch noch gespeichert hat.
Das einzige, was war, war das Excel im Taskmanager stehen blieb.

Vielen Dank für Deine Hilfe. :D Bin total happy, dass es jetzt klappt.

Verfasst: 01.04.2009 16:11
von CNESM
Vielleicht liegt das an COMate. Hinter den Befehl "Activate" und "Value" stecken ja auch bestimmte Variablen bzw. Befehle, die scheinbar COMate auch ohne diesen Zusatz "richtig" übergibt und ausführt. Da aber VBA mäßig dies nicht richtig ist, bricht Excel bzw. die Application bei diesen Zeilen ab und bleibt hängen. COMate aber arbeitet weiter, weil für ihn das alles richtig ist. Alle Befehle, die somit mit dem Ansprechen von Application zu tun hat, werde nicht mehr ausgeführt (Siehe quit). Das DisplayAlerts scheinbar dennoch funktioniert ist nur ne falsche Erscheinung, da die Application diese Befehlen garnicht erst ausführt (da hängen geblieben). Es erscheint aber dennoch keine Abfrage, ob man speichern möchte, da die Excel Appplication ja nicht mehr arbeitet. Vielleicht liege ich mit der Vermutung auch vollkomme falsch <) und es hat nen anderen Hintergrund. Wer weiß das schon bei Microsoft :freak:

Generell gebe ich dir den Tipp, im ersten Schritt erst in VBA Excel zu entwickeln und dann das ganze in COMate zu übertragen. Dadurch ist man auf der sicheren Seite.