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:

Re: Fragen zu COMate

Beitrag von Falko »

Hat sich hiermit erledigt. Ich habe selbst eine passende Lösung nach ca. 1,5Tagen gefunden.
Und kann dieses endlich in meiner ExcelFunktions-Lib einfügen.

http://www.purebasic.fr/english/viewtop ... 15#p383115

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:

Re: Fragen zu COMate

Beitrag von Falko »

@all,
auf Anfrage aus dem englischen Forum habe ich für meine Excelfunktions-LIB folgendes
versucht umzusetzen.
Es soll die max. Anzahl der druckbaren Seiten aus der aktiven Exceltabelle festgestellt werden.
Dazu gibt es zwei verschiedene Möglichkeiten, die ich noch nicht richtige in PB umsetzen konnte.
VBA-Script 1 hat geschrieben:WorkSheets(1).HPageBreaks.Count
und
WorkSheets(1)VPageBreaks.Count
sowie
VBA-Script 2 hat geschrieben:ExecuteExcel4Macro("Get.Document(50)")
Die erste Möglichkeit welche ich in PB probiert habe sieht so aus:

Code: Alles auswählen

Procedure.l XLSFunc_GetSideNumbers(ExcelObject.COMateObject); Test1 max. Druckerseiten
  Protected HPage.l,VPage.l
  HPage=ExcelObject\GetIntegerProperty("WorkSheets(1)\HPageBreaks\Count")+1:Debug COMate_GetLastErrorDescription() 
  VPage=ExcelObject\GetIntegerProperty("WorkSheets(1)\VPageBreaks\Count")+1:Debug COMate_GetLastErrorDescription() 
  ProcedureReturn HPage*VPage
EndProcedure
Speziell habe ich die zweite Version des VBA-Scripts probiert, welche die Anzahl der Druckseiten auf
die aktive Tabelle feststellen soll. Man kann ja in Excel mehrere Druckbereiche vorgeben, die
in VBA auch korrekt gezählt werden. Nur komme ich in PB mit COMate nicht so richtig weiter.
Hier, so wie ich eine Procedure dafür getestet habe:

Code: Alles auswählen

Procedure.i XLSFunc_Get_SideNumbers(ExcelObject.COMateObject);   Test2 max. Druckerseiten
  Protected ReturnValue.i
  ReturnValue=ExcelObject\GetIntegerProperty("ExecuteExcel4Macro('Get\Document(50)')"):Debug COMate_GetLastErrorDescription() 
  ProcedureReturn ReturnValue
EndProcedure
Wenn ich diese so ausführe, kommt folgende Fehlermeldung:
COMatePlus hat geschrieben:Type mismatch in the method parameters
Wisst ihr, was ich hier falsch mache bzw. was ich daran ändern muss?

Ich würde mich sehr freuen, wenn ihr mir hierzu weiter helfen könntet.

Gruß,
Falko
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 »

Probier mal:

Code: Alles auswählen

ReturnValue=ExcelObject\GetIntegerProperty("ExecuteExcel4Macro('Get\Document(50 As Integer)')"):Debug COMate_GetLastErrorDescription()
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:

Re: Fragen zu COMate

Beitrag von Falko »

Danke Peter,
das mit AS Integer hatte ich ähnlich probiert. Nur hinter der Klammer bzw. dem Hochkomma.
Dabei kam die gleiche, englische Fehlermeldung wie oben heraus.

Direkt hinter dem Wert, daran hatte ich nicht gedacht. Nun kommt eine ganz andere Fehlermeldung,
vermutlich direkt von Excel VBA:
Debugger hat geschrieben: Okay.
Die eingegebene Formel enthält einen Fehler.

