🍀 Bitte helfen Sie mit, das LibreOffice Forum zu erhalten. 🍀

❤️ DANKE >> << DANKE ❤️

Unterstützen Sie noch heute unsere Spendenkampagne für 2026.
>> Das LibreOffice-Forum lebt von Ihnen – und von vielen Experten, die freiwillig und kostenlos ihr Wissen teilen.<<
Ihre Spende hilft, die Community offen, werbefrei (bei Registrierung) und lebendig zu halten. Vielen lieben Dank!
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

Makro - Neue Tabelle wenn...

Alles zur Programmierung im LibreOffice.
Antworten
Friedel
Beiträge: 32
Registriert: Di 10. Sep 2019, 16:20

Makro - Neue Tabelle wenn...

Beitrag von Friedel » Sa 31. Jan 2026, 19:52

Hallo

Ich habe seit langem ein Problem, zu dem keine Lösung finde. Vielleicht kann hier jemand helfen. Die Suchfunktion hier hilft leider nicht.
Die folgenden Wörter deiner Suchanfrage wurden ignoriert, da sie zu häufig vorkommen: neue Tabelle.
Wenn "neue Tabelle" nicht Bestandteil des Suchbegriffs ist, ist die Suche sinnlos.

Alles, was ich im folgenden beschreibe, ist im selbem Tabellendokument.

Ich habe eine Tabelle namens "Kassenbuch" und eine weitere namens "Ausz." (und einige weitere Tabellen, die hier nicht relevant sind). In der Tabelle "Ausz." stehen Dateinamen, unter denen Kontoauszüge abgelegt sind. Das Namensschema ist JJJJ-MM-DD_Kontoauszug.pdf. Zum Beispiel also "2025-09-30_Kontoauszug.pdf". In der Tabelle "Kassenbuch" gibt es eine Spalte, in die wird zu jeder Buchung der Dateiname des Kontoauszugs eingetragen, in dem die Buchung zu finden ist.

Immer wenn so eine Eintragung gemacht wird, soll geprüft werden, ob die Eintragung dem Namensschema entspricht. Falls ja, soll geprüft werden, ob der Wert irgendwo in der Tabelle "Ausz." steht. Wenn er dort enthalten ist, soll nichts passieren. Wenn nicht, soll er dort in die nächste leere Zelle der ersten Spalte eingetragen werden und (im Beispiel von oben) eine neue Tabelle namens "Ausz. 2025-09-30" angelegt werden.

Es würde mir sehr helfen, wenn mir jemand helfen könnte. Ohne Hilfe komme ich nicht weiter, obwohl ich in den letzten 2 Jahren mehrere Hundert Stunden mit Recherchen und Versuchen zu dem Thema verbracht habe.

mikele
* LO-Experte *
Beiträge: 2011
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro - Neue Tabelle wenn...

Beitrag von mikele » Sa 31. Jan 2026, 21:20

Hallo,
na denn mal so auf die Schnelle ...

Code: Alles auswählen

Sub pruefen(oevent)
	'Zugrifff auf Dokument
	oDoc=ThisComponent
	'ausgelöst durch eine einzelne Zelle?
	if oevent.supportsService("com.sun.star.sheet.SheetCell") then
		'Auslesen des Zellinhalt, der ggf. eine Formel sein kann
		sText=oevent.FormulaLocal
		'in Spalte D und keine leere Zelle
		if oevent.CellAddress.Column=3 and sText<>"" then
			'Musterprüfung 2025-09-30_Kontoauszug.pdf
			tmp1=split(sText,"_")
			tmp2=split(tmp1(0),"-")
			fehler=0
			if ubound(tmp1)=0 or ubound(tmp2)<2 then
				fehler=1
			else
				if tmp1(1)<>"Kontoauszug.pdf" then
					fehler=1
				end if
				if not isdate(tmp1(0)) then
					fehler=1
				end if
				
			end	if 
			if fehler then		
				msgbox "fehlerhafte EIngabe" & chr(10) & sText
				oevent.clearContents(1+2+4+16)
			else
				'Vergleich mit vorhandenen Einträgen
				oTab=oDoc.Sheets.getByName("Ausz.")
				'ab erster Zeile suchen
				z=0
				eintrag=oTab.getCellByPosition(0,z).String
				do while eintrag<>"" and eintrag<>sText
					z=z+1
					eintrag=oTab.getCellByPosition(0,z).String
				loop
				'Eintrag noch nicht vorhanden?
				if eintrag="" then
					oTab.getCellByPosition(0,z).String=sText
					oDoc.Sheets.insertNewByName("Ausz. " & tmp1(0),oDoc.Sheets.Count)
				end if
			end if
		end if
	end if
End Sub
Diese Makro muss an das Ereignis "Inhalt geändert" der Tabelle "Kassenbuch" geknüpft werden.
Es überprüft die Eingaben in der Spalte D (oevent.CellAddress.Column=3). Das müsste entsprechend angepasst werden.
Dann wird in der Tabelle "Ausz." nach dem Eintrag gesucht und ggf. ergänzt.
Es kann sein, dass die Formatprüfung noch nicht 100%ig sicher ist. Probier' mal.
Gruß,
mikele

Friedel
Beiträge: 32
Registriert: Di 10. Sep 2019, 16:20

Re: Makro - Neue Tabelle wenn...

Beitrag von Friedel » Sa 31. Jan 2026, 23:25

Hallo
Das ist ja schnell gegangen. Und dank deiner guten Einrückungen konnte sogar ich bei fast allem erkennen, worum es geht. Ein wenig musste ich noch Googeln, aber fast alles im eigentlichen Makro habe ich verstanden. Allerdings reicht das nicht, dass ich damit was anfangen kann. Aber der Reihe nach.
mikele hat geschrieben:
Sa 31. Jan 2026, 21:20

Code: Alles auswählen

Sub pruefen(oevent)
	'Zugrifff auf Dokument
	oDoc=ThisComponent
	'ausgelöst durch eine einzelne Zelle?
	if oevent.supportsService("com.sun.star.sheet.SheetCell") then
  • Diesen Teil habe ich nicht verstanden. Woher kommt oevent?
  • "ausgelöst durch eine einzelne Zelle?" ist ein Kommentar, der mich verwirrt. Was soll er bedeuten? Vielleicht klärt sich das, wenn ich zum Schluss komme.
  • Wer oder was ist "com.sun.star.sheet.SheetCell"?
mikele hat geschrieben:
Sa 31. Jan 2026, 21:20

Code: Alles auswählen

		'Auslesen des Zellinhalt, der ggf. eine Formel sein kann
		sText=oevent.FormulaLocal
		'in Spalte D und keine leere Zelle
		if oevent.CellAddress.Column=3 and sText<>"" then
			'Musterprüfung 2025-09-30_Kontoauszug.pdf
			tmp1=split(sText,"_")
			tmp2=split(tmp1(0),"-")
			fehler=0
			if ubound(tmp1)=0 or ubound(tmp2)<2 then
				fehler=1
			else
				if tmp1(1)<>"Kontoauszug.pdf" then
					fehler=1
				end if
  • Bei mir geht es um die Spalte I ab Zeile 2. (In Zeile 1 ist die Spaltenüberschrift.) Spalte I bedeutet dann oevent.CellAddress.Column=8? Aber wie schließe ich die erste Zeile aus?
  • Das mit FormulaLocal ist mir hier unklar.
  • Das Datum muss nicht mindestens 3 Teile haben, sondern genau 3 Teile. Außerdem muss tmp2(0) 4-stellig und tmp2(1) und tmp2(2) 2-stellig sein. Aber das soll ich selbst hinkriegen.
mikele hat geschrieben:
Sa 31. Jan 2026, 21:20

Code: Alles auswählen

				if not isdate(tmp1(0)) then
					fehler=1
				end if
				
			end	if 
  • Mit isdate(tmp1(0)) sollte ich prüfen, ob das ein Datum ist und zwischen 2023-01-01 und dem aktuellen Datum liegt. (Das Firmenkonnto gibt erst seit 2023, ein Kontoauszug kann nicht ein Datum aus der Zukunft haben.) Die Idee gefällt mir.
mikele hat geschrieben:
Sa 31. Jan 2026, 21:20

Code: Alles auswählen

			if fehler then		
				msgbox "fehlerhafte EIngabe" & chr(10) & sText
				oevent.clearContents(1+2+4+16)
  • Ich möchte nicht, dass der Zellinhalt durch das Makro gelöscht wird. Ob das Format passt, ist durch bedingte Formatierung klar erkennbar.
mikele hat geschrieben:
Sa 31. Jan 2026, 21:20

