Seite 8 von 18
Re: ExcelFunktionen COMatePlus
Verfasst: 27.04.2012 10:19
von Falko
MightyMAC hat geschrieben:Ja, genau.
Das ist noch nicht korrekt. Hierbei wird mit dieser VBA-Funktion wohl die Kopie aus einer tabelle in eine neue
Arbeitsmappe erzeugt, wie ich testen konnte. Vielleicht hat Kiffi noch eine Idee.
Schade, das man in Comate nicht die Zeile komplett mit Invoke übernehmen kann.
Excel VBA hat geschrieben:Worksheets("Sheet1").Copy After:=Worksheets("Sheet3")
Code: Alles auswählen
Procedure XLSFunc_CopyWorksheetAfter(ExcelObject.COMateObject, FirstSheet.s="",SecondSheet.s="");Copy Sheet_One after Sheet_Two
ExcelObject\Setproperty("After:=Worksheets('"+SecondSheet+"')")
ExcelObject\Invoke("Worksheets('"+FirstSheet+"')\Copy")
EndProcedure
Gruß,
Falko
Re: ExcelFunktionen COMatePlus
Verfasst: 27.04.2012 10:49
von Falko
Ich sehe, das du einige Funktionen benutzt, die ich nicht in meiner Funktionslibrary
habe. Das ist hier XLSFunc_
SetExcelVisible(ES,#False).
Nachdem ich deinen Source bei zu meinen Funktionen angepasst habe. Funktioniert
er so wie es fast soll. Nur wenn man von Excel schon drei Tabellen (Tabelle1, Tabelle2 und Tabelle3)
voreingestellt bekommt, wird die erste Tabelle in Jan umbenannt, und die beiden anderen Tabellen Feb u. Mrz
natürlich hinter der letzten Tabelle3 angehängt.
Code: Alles auswählen
XIncludeFile "ExcelFunktion.pbi"
Define WorkDir.s, DATEI.s,ES.COMateObject
WorkDir="F:\Purebasic\X86\Falko\ExcelProgramm\"
DATEI=WorkDir+"Test.xls"
ES=XLSFunc_CreateExcelFile(WorkDir)
Debug COMate_GetLastErrorDescription()
XLSFunc_ExcelVisible(ES,#False)
Debug COMate_GetLastErrorDescription()
XLSFunc_PageSetup(ES,#xlLandscape,1,1,2.5,1)
Debug COMate_GetLastErrorDescription()
XLSFunc_RenameActiveSheet(ES,"Jan")
Debug COMate_GetLastErrorDescription()
XLSFunc_AddWorksheetAfter(ES,"Feb")
Debug COMate_GetLastErrorDescription()
XLSFunc_AddWorksheetAfter(ES,"Mrz")
Debug COMate_GetLastErrorDescription()
XLSFunc_SaveAsWorkbook(ES,DATEI)
Debug COMate_GetLastErrorDescription()
XLSFunc_ExcelVisible(ES,#True)
Debug COMate_GetLastErrorDescription()
XLSFunc_CloseWorkbook(ES)
Debug COMate_GetLastErrorDescription()
Gruß,
Falko
Re: ExcelFunktionen COMatePlus
Verfasst: 28.04.2012 00:45
von MightyMAC
Falko hat geschrieben:Hierbei wird mit dieser VBA-Funktion wohl die Kopie aus einer tabelle in eine neue
Arbeitsmappe erzeugt, wie ich testen konnte.
Laut MSDN kopiert Excel ein Sheet in ein neues Workbook, wenn es kein "After" oder "Before" Schlüsselwort erkennt. Ich vermute das dies der Fall ist, weiß allerdings keine Lösung.
Re: ExcelFunktionen COMatePlus
Verfasst: 28.04.2012 00:57
von Falko
Stimmt, das hatte ich dort auch gelesen.
Ich habe mal versucht das in Excel direkt über VBA zu probieren. Da wird tatsächlich dann die Tabelle1 hinter der Tabelle3 als Tabelle1(1) kopiert.
Da ich leider noch keine passende Lösung mit COMate herausgefunden habe, habe ich bezüglich Excel ....\Copy After:=... einen Thread im englischen
Forum unter "Coding Questions" eröffnet und hoffe das dort srod vielleicht eine passende Lösung mit COMate zeigen kann.
Das After:= wird so in meinem obigen Beispiel von Comate wohl nicht hinzugefügt und somit ist es nur eine einfache Copyfunktion, welche eine komplett neue Tabelle mit einem Tabellen-blatt 1 aufmacht. Vielleicht komme ich noch dahinter, wie man dieses gesplittete After:= oder Before:= mit copy anwenden kann.
Gruß,
Falko
Re: ExcelFunktionen COMatePlus
Verfasst: 29.04.2012 02:20
von Falko
MightyMAC hat geschrieben:Falko hat geschrieben:Hierbei wird mit dieser VBA-Funktion wohl die Kopie aus einer tabelle in eine neue
Arbeitsmappe erzeugt, wie ich testen konnte.
Laut MSDN kopiert Excel ein Sheet in ein neues Workbook, wenn es kein "After" oder "Before" Schlüsselwort erkennt. Ich vermute das dies der Fall ist, weiß allerdings keine Lösung.
Ich glaube, jetzt habe ich eine passende Lösung für Copy After und Move After gefunden
Zwar hatte ich eine Anfrage dazu ins englische Forum unter Codefragen gestellt, aber leider kam keine Resonanz.
Somit habe ich erst mal hier und da nach anderen Lösungen gesucht und ein klitzekleines Beispiel von srod gefunden.
http://www.purebasic.fr/english/viewtop ... lit=Comate
Nun habe ich es so, wie es Excel VBA auch macht hin bekommen und zwei weitere Funktionen im Anfangsthread hinzugefügt.
Folgende Funktionen habe ich ergänzt:
XLSFunc_CopyWorksheetAfter()
XLSFunc_MoveWorksheetAfter()
[Edit]
Da in VBA das Copy und Move nicht nur den Zusatz After, sondern auch Before hat, habe ich auch hierzu eine passende
Proceduren in meiner ExcelFunktions.pbi eingebaut. Ich freue mich, wenn ich hier Einigen PBler hiermit weiterhelfen konnte.
Folgende Funktionen ergänzt:
XLSFunc_CopyWorksheetBefore()
XLSFunc_MoveWorksheetBefore()
[/Edit]
Gruß,
Falko
Re: ExcelFunktionen COMatePlus
Verfasst: 29.04.2012 10:38
von MightyMAC
Funktioniert ganz ausgezeichnet! Danke Falko, du bist der Hammer!

Re: ExcelFunktionen COMatePlus
Verfasst: 29.04.2012 12:29
von Falko
@MightyMAC
Das freut mich
ThoPie hat geschrieben:Hallo Leute,
ich möchte gern per XLSFunc_AddWorksheetAfter Arbeitsblätter für alle 12 Monate anlegen. Mein Quellcode-Fragment sieht wie folgt aus:
Code: Alles auswählen
DATEI=WorkDir+"Test.xls"
ES=XLSFunc_CreateExcelFile(WorkDir)
XLSFunc_SetExcelVisible(ES,#False)
XLSFunc_PageSetup(ES,#xlLandscape,1,1,2.5,1)
XLSFunc_RenameActiveSheet(ES,"Jan")
XLSFunc_AddWorksheetAfter(ES,"Feb")
XLSFunc_AddWorksheetAfter(ES,"Mrz")
XLSFunc_SaveAsWorkbook(ES,DATEI)
XLSFunc_SetExcelVisible(ES,#True)
XLSFunc_CloseWorkbook(ES)
XLSFunc_CloseExcel(ES)
Beim Erstellen der Februar-Tabelle kommt immer ein Adressfehler in der Zeile
NewSheet\SetProperty("Name='"+NewSheetName+"'")
der Prozedur XLSFunc_AddWorksheetAfter.
Kann mit bitte mal jemand sagen, was ich falsch mache.
Danke schön.
Ich habe zu XLSFunc_AddWorksheetAfter
eine weitere Procedure XLSFunc_AddWorksheetAfterSheet(Tabellennummer.l,NeueTabelle.s)
geschrieben, mit der Du gezielt eine neue Tabelle nach der anderen hintereinander einfügen kannst.
Sorry @Kiffi, das ich deinen Code dafür benutzt und umgeändert habe
Siehe ExcelFunctions.pbi am Threadanfang.
Dazu habe ich dein Beispiel hierzu angepasst:
Code: Alles auswählen
XIncludeFile "ExcelFunktion.pbi"
Define WorkDir.s, DATEI.s,ES.COMateObject
WorkDir="F:\Purebasic\X86\Falko\ExcelProgramm\"; hier den Verzeichnispfad korrigieren
DATEI=WorkDir+"Test.xls"
ES=XLSFunc_CreateExcelFile(WorkDir)
XLSFunc_ExcelVisible(ES,#False)
XLSFunc_PageSetup(ES,#xlLandscape,1,1,2.5,1)
XLSFunc_RenameActiveSheet(ES,"Jan")
XLSFunc_AddWorksheetAfterSheet(ES,1,"Feb")
XLSFunc_AddWorksheetAfterSheet(ES,2,"Mrz")
XLSFunc_SaveAsWorkbook(ES,DATEI)
XLSFunc_ExcelVisible(ES,#True)
XLSFunc_CloseWorkbook(ES)
Ich hoffe, Du kannst es gebrauchen
Gruß,
Falko
Re: ExcelFunktionen COMatePlus
Verfasst: 29.04.2012 19:34
von Falko
Nun hier noch eine weitere Funktion um wahlweise Tabellen zu löschen.
Manchmal ist es sehr praktisch leere Tabellenblätter zu löschen.
Da wir sie nun auf einfache Weise hinzufügen können, ob am Ende oder dazwischen,
ist es nun auch möglich diese oder andere wiederum zu löschen.
Folgende Funktion ist nun in der ExcelFunktion.pbi enthalten.
XLSFunc_DeleteWorksheet()
Gruß,
Falko
Re: ExcelFunktionen COMatePlus
Verfasst: 02.05.2012 18:24
von ThoPie
Hallo Falko,
vielen Dank für deine Ergänzungen. Die funktionieren super.
Gibt es eigentlich schon eine Funktion, mit der die Textfarbe einer Zelle eines Bereiches geändert werden kann?
Also so was wie XLSFunc_SetTextColor(ExcelObject.COMateObject, Range.s, cRed.l, cGreen.l, cBlue.l).
Viele Grüße
ThoPie
Re: ExcelFunktionen COMatePlus
Verfasst: 02.05.2012 20:56
von Falko
ThoPie hat geschrieben:Hallo Falko,
vielen Dank für deine Ergänzungen. Die funktionieren super.
Gibt es eigentlich schon eine Funktion, mit der die Textfarbe einer Zelle eines Bereiches geändert werden kann?
Also so was wie XLSFunc_SetTextColor(ExcelObject.COMateObject, Range.s, cRed.l, cGreen.l, cBlue.l).
Viele Grüße
ThoPie
Die gibt es noch nicht, aber ich habe sie jetzt aus einer vorherigen Funktion etwas angepasst und
nun gibt es sie
Die Funktion in der ExcelFunktion.pbi heißt:
Procedure XLSFunc_SetFontColor(ExcelObject.COMateObject, Range.s, cRed.l, cGreen.l, cBlue.l); Set FontColor
Das dazugehörige Beispiel habe ich auch leicht modifiziert.
Gruß,
Falko