Fragen zu COMate

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Fragen zu COMate

Beitrag von Falko »

Leider findet man nicht viele passende Beispiele zu COMate, die
man wirklich nutzen kann. Klar, einfache Beispiele schon. Aber ich
habe ein Problem folgendes umzusetzen:

Excel_Makro (Soll Tabelle hinter der letzten erstellen)

Excel Makro hat geschrieben:Sheets.Add After:=Sheets(Sheets.Count)
Ich habe etliches probiert und kriege das leider nicht hin.

Letztes Beispiel sieht in etwa so aus:

Code: Alles auswählen

Procedure AddWorksheetAfter(ExcelObject.COMateObject);Dieses funktioniert leider nicht
  Protected Sheets.COMateObject,n.l
  Sheets=ExcelObject\GetObjectProperty("Sheets")
  n=Sheets\GetIntegerProperty("Count")
  Sheets\SetProperty("After := " +Str(n))
  Debug "AddWorksheetAfter(): "+COMate_GetLastErrorDescription() 
  Sheets\Invoke("Add")
EndProcedure
Der Fehler, den ich an der angegebenen Stelle erhalte ist folgender:
COMate hat geschrieben: AddWorksheetAfter(): Method/property not supported by this object.
Vielleicht könnt ihr mir ja weiter helfen.

Grüße Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ich glaube, das keiner solche Fragen im Anfängerforum beantworten möchte :mrgreen:
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Fragen zu COMate

Beitrag von Kiffi »

Hallo Falko,
Falko hat geschrieben:
Excel Makro hat geschrieben:Sheets.Add After:=Sheets(Sheets.Count)
Schaut man sich die Add-Methode im VB6-Objektkatalog an,
so sieht man folgendes:
Function Add([Before], [After], [Count], [Type]) As Object
Das heißt: Hier gibt es vier optionale Parameter.

In VB(A) hat man nun die Möglichkeit, einen Parameter direkt anzugeben,
indem man ihn benennt (in diesem Fall: After:=). Somit muss man die
vorherigen Parameter nicht mit angeben.

Das geht mit COMate meines Erachtens nicht. Deshalb muss Du den
Before-Parameter ebenfalls angeben, damit die Reihenfolge der
Parameter korrekt ist.

Da Du den Before-Parameter aber nicht angeben willst (bzw. kannst),
musst Du anstelle dessen #Empty oder #Optional oder #Opt angeben.

Kommst Du mit diesen Infos weiter?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Hallo Kiffi,
ich bin froh das Du hierzu antwortest. :allright:
Wie du vermutlich schon gesehen hast, habe ich soweit fast alle ExcelFunktionen vom Disphelper nach COMate umgeschrieben,
sodass jeder diese ExcelFunktionen in PB nutzen, als auch weitere Ideen einbringen kann.
Ich werde dann mal mit deinen Infos versuchen auch diese Funktion einzubinden. Das mit dem Zellen rechts markieren, werde ich evtl. rausschmeißen.

Nochmals vielen Dank für deine Info. :allright:

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

@Kiffi,

Das Problem ist bei mir leider, das Verständnis zum COMate, wie man
die VB6-Funktionen korrekt einsetzen muss. Zwar habe ich schon probiert die Variablen in ADD() mit Invoke zu setzten, was leider nicht ging.

Dieses Beispiel sagt mir einen Fehler mit der Methode an. Führt aber das ADD zwar aus, nur werden wohl die Parameter wohl so nicht korrekt übergeben.

Ich weiß, folgender Procedure ist noch nicht korrekt. Wäre es möglich mir den Fehler direkt anzuzeigen?

Code: Alles auswählen

