Seite 1 von 4
VBA-Makro unter "Meine Makros" speichern [GELÖST]
Verfasst: Do 2. Aug 2018, 13:26
von Ich Bins
Hallo miteinander,
nach dem ich jahrzehntelang mit MSOffice Programmen gearbeitet habe möchte ich auf LibreOffice umsteigen.
Da sich im Laufe der Zeit einige VBA Makros angesammelt haben würde ich diese gerne auch in LibreOffice verwenden.
Meine Versuche in Calc die Makros Schritt für Schritt neu zu erstellen scheiterten bereits an einem einfachen Makro (3 Spalten nacheinander markieren und danach löschen). Es wird zwar etwas aufgezeichnet aber nur die erste Aktion (nur die zuerst gewählte Spalte wird gelöscht) wird beim Makro Aufrufen ausgeführt. ?????
Nach vielen zermürbenden Recherchen und Versuchen beendete ich das Aufnehmen von Makros.
Danach versuchte ich mit Calc eine Excel-VBAProbe-Datei die ein Makro enthält zu öffnen. Nach dem ich die Excel-VBAProbe-Datei in meinen "Vertrauensvollen Ordner" verschob und darin öffnete war das VBA-Makro, was die ersten drei, vier Zeilen betrifft, zu verwenden. Allerdings nur in dieser VBAProbe-Datei. Das Makro soll jedoch in anderen Dateien genutzt werden. Öffne ich zusätzlich zur geöffneten VBAProbe-Datei die zu bearbeitende Muster-Datei und starte bei aktiver Muster-Datei über Extras/Makros/Makros verwalten/LibreOffice Basic.../ das Makro in der VBAProbe-Datei wird er in der VBAProbe-Datei gestartet und nicht in der Muster-Datei.
Nun zu meiner eigentlichen Frage.
Ist es möglich das VBA-Makro aus der VBAProbe-Datei unter "Meine Makros" in ein Modul zu speichern, so dass es in beliebigen Dateien genutzt werden kann ? Mein Versuch das Makro komplett mit copy und past unter "Meine Makros" in ein Modul zu speichern funktionierte, jedoch verweigert es schon bei der ersten Zeile
mit dem Basic-Laufzeitfehler '35' seinen Dienst.
Viele Grüße
Ich Bins
Re: VBA-Makro unter "Meine Makros" speichern
Verfasst: Do 2. Aug 2018, 14:31
von balu
Hallo Ich Bins,
wenn schon bei so einer kurzen Code-Zeile LO ein Fehler ausspuckt, dann darfst Du dreimal Raten was bei komplexeren Makros geschehen kann?
Okay, in gewisser Hinsicht geht das folgende an deiner Frage vorbei. Aber um dir von vornherein viel Ärger zu ersparen, muss das so sein, geht nicht anders.
Das Du nun stellenweise versuchst deine VBA Makros "umzuprogrammieren" (und das mit dem Makrorecorder) ist wohl ganz gut und schön. Jedoch MUSST Du dir darüber im Klaren sein das einerseits Excel VBA in LO nur extrem begrenzt lauffähig sind, und anderseits der Makrorecorder halt überhaupt nicht das leistet wie der in Excel.
Ich weiss jetzt nicht wie das in aktuelleren LO Versionen (z.B. ab der 6er Reihe) aussieht, aber LO wird halt nicht vollständig mit VBA umgehen können. Und deshalb wird dir nix anderes übrig bleiben als alle deine VBA Makros komplett neu und richtig zu programmieren. Den Makrorecorder zu verwenden würde ich mir wirklich ersparen. Nicht nur das er nicht alles aufzeichnet, nein, auch der erstellte Code ist nicht immer wirklich eindeutig und fehlerfrei zu lesen und zu verstehen, und außerdem ist er stellenweise bedeutend länger als ein richtig programmierter Code. Es kann aber durchaus mal vorkommen, das er zur Unterstüzung hilfreich sein kann, aber das ist sehr selten der Fall.
Hier ist zumindest schon mal eine Anlaufstelle wo Du sehr viele und nützliche Infos beziehen kannst:
Dannenhöfer: StarBasic / OpenOffice.org Basic FAQ
In dem dortigen Inhaltsverzeichnis ist für dich der Punkt 7 von Interesse, da er sich mit Calc befasst.
Aber auch der Punkt 3 wird sehr schnell von großer Bedeutung für dich sein, da er sich mit dem Thema Variabelen befasst. Und vor allem wie sie deklariert und defeniert werden. Denn da unterscheiden sich beide Programmiersprachen von einander.
Gruß
balu
Re: VBA-Makro unter "Meine Makros" speichern
Verfasst: Do 2. Aug 2018, 15:56
von Ich Bins
Hallo balu,
zunächst mal vielen Dank für Deine ernüchternde Antwort.
Allein die Vorstellung alle mir wichtigen Makros mit meinen rudimentären Programmierkenntnissen neu programmieren zu müssen dämpft schon sehr meine Motivation mich mit LO zu befassen.
wenn schon bei so einer kurzen Code-Zeile LO ein Fehler ausspuckt, dann darfst Du dreimal Raten was bei komplexeren Makros geschehen kann?
Bei den Dateien die ich mir dem Makro anpassen möchte handelt es sich um *.csv Dateien.
In LO innerhalb der VBAProbe-Datei kann ich das VBA-Makro komplett incl. Funktionsaufruf ohne Fehlermeldung ausführen.
Im Fenster LibreOffice BasicMakros verwalten ist die Datei VBAProbe.ods gelistet darunter befindet sich der Ordner VBAProjekt, in dessen Modul das lauffähige VBA-Makro abgelegt ist.
Gibt es denn keine Möglichkeit dieses VBA-Makro aus der VBAProbe-Datei unter "Meine Makros" in ein Modul lauffähig zu integrieren, um damit die *csv Dateien anzupassen ?
Viele Grüße
ich Bins
Re: VBA-Makro unter "Meine Makros" speichern
Verfasst: Do 2. Aug 2018, 16:31
von balu
Hallo Ich Bins,
In LO innerhalb der VBAProbe-Datei kann ich das VBA-Makro komplett incl. Funktionsaufruf ohne Fehlermeldung ausführen.
Das glaube ich dir. Denn es gibt auch ein komplexeres Makro welches schon vor längerer Zeit für OpenOffice geschrieben wurde, das aber auch in Excel funktioniert. Das nur mal so als Nebeninfo.
Gibt es denn keine Möglichkeit dieses VBA-Makro aus der VBAProbe-Datei unter "Meine Makros" in ein Modul lauffähig zu integrieren, um damit die *csv Dateien anzupassen ?
Und hier kommt es zu einem Problem welches wohl mit der nicht vollständigen Kompatibilität beider Sprachen zu tun hat. Es ist mir nämlich nicht bekannt wie der Dokumentenaufruf in VBA geregelt sein muss, damit ein VBA Makro aus einem bestimmten Ordner auf das bestimmte Dokument zugreifen kann. In StarBasic, beziehungsweise in LibreBasic (oder wie auch immer es in LO heißt) kann man das z.B. in der verlinkten Seite nachschauen.
Es ist vielleicht möglich an dieser Stelle ein, ich sags mal so rum, "Zwitter-Makro" zu erstellen. Das heißt, der Dokumentanaufruf wird per StarBasic geregelt, und der Rest bleibt VBA. Doch dazu müssten wir hier schon das dementsprechende Makro zu Gesicht bekommen, am besten in einer Beispieldatei. Dann können wir weiter sehen.
Gruß
balu
Re: VBA-Makro unter "Meine Makros" speichern
Verfasst: Do 2. Aug 2018, 16:53
von Ich Bins
Hallo balu,
mit einer Original-Beispieldatei habe ich ein Problem, es handelt sich um Kontoauszugsdateien von meiner Bank.
Anfügen wollte ich eine anonymisierte csv-Beispieldatei ohne Makro. Leider ist csv und sogar txt beim Upload nicht erlaubt (kein Hinweis weshalb).
Als ich es jetzt mit zip probierte hat es gefunzt.
Bitteschön:
Viele Grüße
Ich Bins
Re: VBA-Makro unter "Meine Makros" speichern
Verfasst: Fr 3. Aug 2018, 10:28
von Ich Bins
Hallo miteinander,
entschuldigt bitte, dass ich Euch das unbereinigte Makro zugemutet hatte.
Nach dem ich damit in LO experimentierte bemerkte ich, dass darin noch jede Menge Unnötiges vorhanden war, das sich im Laufe der Jahre durch Mitschnitt-Anpassungen angesammelt hatte.
Meinen vorherigen Beitrag habe ich geändert, so dass nur noch das Verschieben, Löschen der Spalten und das Umbenennen der Spaltenköpfe beinhaltet ist. Der Funktionsaufruf ist noch vorhanden, der jedoch in LO, wie ich inzw. bemerkte, die Anzahl der Zeilen falsch liefert.
Viele Grüße
Ich Bins
Re: VBA-Makro unter "Meine Makros" speichern
Verfasst: So 5. Aug 2018, 14:20
von mikele
Hallo,
ich habe dein Makro mal "übersetzt" (siehe Dannenhoefer!). Ganz so kompliziert ist es nicht - taste dich Schritt für Schritt an die Sache 'ran.
Code: Alles auswählen
Sub cvs_bereinigen
'Zugriff auf das Dokument
oDocument = ThisComponent
'Zugriff auf das 1. Tabellenblatt
oSheet = oDocument.Sheets(0)
'Quell- und Zielspalten für Verschiebung
aQuelle=array("B","E","D","G","J","F","I")
aZiel=array("A","B","K","D","E","J","G")
'Kopieren
for i=0 to ubound(aQuelle)
oQuelleRange=oSheet.Columns.getByName(aQuelle(i))
oQuellRangeAddresse = oQuelleRange.getRangeAddress
oZiel = oSheet.Columns.getByName(aZiel(i)).getCellByPosition(0,0)
oZielCellAdresse=oZiel.getCellAddress
oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
next
'Spalten leeren
oSheet.Columns.getByName("F").ClearContents(1033)
oSheet.Columns.getByName("I").ClearContents(1033)
'neue Spaltenüberschriften
oSheet.getCellByPosition(3,0).string="Kontoinhaber"
oSheet.getCellByPosition(5,0).string="S-H"
oSheet.getCellByPosition(8,0).string="Saldo"
End Sub
Kopiere es in ->Meine Makros & Dialoge->Standard->Module1. Nun kannst du per ->Extras->Makros->Makros ausführen starten oder du legst dir das Makro auf eine eigene Schaltfläche (->Extras->Anpassen->Symbolleisten->Befehl hinzufügen->LibreOffice Makros).
Re: VBA-Makro unter "Meine Makros" speichern
Verfasst: So 5. Aug 2018, 18:55
von Ich Bins
Hallo mikele,
vielen herzlichen Dank für Deine Übersetzung bei dieser Hitze. Sieht sehr professionell aus.
Ganz im Gegenteil zu dem was ich im "Schweiße meiner Füße" zusammengepfriemelt habe.
Beide Varianten funzen bei der ods-Datei aber nicht bei der Original csv-Datei.
Code: Alles auswählen
Sub CSV_Formatieren
oDoc=ThisComponent
oSheet=oDoc.Sheets(0)
myColumn=oSheet.getColumns
rem Spalte Währung und löschen
myColumn.removeByIndex(9,2)
rem Spalte Auftragsgeber löschen
' myColumn.removeByIndex(0,1)
rem Stufe1
rem Spalte Buchungstext kopieren und einfügen
oQuelleRange=oSheet.getCellRangeByPosition(3,0,3,31999)
oQuellRangeAddresse = oQuelleRange.getRangeAddress
oZiel = oSheet.getCellByPosition(0,0)
oZielCellAdresse=oZiel.getCellAddress
oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
rem Spalte Buchungstext löschen
myColumn.removeByIndex(3,1)
rem Stufe2
rem Spalte Valutadatum kopieren und einfügen
oQuelleRange=oSheet.getCellRangeByPosition(2,0,2,31999)
oQuellRangeAddresse = oQuelleRange.getRangeAddress
oZiel = oSheet.getCellByPosition(8,0)
oZielCellAdresse=oZiel.getCellAddress
oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
rem Spalte Kontoinhaber kopieren und einfügen
oQuelleRange=oSheet.getCellRangeByPosition(4,0,4,31999)
oQuellRangeAddresse = oQuelleRange.getRangeAddress
oZiel = oSheet.getCellByPosition(2,0)
oZielCellAdresse=oZiel.getCellAddress
oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
rem Spalte Buchungstext löschen
myColumn.removeByIndex(4,1)
rem Stufe3
Rem Leere Spalte einfügen.
mycolumn.insertByIndex(7,1)
rem Spalte Verwendungszweck kopieren und einfügen
oQuelleRange=oSheet.getCellRangeByPosition(3,0,3,31999)
oQuellRangeAddresse = oQuelleRange.getRangeAddress
oZiel = oSheet.getCellByPosition(7,0)
oZielCellAdresse=oZiel.getCellAddress
oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
rem Spalte Betrag kopieren und einfügen
oQuelleRange=oSheet.getCellRangeByPosition(6,0,6,31999)
oQuellRangeAddresse = oQuelleRange.getRangeAddress
oZiel = oSheet.getCellByPosition(3,0)
oZielCellAdresse=oZiel.getCellAddress
oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
rem Spalte Betrag löschen
myColumn.removeByIndex(6,1)
rem Stufe4
Rem Leere Spalte einfügen.
mycolumn.insertByIndex(4,1)
rem Spalte BLZ kopieren und einfügen
oQuelleRange=oSheet.getCellRangeByPosition(6,0,6,31999)
oQuellRangeAddresse = oQuelleRange.getRangeAddress
oZiel = oSheet.getCellByPosition(4,0)
oZielCellAdresse=oZiel.getCellAddress
oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
rem Spalte BLZ löschen
myColumn.removeByIndex(6,1)
rem Stufe5
rem Spalte S-H einfügen
myColumn.insertByIndex(4,1)
rem Spalte Saldo einfügen
myColumn.insertByIndex(7,1)
mycell = oSheet.getCellByPosition(2,0)
mycell.string="Kontoinhaber"
mycell = oSheet.getCellByPosition(4,0)
mycell.string="S-H"
mycell = oSheet.getCellByPosition(7,0)
mycell.string="Saldo"
' myCell.CharWeight=com.sun.star.awt.FontWeight.BOLD
rem Spaltenüberschrift fett formatieren
oRange = oDoc.Sheets.getByIndex(0).getCellRangeByName("A1:K1")
oRange.CharWeight = com.sun.star.awt.FontWeight.BOLD
rem Spaltenbreite optimieren
oSheet.Columns(0).OptimalWidth = True
oSheet.Columns(1).OptimalWidth = True
oSheet.Columns(2).OptimalWidth = True
oSheet.Columns(3).OptimalWidth = True
oSheet.Columns(4).OptimalWidth = True
oSheet.Columns(5).OptimalWidth = True
oSheet.Columns(6).OptimalWidth = True
oSheet.Columns(7).OptimalWidth = True
oSheet.Columns(8).OptimalWidth = True
oSheet.Columns(9).OptimalWidth = True
oSheet.Columns(10).OptimalWidth = True
End Sub
Viele Grüße
Ich Bins
Re: VBA-Makro unter "Meine Makros" speichern
Verfasst: So 5. Aug 2018, 23:23
von mikele
Hallo,
Beide Varianten funzen bei der ods-Datei aber nicht bei der Original csv-Datei.
ich habe deine umsatz.ods mal als .csv gespeichert. Das Makro läuft bei der .csv anstandslos durch.
Was bedeutet "funzt nicht"? Fehlermeldung?
Re: VBA-Makro unter "Meine Makros" speichern
Verfasst: Mo 6. Aug 2018, 02:04
von Ich Bins
Hallo mikele,
bei meiner
kommt es bei der Zeile
Code: Alles auswählen
'Zugriff auf das 1. Tabellenblatt
oSheet = oDocument.Sheets(0)
zu einem BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: Sheets.
Weil ich mein gewünschtes Endergebnis nicht ausreichend beschrieben hatte, mea culpa, musste ich das Makro von Dir noch etwas anpassen.
Die Zeile
in nachfolgendem Code war unwirksam, ich nehme an, dass (1033) stellvertretend für nummerische Werte steht, weil der Befehl weiter unten Spalte "I" leert.
Code: Alles auswählen
Sub cvs_bereinigen
'Zugriff auf das Dokument
oDocument = ThisComponent
'Zugriff auf das 1. Tabellenblatt
oSheet = oDocument.Sheets(0)
'Quell- und Zielspalten für Verschiebung
aQuelle=array("D","C","F","I","E","H")
aZiel=array("A","L","C","D","K","F")
'Kopieren
for i=0 to ubound(aQuelle)
oQuelleRange=oSheet.Columns.getByName(aQuelle(i))
oQuellRangeAddresse = oQuelleRange.getRangeAddress
oZiel = oSheet.Columns.getByName(aZiel(i)).getCellByPosition(0,0)
oZielCellAdresse=oZiel.getCellAddress
oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
next
'Spalten leeren
oSheet.Columns.getByName("E").ClearContents(1033)
rem Spalte E löschen weil Zeile zuvor unwirksam
myColumn=oSheet.getColumns
myColumn.removeByIndex(4,1)
Rem Leere Spalte einfügen.
mycolumn.insertByIndex(4,1)
oSheet.Columns.getByName("I").ClearContents(1033)
rem Spalte BLZ und Währung löschen
myColumn.removeByIndex(7,1)
myColumn.removeByIndex(8,1)
'neue Spaltenüberschriften
oSheet.getCellByPosition(2,0).string="Kontoinhaber"
oSheet.getCellByPosition(4,0).string="S-H"
oSheet.getCellByPosition(7,0).string="Saldo"
rem Spaltenüberschrift fett formatieren
oRange = oDocument.Sheets.getByIndex(0).getCellRangeByName("A1:J1")
oRange.CharWeight = com.sun.star.awt.FontWeight.BOLD
rem Spaltenbreite optimieren
oSheet.Columns(0).OptimalWidth = True
oSheet.Columns(1).OptimalWidth = True
oSheet.Columns(2).OptimalWidth = True
oSheet.Columns(3).OptimalWidth = True
oSheet.Columns(4).OptimalWidth = True
oSheet.Columns(5).OptimalWidth = True
oSheet.Columns(6).OptimalWidth = True
oSheet.Columns(7).OptimalWidth = True
oSheet.Columns(8).OptimalWidth = True
oSheet.Columns(9).OptimalWidth = True
End Sub