Code: Alles auswählen

			else
				'Vergleich mit vorhandenen Einträgen
				oTab=oDoc.Sheets.getByName("Ausz.")
				'ab erster Zeile suchen
				z=0
				eintrag=oTab.getCellByPosition(0,z).String
				do while eintrag<>"" and eintrag<>sText
					z=z+1
					eintrag=oTab.getCellByPosition(0,z).String
				loop
				'Eintrag noch nicht vorhanden?
				if eintrag="" then
					oTab.getCellByPosition(0,z).String=sText
					oDoc.Sheets.insertNewByName("Ausz. " & tmp1(0),oDoc.Sheets.Count)
				end if
			end if
		end if
	end if
End Sub
Diese Makro muss an das Ereignis "Inhalt geändert" der Tabelle "Kassenbuch" geknüpft werden.
Es überprüft die Eingaben in der Spalte D (oevent.CellAddress.Column=3). Das müsste entsprechend angepasst werden.
Dann wird in der Tabelle "Ausz." nach dem Eintrag gesucht und ggf. ergänzt.
Es kann sein, dass die Formatprüfung noch nicht 100%ig sicher ist. Probier' mal.
"Diese(s) Makro muss an das Ereignis "Inhalt geändert" der Tabelle "Kassenbuch" geknüpft werden." Was bedeutet diese Zeichenkette? Meine Tabelle "Kassenbuch" hat Ereignisse? Was soll ich mir darunter vorstellen? Wie hängt man da ein Makro dran?

Uff! Anfangs war ich ganz zufrieden mit mir, dass ich halbwegs nachvollziehen konnte, was du da beschreibst. Aber dass mir jetzt jeder Ansatz fehlt, wie ich damit etwas anfangen kann, gibt mir zu denken. Und der wahrscheinlich schwierigste Teil wurde noch gar nicht berührt. Zur Frage wie durch ein Makro eine neue Tabellen anlegt (und dann befüllt) werden kann, habe ich in der ganzen Vorgeschichte vor meiner Frage nämlich gar nichts brauchbares gefunden. Aber interessiert wohl frühestens im nächsten Schritt.

mikele
* LO-Experte *
Beiträge: 2011
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro - Neue Tabelle wenn...

Beitrag von mikele » So 1. Feb 2026, 00:08

Hallo,
da du Hilfe bei einem Makro suchst, bin ich davon ausgegangen, dass die Grundlagen dazu klar sind.
Gut, gehen wir einen Schritt zurück.
Dein Ziel ist, dass bei/nach einer Eingabe in einer Zelle etwas passiert und zwar, dass en Makro ausgeführt wird. Mit anderen Worten, durch dieses Ereignis soll ein Makro gestartet werden.
Wenn du mit der rechten Maustaste mal auf den Tabellenreiter der Tabelle "Kassenbuch" klickst, findest du den Eintrag Ereignisse... Nach Klick darauf kannst du auf das Ereignis "Inhalt geändert" gehen (ganz unten) und dann mit Klick auf die Schaltfläche "Makro" das Makro auswählen, dass bei diesem Ereignis gestartet wird. Das Makro muss dazu in der Datei bereits existieren.
Dann zum eigentlichen Makro:
1) Da das Makro durch ein Ereignis ausgelöst und gestartet wird, bekommt es einen Paramter mit auf den Weg, den ich (als Variable) oevent genannt habe. Es ist die Zelle (oder der Zellbereich), die geändert wurde.
2) Als erstes prüfe ich, ob eine einzelne Zelle das Ereignis ausgelöst hat. Nur diese (sie ist programmiertechnisch ein Objekt) unterstützt den Service com.sun.star.sheet.SheetCell (wenn es mehrere Zellen wären, würde dieser Service nicht unterstützt sondern com.sun.star.sheet.SheetCellRange).
3) Um sicherzustellen, dass auch die Eingabe einer Formel geprüft wird, lese ich die Eigenschaft .FormulaLocal der Zelle aus. Sie zeigt mir den Text, die Zahl oder auch die Formel an.
4) Die Zählung der Spalten beginnt bei Null, also hat die Spalte D die Nummer 3. Spalte I ist dann die Nummer 8 - korrekt. Um erst ab Zeile 2 zu beginnen, muss eine Bedingung her:

Code: Alles auswählen