Procedure AddWorksheetAfter(ExcelObject.COMateObject);Dieses funktioniert leider nicht
  Protected Sheets.COMateObject,n.l
  Sheets=ExcelObject\GetObjectProperty("Sheets")
  Debug Sheets
  n=Sheets\GetIntegerProperty("Count")
  Sheets\SetProperty("Before = #Empty")
  Sheets\SetProperty("After = "+Str(n))
  Sheets\SetProperty("Count = 1")
  Sheets\SetProperty("Type="+Str(#xlWorksheet))
  Debug "1_AddWorksheetAfter(): "+COMate_GetLastErrorDescription() 
  Sheets\Invoke("Add")
  Debug "2_AddWorksheetAfter(): "+COMate_GetLastErrorDescription()  
EndProcedure
Im Voraus nochmal vielen Dank für Deine Mühen.

Grüße, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Hallo Falko,

Dein Hauptproblem in dieser Procedure ist, dass Du die Parameter auf
die Sheets-Collection setzt, welche dort freilich nichts zu suchen haben.

Du musst vielmehr den After-Parameter der Add() - Funktion übergeben.
Allein dort ist sie korrekt angegeben.

Noch ein paar Bemerkungen:

* Die Worksheets werden in Deinem Beispiel dem aktiven Workbook
hinzugefügt (Du übergibst ja das ExcelObject). Um flexibler zu bleiben,
solltest Du anstelle des ExcelObjects ein WorkbookObject übergeben. So
kann man explizit angeben, welchem Workbook Sheets hinzugefügt
werden sollen.

* Add() ist eine Funktion, die das hinzugefügte Sheet zurückgibt. Wenn
Du also nach dem Add() noch weiteres mit dem neuen Sheet vorhast,
dann solltest Du es GetObjectProperty() aufrufen. Wenn Du lediglich das
Sheet hinzufügen willst, es danach aber nicht mehr benötigen, dann
kannst Du Invoke() ausführen. In meinem Beispiel benenne ich das neue
Sheet, deswegen rufe ich GetObjectProperty() auf.

Code: Alles auswählen

Procedure AddWorksheetAfter(WorkbookObject.COMateObject, NewSheetName.s = "") 
  
  Protected LastSheet.COMateObject, NewSheet.COMateObject

  ; Letztes Sheet ermitteln
  LastSheet = WorkbookObject\GetObjectProperty("Sheets(" + Str(WorkbookObject\GetintegerProperty("Sheets\Count")) + ")")
  
  ; Neues Sheet hinter dem letzten Sheet erstellen
  NewSheet = WorkbookObject\GetObjectProperty("Sheets\Add(#Optional, " + Str(LastSheet) + " As COMateObject)")

  ; Optional: Namen des neuen Sheets setzen
  If NewSheetName <> ""
    NewSheet\SetProperty("Name = '" + NewSheetName + "'")
  EndIf

  ; NewSheet-Objekt freigeben
  NewSheet\Release()
   
  ; LastSheet-Objekt freigeben
  LastSheet\Release()
  
EndProcedure

Define ExcelObject.COMateObject
Define WorkbookObject.COMateObject

ExcelObject = COMate_CreateObject("Excel.Application") 

ExcelObject\SetProperty("Visible = #True") 

WorkbookObject = ExcelObject\GetObjectProperty("Workbooks\Add") 

AddWorksheetAfter(WorkbookObject, "Neues Sheet")

Delay(2000)

WorkbookObject\Release()

ExcelObject\Invoke("Quit")

ExcelObject\Release()
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Hallo Kiffi,

erstmal vielen Dank hierzu.

Also war der Hauptfehler bei mir wohl, das ich das WorkbookObject nicht genutzt habe.

Das mit dem Add war ja ähnlich wie in der Funktion zum Disphelper. Nur hatte ich damit auch Probleme. Daraufhin hatte ich mir ein Macro in Excel zum Tabellenblatt hinzufügen aufzeichnen lassen und deswegen dachte ich, Sheets hätte gereicht.

Darum auch die Fehlermeldung, das die Add-Methode nicht so hinzugefügt werden konnte wie du es mir geschrieben hattest.

Ich muss in Sachen VisualBasic und COMate noch Einiges verstehen und dazulernen.

Ich bin Dir zu Dank verpflichtet. Ohne Dein Wissen und Hinweisen und
Beispielen, wäre ich nicht damit weiter gekommen.

Ich hoffe, Du hast nichts dagegen, wenn ich deine Procedure mit einem Hinweis in ExcelFunktion.pbi mit einbaue und es unter Tips und Tricks korrigiere.

Viele Grüße und frohe Ostern,

Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Falko hat geschrieben:Ich hoffe, Du hast nichts dagegen, wenn ich deine Procedure in ExcelFunktion.pbi mit einbaue und es unter Tips und Tricks korrigiere.
Das war das Ziel des Plans. :-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Kiffi hat geschrieben:
Falko hat geschrieben:Ich hoffe, Du hast nichts dagegen, wenn ich deine Procedure in ExcelFunktion.pbi mit einbaue und es unter Tips und Tricks korrigiere.
Das war das Ziel des Plans. :-)

Grüße ... Kiffi

Ich Danke Dir. Das ist ein guter Plan :allright:
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: Fragen zu COMate

Beitrag von Falko »

@Kiffi,
hast du zu folgendem noch einen guten Plan? :)

