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.
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
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.

Die Tabelle wird geändert, sie wird gespeichert und ... EXCEL ist
nicht mehr im Taskmanager.
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
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.
Danke für den Tipp mit der VBA-Code Seite.
Bin total begeistert. Nochmals Danke für Deine Hilfe und Geduld bei diesem Problem.

Verfasst: 01.04.2009 15:23
von CNESM
Code: Alles auswählen
WorkSheet = ExcelObject\GetObjectProperty("Sheets('" + TabName$ + "')")
WorkSheet\Invoke("Activate()")
heisst in VBA übersetzt:
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:
Müsste aber so heissen, sonst erscheint ebenfalls ein Fehler:
oder für ältere Versionen von Excel (Office 2000)
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 save
d 
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.

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
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.