if oevent.CellAddress.Column=3 and oevent.CellAddress.Row>0 and sText<>"" then
5) Die Prüfung des Formats kann auf verschiedene Arten passieren. Eine Variante wäre, den String Zeichen für Zeichen für Zeichen durchzugehen.
Mein Ansatz
tmp1=split(sText,"_") zerlegt den String bei jedem _ (und dann müssten zwei Teile entstehen; Zählung beginnt wieder bei Null)
tmp2=split(tmp1(0),"-") zerlegt den ersten Teil bei jedem - (und dann müssten 3 Teile entstehen)
Besser wäre die nächste Zeile so zu formulieren:

Code: Alles auswählen

if ubound(tmp1)<>1 or ubound(tmp2)<>2 then
Wenn dass alles erfüllt ist, kann es an die Details gehen:
isdate(tmp1(0)) prüft, ob es überhaupt ein Datum ist (dann spart man sich die Details, allerdings hast du Recht, das eine Datumsangabe 2025-1-9 als korrekt erkannt würde). Da muss also noch nachgearbeitet werden.
6) Wenn die fehlerhafte Eingabe nicht gelöscht werden soll, dann entferne die Codezeile.
7) Im letzten Teil wird, wenn die Eingabe korrekt war, ggf. die Tabelle "Ausz." befüllt und eine neue Tabelle eingefügt.
Zur Frage wie durch ein Makro eine neue Tabellen anlegt
ist erledigt.
(und dann befüllt)
nun wird es spannend, was da noch kommt bzw. was das eigentliche Problem ist.
Anbei mal meine "Spieldatei".
Dateianhänge
makro_zellprüfung_neueTabelle.ods
(15.3 KiB) 488-mal heruntergeladen
Gruß,
mikele

mikele
* LO-Experte *
Beiträge: 2011
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro - Neue Tabelle wenn...

Beitrag von mikele » So 1. Feb 2026, 11:50

Hallo,
einfacher wäre es, die Sache umzudrehen: Anstatt einen vollständigen Dateinamen einzugeben und dann aufwändig zu prüfen, ist es komfortabler, nur ein Datum einzugeben. Per Makro wird daraus (wenn es Datum war) der Dateiname generiert und fertig.

Code: Alles auswählen

Sub pruefen2(oevent)
	'Zugrifff auf Dokument
	oDoc=ThisComponent
	'ausgelöst durch eine einzelne Zelle?
	if oevent.supportsService("com.sun.star.sheet.SheetCell") then
		'Auslesen des Zellinhalt, der ggf. eine Formel sein kann
		sText=oevent.FormulaLocal
		'in Spalte I, ab Zeile 2 und keine leere Zelle
		if oevent.CellAddress.Column=8 and oevent.CellAddress.Row>0 and sText<>"" then
			'nach Datumseingabe Dateiname erzeugen nach Muster 2025-09-30_Kontoauszug.pdf
			if not isdate(sText) then 'fehlerhafte Eingabe wird mit Meldung zurückgewiesen
				msgbox "fehlerhafte EIngabe" & chr(10) & sText
				oevent.clearContents(1+2+4+16)
			else 'korrekten Dateinamen setzen
				datum=format(cdate(sText),"yyyy-mm-dd")
				auszug=datum & "_Kontoauszug.pdf"
				oevent.String=auszug
				'Vergleich mit vorhandenen Einträgen
				oTab=oDoc.Sheets.getByName("Ausz.")
				'ab erster Zeile suchen
				z=0
				eintrag=oTab.getCellByPosition(0,z).String
				do while eintrag<>"" and eintrag<>auszug
					z=z+1
					eintrag=oTab.getCellByPosition(0,z).String
				loop
				'Eintrag noch nicht vorhanden?
				if eintrag="" then
					oTab.getCellByPosition(0,z).String=auszug
					oDoc.Sheets.insertNewByName("Ausz. " & datum,oDoc.Sheets.Count)
				end if
			end if
		end if
	end if
End Sub
Gruß,
mikele

Friedel
Beiträge: 32
Registriert: Di 10. Sep 2019, 16:20

Re: Makro - Neue Tabelle wenn...

Beitrag von Friedel » So 1. Feb 2026, 17:09

Hallo