Irgendwie machen mich die Adds in COMate fertig. Auch ein Vergleich ais der ExcelDemo (Beispiel zu COMatePlus)
mit dem Add - Befehl funktioniert in Verbindung mit dem Names\Add bei meinen Versuchen nicht.

Hier erst mal das VBA-Macro, wobei ich, wenn ich weiter bin, die Adresse der Zelle noch versuchen muss.
Es soll ja nicht direkt eine Tabelle und Cell, sondern, wenn möglich gleich in ActiveWorkbook z.B. die Zelle A1
per Address angespochen werden.
VBA-Macro hat geschrieben:ActiveWorkbook.Names.Add Name:="myName", RefersToR1C1:= _
"=Sheet1!R1C1"
Und soweit habe ich versucht es in PB mit COMate hinzu bekommen (Leider noch fehlerhaft):

Code: Alles auswählen

Procedure.s XLSFunc_CreateCellName(ExcelObject.COMateObject,Cellname.s)
  Protected MyNames.COMateObject
  MyNames=ExcelObject\GetObjectProperty("Names\Add"):Debug COMate_GetLastErrorDescription()
  If MyNames
    Debug"MyNames aktiv"
    ;MyNames\Invoke("Add"):Debug COMate_GetLastErrorDescription()
    MyNames\SetProperty("Name = '" +Cellname+"'"):Debug COMate_GetLastErrorDescription()
    MyNames\SetProperty("RefersTo ='Tabelle1!$A$1'"):Debug COMate_GetLastErrorDescription()
    MyNames\Release():Debug COMate_GetLastErrorDescription()
  EndIf
EndProcedure
Kannst du mir evtl. das für die ExcelFunktions-Library korrigieren?
Danke, wenn du mir bei dieser weiteren Funktion helfen könntest.

[Edit] Ich habe das Add separat in einer Invoke geschrieben. Dann ist schon eine
Zeile ohne Fehler, und die Schleife wird angesprungen. Nur geht es ab Add wieder
mit einen Fehler los.

Code: Alles auswählen

Procedure.s XLSFunc_CreateCellName(ExcelObject.COMateObject,Cellname.s)
  Protected MyNames.COMateObject
  MyNames=ExcelObject\GetObjectProperty("ActiveWorkbook\Names"):Debug COMate_GetLastErrorDescription()
  If MyNames
    Debug"MyNames aktiv"
    MyNames\Invoke("Add"):Debug COMate_GetLastErrorDescription()
    MyNames\SetProperty("Name = '" +Cellname+"'"):Debug COMate_GetLastErrorDescription()
    MyNames\SetProperty("RefersTo ='Tabelle1!$A$1'"):Debug COMate_GetLastErrorDescription()
    MyNames\Release():Debug COMate_GetLastErrorDescription()
  EndIf
EndProcedure
[/Edit]

Das ActiveWorkbook.Names.Add in VBA müsste eigentlich ähnlich funktionieren,
wie das Workbooks.Add in srods ExcelDemo Beispiel.

Ich hoffe jemand kann mir hier meinen Fehler auflösen :cry:

Gruß,
Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten