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 :mrgreen:

Re: Excel mit COMatePLUS steuern

Verfasst: 12.09.2010 21:03
von Falko
ts-soft hat geschrieben:..Mit EnableExplicit wäre das nicht passiert :mrgreen:
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 :allright:

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:

Code: Alles auswählen

ExcelObject\Invoke("Range('F6:F7')\Select")
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?