Danke erst mal für die ausführliche Hilfe. Gestern hatte ich Zeit, weil ich mir im Krankenhaus eine Influenza-A-Infektion zugezogen habe und deshalb isoliert bin. Aber heute fühle ich mich auch, wie jemand mit Influenza A (Fieber, Husten, Schnupfen, Kopfschmerzen, Gliederschmerzen, müde, unkonzentriert, schlapp...). Ich mache eine Pause, bis ich mich etwas besser fühle.
mikele hat geschrieben:
So 1. Feb 2026, 11:50
Hallo,
einfacher wäre es, die Sache umzudrehen: Anstatt einen vollständigen Dateinamen einzugeben und dann aufwändig zu prüfen, ist es komfortabler, nur ein Datum einzugeben. Per Makro wird daraus (wenn es Datum war) der Dateiname generiert und fertig.
Gute Idee. Vielleicht mache ich das auch noch. Aber eigentlich ist es unnötig. Der Eintrag wird nicht eingetippt. Das ist der Dateiname des Kontoauszugs und er wird mit Copy&paste eingetragen. Aber jetzt versuche ich noch ein paar Stunden zu schlafen. Danach teste ich erst mal deine Tabelle.

Friedel
Beiträge: 32
Registriert: Di 10. Sep 2019, 16:20

Re: Makro - Neue Tabelle wenn...

Beitrag von Friedel » Mi 4. Feb 2026, 22:55

mikele hat geschrieben:
So 1. Feb 2026, 00:08
Hallo,
da du Hilfe bei einem Makro suchst, bin ich davon ausgegangen, dass die Grundlagen dazu klar sind.
Ich mache das gerade zum ersten Mal.
mikele hat geschrieben:
So 1. Feb 2026, 00:08
Wenn du mit der rechten Maustaste mal auf den Tabellenreiter der Tabelle "Kassenbuch" klickst, findest du den Eintrag Ereignisse... Nach Klick darauf kannst du auf das Ereignis "Inhalt geändert" gehen (ganz unten) und dann ...
Danke. An der Stelle hätte ich das nie vermutet.
mikele hat geschrieben:
So 1. Feb 2026, 00:08
... mit Klick auf die Schaltfläche "Makro" das Makro auswählen, dass bei diesem Ereignis gestartet wird. Das Makro muss dazu in der Datei bereits existieren.
Das war noch ein Problem, das ich inzwischen aber selbst lösen konnte.

Beim Testen deiner Datei gab es erst mal einen herben Rückschlag. Vorher dachte, ich wäre fast so weit, dass ich anfangen könnte. Dann dachte ich, dass es noch ein verdammt weiter Weg sein muss. Als erstes kam ein Warnhinweis, dass die Datei Makros enthält und dass die aus Sicherheitsgründen deaktiviert sind. Trotzdem war in der Datei alles drin, was das Makro hätte erzeugen sollen. Mit einigen Test konnte ich feststellen, dass das Makro trotz anderslautender Meldung aktiv ist und auch ausgeführt wird.
mikele hat geschrieben:
So 1. Feb 2026, 00:08
Zur Frage wie durch ein Makro eine neue Tabellen anlegt
ist erledigt.
Darüber wurde zwar bisher nicht gesprochen, deshalb war deinen "ist erledigt" für mich verwirrend, aber in deiner Datei gibt es die Zeile

Code: Alles auswählen

oDoc.Sheets.insertNewByName("Ausz. " & datum,oDoc.Sheets.Count)
, die das wohl macht. Ich glaube, das habe ich kapiert.
mikele hat geschrieben:
So 1. Feb 2026, 00:08
nun wird es spannend, was da noch kommt bzw. was das eigentliche Problem ist.
Anbei mal meine "Spieldatei".
Danke für die Datei. Sie war und ist mir eine große Hilfe. Ich vermute, das zweite Makro (oder das zweite Modul?) namens test nicht benutzt wird. Ich habe jetzt erst mal viel zum Basteln. Bestimmt kommen noch weitere Fragen, aber der Anfang ist gemacht.

mikele
* LO-Experte *
Beiträge: 2011
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro - Neue Tabelle wenn...

Beitrag von mikele » Sa 7. Feb 2026, 13:41

Hallo,
Als erstes kam ein Warnhinweis, dass die Datei Makros enthält und dass die aus Sicherheitsgründen deaktiviert sind.
Dazu kannst du unter
-> Extras->Optionen->LibreOffice->Sicherheit->Makrosicherheit
die Option "Mittel" wählen. Dann wirst du beim Öffnen gefragt, ob die Makros aktiviert werden sollen.
In dem Makro test habe ich mich vergewissert und ausgetest, wie die Funktionen mit bestimmten Datumsangaben umgehen.
die das wohl macht
So war mein Plan ;)
Gruß,
mikele


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten