Seite 1 von 2
Excel mit COMatePLUS steuern
Verfasst: 06.03.2010 22:14
von Musterschüler
Hi,
ich bin neu hier und habe eine Frage.
Ich möchte mit COMatePLUS Excel starten und ein paar Exceldateien öffen.
Danach möchte ich die Exceldateien nach einem bestimmten Ausdruck durchsuchen.
Wenn ich die richtige Zeile gefunden habe möchte ich dort etwas eintragen.
Hier ein kleiner Auszug aus meinem Code
(angepasster Code aus den Beispieldateien von COMate):
Code: Alles auswählen
XIncludeFile "COMatePLUS.pbi"
Define.COMateObject ExcelObject, WorkBook
ExcelObject = COMate_CreateObject("Excel.Application")
ExcelObject\SetProperty("Visible = #True")
Pfad$ = GetPathPart( GetCurrentDirectory())
ExcelObject\Invoke("Workbooks\Open('" + Pfad$ + "Liste1.xlsx')")
ExcelObject\Invoke("Workbooks\Open('" + Pfad$ + "Liste2.xlsx')")
ExcelObject\Invoke("'Liste1.xlsx'")
For a=1 To ExcelObject\GetIntegerProperty("Workbooks\Count")
Debug ExcelObject\GetStringProperty("Workbooks("+ Str(a) +")\Name") ; nur zum test
Next
If ExcelObject
; hier möchte ich in der Excel Liste 1 schreiben - > das funktioniert aber nicht, es wird nur
; in Liste 2 geschrieben
ExcelObject\Invoke("'Liste1.xlsx'")
ExcelObject\SetProperty("Windows('Liste1.xlsx')\Activate")
ExcelObject\SetProperty("Cells(1,1) = 'Test in Liste 1'")
; und hier möchte ich in der Excel Liste 2 schreiben
ExcelObject\Invoke("'Liste2.xlsx'")
ExcelObject\SetProperty("Windows('Liste2.xlsx')\Activate")
ExcelObject\SetProperty("Cells(1,1) = 'Test in Liste 2'")
ExcelObject\Invoke("Quit()")
ExcelObject\Release()
Else
MessageRequester("COMate -", "Couldn't create the application object!")
EndIf
Die Exceldatei die zuletzt geladen wurde ist aktiv und in diese kann ich auch schreiben.
Das aktivieren der anderen Exceldatei ist nicht möglich.
Kann mir einer sagen wir ich eine Exceldateien aktivieren kann damit ich darin lesen und schreiben kann.
Vielen Dank im voraus.
Musterschüler
__________________________________________________
Code-Tags hinzugefügt
06.03.2010
RSBasic
Re: Excel mit COMatePLUS steuern
Verfasst: 11.03.2010 11:34
von dysti
Musterschüler,
hier hast du ein Beispiel:
Code: Alles auswählen
XIncludeFile "COMatePLUS.pbi"
Pfad$ = GetPathPart( GetCurrentDirectory())
Define.COMateObject ExcelObject, WorkBook
; Objekt erstellen
ExcelObject = COMate_CreateObject("Excel.Application")
If ExcelObject
ExcelObject\SetProperty("Visible = #False")
ExcelObject\SetProperty("AskToUpdateLinks = #False")
ExcelObject\SetProperty("DisplayAlerts = #False")
; Wir schreiben erstmal in die Exeldatei
; hier möchte ich in der Excel Liste 1 schreiben - > das funktioniert aber nicht, es wird nur
; in Liste 2 geschrieben
ExcelObject\Invoke("Workbooks\Open('" + Pfad$ + "Liste1.xls')")
ExcelObject\Invoke("'Liste1.xls'")
ExcelObject\SetProperty("Windows('Liste1.xls')\Activate")
Workbook=ExcelObject\GetObjectProperty("ActiveWorkbook")
ExcelObject\SetProperty("Cells(1,1) = 'Test in Liste 1'")
Workbook\Invoke("Save")
Workbook\Invoke("Close")
Workbook\Release()
; und hier möchte ich in der Excel Liste 2 schreiben
ExcelObject\Invoke("Workbooks\Open('" + Pfad$ + "Liste2.xls')")
ExcelObject\Invoke("'Liste2.xls'")
ExcelObject\SetProperty("Windows('Liste2.xls')\Activate")
ExcelObject\SetProperty("Cells(1,1) = 'Test in Liste 2'")
Workbook=ExcelObject\GetObjectProperty("ActiveWorkbook")
Workbook\Invoke("Save")
Workbook\Invoke("Close")
Workbook\Release()
;For a=1 To ExcelObject\GetIntegerProperty("Workbooks\Count")
; Debug ExcelObject\GetStringProperty("Workbooks("+ Str(a) +")\Name") ; nur zum test
;Next
; Nun wollen wir den Inhalt auch wieder auslesen
; aus Liste 1
ExcelObject\Invoke("Workbooks\Open('" + Pfad$ + "Liste1.xls')")
ExcelObject\Invoke("'Liste1.xls'")
ExcelObject\SetProperty("Windows('Liste1.xls')\Activate")
Workbook=ExcelObject\GetObjectProperty("ActiveWorkbook")
Zelle1$=ExcelObject\GetStringProperty("Cells(1,1)\Value")
; aus Liste 2
ExcelObject\Invoke("Workbooks\Open('" + Pfad$ + "Liste2.xls')")
ExcelObject\Invoke("'Liste2.xls'")
ExcelObject\SetProperty("Windows('Liste2.xls')\Activate")
Zelle2$=ExcelObject\GetStringProperty("Cells(1,1)\Value")
ExcelObject\Invoke("Quit()")
ExcelObject\Release()
; und den Inhalt anzeigen
MessageRequester("Zelleninhalt","Zelleninhalt: " + Chr(10)+Chr(13) + "Zelle 1 -> " + Zelle1$ + Chr(10)+Chr(13) + "Zelle 2 -> " + Zelle2$)
Else
MessageRequester("COMate -", "Couldn't create the application object!")
EndIf
MessageRequester("Exelzugriff", "Programm wird beendet")
End
Re: Excel mit COMatePLUS steuern
Verfasst: 12.09.2010 20:07
von Falko
Anscheinend funktioniert dieses hier nicht mehr in der neuen
COMatePlus-Version:
Code: Alles auswählen
...
ExcelObject\Invoke("Quit()")
ExcelObject\Release() ...
Zwar kann ich mit dem Quit() Excell beenden. Nur im Taskmanager
bleibt es im Speicher, was bei der älteren COMate.pb korrekt beendet wurde.
Vielleicht wisst ihr, woran das liegen könnte, falls ich am Code bei mir noch was ändern müsste.
http://www.purebasic.fr/german/viewtopi ... 66#p239466
Gruß Falko
Re: Excel mit COMatePLUS steuern
Verfasst: 12.09.2010 20:40
von marco2007
Falko hat geschrieben:Zwar kann ich mit dem Quit() Excel beenden. Nur im Taskmanager
bleibt es im Speicher, was bei der älteren COMate.pb korrekt beendet wurde.
Bei MarkCellsRight dürfte etwas nicht stimmen:
Code: Alles auswählen
Procedure MarkCellsRight(ExcelObject.COMateObject); Marks full Cells from selected Cell and right from there
Protected Range1.COMateObject, Range2.COMateObject, *Range1, *Range2
*Range1 = ExcelObject\GetObjectProperty("ActiveCell\Offset(0,1)")
If Range1
*Range2 = ExcelObject\GetObjectProperty("ActiveCell\Offset(0,3)")
If Range2
ExcelObject\Invoke("Range(''"+Str(Range1)+"','"+Str(Range2)+"'')\Select")
Debug "RechtsMarkieren(): "+COMate_GetLastErrorDescription()
Range2\Release()
EndIf
Range1\Release()
EndIf
EndProcedure
...wenn Du`s beim Test-Code kommentierst, dann ist Excel.exe im Taskmanager weg.
Re: Excel mit COMatePLUS steuern
Verfasst: 12.09.2010 20:58
von ts-soft
*Range1 und Range1 sind ja auch unterschiedliche Variablen, genauso bei Range2
Mit EnableExplicit wäre das nicht passiert

Re: Excel mit COMatePLUS steuern
Verfasst: 12.09.2010 21:03
von Falko
ts-soft hat geschrieben:..Mit EnableExplicit wäre das nicht passiert

Naja, dann werde ich gleich mal schauen. Aber das ist in der ExcelFunktion.pbi vorhanden. Und es passiert dann trotzdem damit?
Danke für den Hinweis
Gruß Falko
Re: Excel mit COMatePLUS steuern
Verfasst: 12.09.2010 21:13
von marco2007
ExcelObject\Invoke("Range(''"+Str(Range1)+"','"+Str(Range2)+"'')\Select")...je zwei ''.
Re: Excel mit COMatePLUS steuern
Verfasst: 12.09.2010 21:25
von Falko
Oje, das war wohl damals ein Missverständnis, da ich dachte für " müsse man zwei Hochkommas einzeln setzen. Danke marco2007.
Nun noch zu ts-soft seine korrekte Aussage. Da hatte ich damals mit Probleme, wenn ich es wie folgt gemacht habe:
Code: Alles auswählen
Procedure MarkCellsRight(ExcelObject.COMateObject); Marks full Cells from selected Cell and right from there
Protected Range1.COMateObject, Range2.COMateObject
Range1 = ExcelObject\GetObjectProperty("ActiveCell\Offset(0,1)")
If Range1
Range2 = ExcelObject\GetObjectProperty("ActiveCell\Offset(0,3)")
If Range2
ExcelObject\Invoke("Range('"+Str(Range1)+"','"+Str(Range2)+"')\Select")
Debug "RechtsMarkieren(): "+COMate_GetLastErrorDescription()
Range2\Release()
EndIf
Range1\Release()
EndIf
EndProcedure
Wobei ich den einen Fehler jetzt korrigiert habe.
....
RechtsMarkieren(): An exception occurred during the execution of this method/property.
...
Was bedeutet das hier im Klartext übersetzt?
Vorher war es aufgrund der doppelten ' ' ein Overflow...
Gruß Falko
Re: Excel mit COMatePLUS steuern
Verfasst: 12.09.2010 21:28
von ts-soft
ImTranslator hat geschrieben:Eine Ausnahme kam während der Ausführung dieser Methode/Eigentums vor.
Re: Excel mit COMatePLUS steuern
Verfasst: 12.09.2010 21:33
von marco2007
Wenn man den Range so übergibt, dann ist`s okay:
Sorry für die blöde Frage: Was ist rechts markieren? Damit ich weiß, was passieren soll....-> sprich: Was muss ich bei Excel drücken?