• Klicken Sie auf 'Hilfe', um Informationen zur Behebung von verbreiteten Problemen mit Formeln zu erhalten.
• Klicken Sie auf 'Funktions-Assistent' (Registerkarte 'Formeln', Gruppe 'Funktionsbibliothek'), um Hilfe bei der Eingabe einer Formel zu erhalten.
• Wenn Sie nicht versuchen, eine Formel einzugeben, vermeiden Sie Gleichheitszeichen (=) oder Minuszeichen (-). Falls diese Zeichen erforderlich sind, fügen Sie vorher ein einzelnes Anführungszeichen (') ein.
0
Okay.
Gruß,
Falko
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 »

Nun kommt eine ganz andere Fehlermeldung,
dann vergiss das. War nur ein Schuss ins Blaue.

Ich schätze mal, dass dieses komische Makro ein Variant zurückliefert.
Demzufolge müsstest Du es mal mit GetVariantProperty() probieren.

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:

Re: Fragen zu COMate

Beitrag von Falko »

Das geht schonmal in Richtung ohne Fehlermeldung :allright: , obwohl der Wert ein bisschen zu hoch ist.
Ich habe irgendwo gelesen, das jemand mit Excel 2010 gleiche Probleme hatte und
seinen Script mit einigen VBA-Befehlen erweitert hatte. Bei ihm kamen auch unsinnige Werte.
Okay.
Okay.
64423952
Okay.
[Edit]
den aktuellen Code habe ich soweit alles ausprobiert. Nur ist der Wert nicht korrekt.
Vielleicht mache ich ja mit dem Variant was falsch.

Code: Alles auswählen

Procedure.i XLSFunc_Get_SideNumbers(ExcelObject.COMateObject);   Test2 max. Druckerseiten
  Protected ReturnValue.Variant
  ReturnValue\intVal=ExcelObject\GetVariantProperty("ExecuteExcel4Macro('Get\Document(50)')"):Debug COMate_GetLastErrorDescription() 
  ProcedureReturn ReturnValue
EndProcedure
Und die Ausgabe hierzu sieht so aus:
Okay.
Okay.
1638248
Okay.
Okay.
Dort müsste aber ein Wert von mindestens 1 stehen. Manuell mit von Hand in
VBA funktioniert es korrekt. Aber in PB ist das leider nicht so einfach /:->

[/Edit]

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:

Re: Fragen zu COMate

Beitrag von Falko »

Könnte das Problem auch von COMatePlus her kommen?

Hier ist eine komplette Beschreibung mit verschiedenen VBA-Codes dazu.
Dort wird auch nicht Variant sondern Integer vorgegeben, welcher leider so auch
nicht klappt.

http://cad-it-portal.ch/cad-school/TNT/ ... n_VBA.html

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:

Re: Fragen zu COMate

Beitrag von Falko »

Ich hatte auch im englischen Forum nach folgende Funktion gefragt, ob srod zu COMate
dazu eine Lösung anbieten könnte:
http://www.purebasic.fr/english/viewtop ... 13&t=50353
Leider warte ich schon einige Tage, wobei der Thread von vielen gelesen wurde, aber wohl
keine Lösung in Sicht ist.

Vielleicht hat einer noch einen passenden Tip dazu. Variant ist schon richtig, damit was ohne
COMate-Fehler angezeigt wird, aber der aktuelle Wert, den ich bei drei Druckseiten innerhalb
einer Tabelle markiert habe, kommt komischerweise immer 10 heraus. Egal, wie viele Seiten ich
hinzufüge. auch kann man mit dieser Funktion ExecuteExcel4Macro() noch vieles mehr anstellen,
wenn es erst mal unter COMate funktioniert. :wink:

Gruß,
Falko
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 »

Mensch, Falko! Du bist echt ein zäher Hund :lol:

Schlechte Nachricht: Ich habe bisher auch keine Lösung gefunden,
den Variant-Wert korrekt auszulesen.

Gute Nachricht: Ich habe eine andere Lösung gefunden (eine meiner
gefürchteten Knie-Brust-Rücken-Auge-Lösungen ;-)).

Code: Alles auswählen

; COMate-Include einfügen

EnableExplicit

Define oExcelApp.COMateObject
Define oScriptControl.COMateObject
Define VBS.s
Define Gesamtseitenzahl

oExcelApp = COMate_CreateObject("Excel.Application")

If oExcelApp
  
  oExcelApp\Invoke("Workbooks\Open('d:\mappe1.xls')") ; Pfad anpassen
  
  oScriptControl = COMate_CreateObject("ScriptControl")
  
  If oScriptControl
    
    oScriptControl\SetProperty("Language = 'VBScript'")
    
    oScriptControl\Invoke("AddObject('oExcelApp', " + Str(oExcelApp) + " As COMateObject)")
    
    VBS = "ReturnValue = oExcelApp.ExecuteExcel4Macro(" + Chr(34) + "Get.Document(50)" + Chr(34) + ")"
    
    oScriptControl\Invoke("AddCode('" + VBS + "')")
    
    Gesamtseitenzahl = oScriptControl\GetIntegerProperty("Eval('ReturnValue')")
    
    Debug Gesamtseitenzahl
    
    oScriptControl\Release()
    
  Else
    Debug COMate_GetLastErrorDescription()
  EndIf
  
  oExcelApp\Invoke("Quit()") 
  oExcelApp\Release()
  
Else
  Debug COMate_GetLastErrorDescription()
EndIf
Bin jetzt zu faul, was erklärendes zum Code zu schreiben.

Falls was unklar ist: Frag nach.

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:

Re: Fragen zu COMate

Beitrag von Falko »

Hallo Peter,
wie du schon weißt, bin ich doch immer hartnäckig :lol:
Aber ohne deine Hilfe und super Ideen, etwas umzusetzen,
worunter man scheitert, hätte ich die Lösung niemals hin bekommen. :allright:

Ich danke Dir vielmals für dieses Beispiel.

Ich habe deinen Code für die ExcelFunctions-Lib etwas angepasst. Wenn du nichts
dagegen hast, möchte ich die wie folgt einbauen.

Code: Alles auswählen

Procedure.l XLSFunc_GetNumberOfPages(ExcelObject.COMateObject,Sheet.s)
 
  ; Hint from Kiffi; Get Number of printer pages
  ; http://www.purebasic.fr/german/viewtopic.php?p=303424#p303424 
 
  Protected oScriptControl.COMateObject
  Protected NumberOfPages.l, oExcelApp.l, VBS.s
 
  oScriptControl = COMate_CreateObject("ScriptControl")
 
  If oScriptControl
   
    oScriptControl\SetProperty("Language = 'VBScript'")
   
    oScriptControl\Invoke("AddObject('oExcelApp', " + Str(ExcelObject) + " As COMateObject)")
   
    VBS = "ReturnValue = oExcelApp.ExecuteExcel4Macro(" + Chr(34) + "Get.Document(50,"+Chr(34)+Chr(34)+Sheet+Chr(34)+Chr(34)+")" + Chr(34) + ")"
   
    oScriptControl\Invoke("AddCode('" + VBS + "')")
   
    NumberOfPages = oScriptControl\GetIntegerProperty("Eval('ReturnValue')")
   
    oScriptControl\Release()
   
    ProcedureReturn NumberOfPages
   
  Else
    Debug COMate_GetLastErrorDescription()
  EndIf 
 
EndProcedure
[Edit] Nochmal überarbeitet [/Edit]

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