BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

VBA-Makro unter "Meine Makros" speichern [GELÖST]

Alles zur Programmierung im LibreOffice.
Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

VBA-Makro unter "Meine Makros" speichern [GELÖST]

Beitrag von Ich Bins » Do 2. Aug 2018, 13:26

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

Code: Alles auswählen

Colums("K:K).Select
mit dem Basic-Laufzeitfehler '35' seinen Dienst.

Viele Grüße
Ich Bins
Zuletzt geändert von Ich Bins am Fr 17. Aug 2018, 22:24, insgesamt 1-mal geändert.

balu
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von balu » Do 2. Aug 2018, 14:31

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

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Do 2. Aug 2018, 15:56

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

balu
Beiträge: 370
Registriert: Mi 1. Jun 2011, 16:21

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von balu » Do 2. Aug 2018, 16:31

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

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Do 2. Aug 2018, 16:53

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:
umsatz.zip
(12.87 KiB) 209-mal heruntergeladen
Viele Grüße
Ich Bins

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Fr 3. Aug 2018, 10:28

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

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » So 5. Aug 2018, 14:20

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).
Gruß,
mikele

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » So 5. Aug 2018, 18:55

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

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von mikele » So 5. Aug 2018, 23:23

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?
Gruß,
mikele

Ich Bins
Beiträge: 236
Registriert: Do 2. Aug 2018, 12:30

Re: VBA-Makro unter "Meine Makros" speichern

Beitrag von Ich Bins » Mo 6. Aug 2018, 02:04

Hallo mikele,

bei meiner
umsatz-csv.zip
(401 Bytes) 190-mal heruntergeladen
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

Code: Alles auswählen

	oSheet.Columns.getByName("E").ClearContents(1033)
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

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten