❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️

❤️ HELFEN SIE JETZT >> << HELFEN SIE JETZT ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗


Makros zusammensetzen

Alles zur Programmierung im LibreOffice.
Antworten
menhir
Beiträge: 6
Registriert: So 23. Nov 2025, 10:10

Makros zusammensetzen

Beitrag von menhir » Di 25. Nov 2025, 21:06

Mein Dokument enthält 13 Sheets.
1. Jedes Sheet enthält ein Makro welches das Blatt drucken oder als PDF speichern soll. Das klappt auch. Aber: Zuletzt kommt immer noch das Fenster mit den Druckereinstellungen. Geht es nicht auch ohne?

2. Ich möchte aus mehreren Sheets ein zusammenhängendes PDF abspeichern können. Kann ich einzelne Makros so zusammenhängen dass dies funktioniert?

3. Ein Sheet soll mehrere Druckbefehle für andere Sheets enthalten. Das heisst, das Sheet hat mehrere Tasten, welche den Druck anderer Sheets auslösen sollen.

Besten Dank für zielführende Bemerkungen

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

Re: Makros zusammensetzen

Beitrag von mikele » Mi 26. Nov 2025, 11:10

Hallo,
die kurze Antwort: ja, das ist möglich.
Die spannende Frage ist, wo man ansetzen soll. Dazu wäre es sinnvoll erfahren
a) wie dein aktuelles Makro ausssieht
b) wie Nr. 2 und Nr. 3 konkret bedeuten (Welche Tabellen? Frei wählbar? ...)
Gruß,
mikele

menhir
Beiträge: 6
Registriert: So 23. Nov 2025, 10:10

Re: Makros zusammensetzen

Beitrag von menhir » Fr 28. Nov 2025, 12:20

mikele hat geschrieben:
Mi 26. Nov 2025, 11:10
Hallo,
die kurze Antwort: ja, das ist möglich.
Die spannende Frage ist, wo man ansetzen soll. Dazu wäre es sinnvoll erfahren
a) wie dein aktuelles Makro ausssieht
b) wie Nr. 2 und Nr. 3 konkret bedeuten (Welche Tabellen? Frei wählbar? ...)
Das Dokument enthält insgesamt 13 Sheets.
Whg01 bis Whg09 sind einzelne Sheets mit je einem Makro zum exportieren als pdf.
So sieht das einzelne Makro aus:

REM ***** BASIC *****

sub Whg01
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$1:$T$40"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(3) as new com.sun.star.beans.PropertyValue
args2(0).Name = "URL"
args2(0).Value = "file:///Users/danielherrmann/Desktop/Whg01.pdf"
args2(1).Name = "FilterName"
args2(1).Value = "calc_pdf_Export"
args2(2).Name = "FilterData"
args2(2).Value = Array(Array("UseLosslessCompression",.........
args2(3).Name = "SelectionOnly"
args2(3).Value = false

dispatcher.executeDispatch(document, ".uno:ExportTo", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$A$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())


end sub

Makro ENDE

Nun möchte ich eben die 9 (eigentlich gleichen) Makros zusammenhängen.
Ich müsste also in jedem Makroteil das entsprechende Sheet aufrufen können...

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

Re: Makros zusammensetzen

Beitrag von mikele » Fr 28. Nov 2025, 17:41

Hallo,
um die aktuelle Tabelle (mit ihrem Namen) als pdf zu exportieren genügt folgendes Makro:

Code: Alles auswählen

sub pdf_aktuelle_Tabelle
	oDoc=ThisComponent
	oTab=oDoc.CurrentController.ActiveSheet
	sName=oTab.Name
	Dim arg(2) as new com.sun.star.beans.PropertyValue
	arg(0).Name = "URL"	
	arg(0).Value = "file:///Users/danielherrmann/Desktop/" & sName & ".pdf"
	arg(1).Name = "FilterName"
	arg(1).Value = "calc_pdf_Export"
	dim aFilterData(0) as new com.sun.star.beans.PropertyValue
	aFilterData(0).Name = "Selection"
	aFilterData(0).Value = oTab
	arg(2).Name = "FilterData"
	arg(2).Value = aFilterData()
	ThisComponent.storeToUrl(arg(0).value,arg())
end sub
Dieses kannst du an jede Schaltfläche auf den 9 Tabellen binden.
Um jetzt mehrere Tabellen als ein pdf zu exportieren, müssen deren Zellbereich gesammelt werden (mit ein paar Kommentaren versehen):

Code: Alles auswählen

sub pdf_einzelne_Tabellen
	odoc=thiscomponent
	sVerzeichnis="C:\Users\danielherrmann\Desktop\"
	sDateiname="wohnungen.pdf"
	'Container für Mehrfachbereiche erstellen
	obereiche = odoc.createInstance("com.sun.star.sheet.SheetCellRanges")
	'Tabellennamen der zu exportierenden Tabellen, beliebig zu erweitern
	aTabellen=array("Whg01", "Whg02")
	for i=0 to ubound(aTabellen)
		oTab=odoc.sheets.getbyname(aTabellen(i))
		'Sind Druckbereiche definiert? Wenn ja, diese nehmen, ansonsten die ganze Tabelle
		aDruckbereiche=oTab.printareas
		if ubound(aDruckbereiche)<0 then
			obereiche.addRangeAddress(oTab.getRangeAddress, 0)	'ganze Tabelle
		else
			for k=0 to ubound(aDruckbereiche)
				obereiche.addRangeAddress(aDruckbereiche(k), 0)
			next
		end if
	next		
	'Argumente festlegen
	Dim arg(2) as new com.sun.star.beans.PropertyValue
	arg(0).Name = "URL"	
	'vollständigen Dateiname, konvertiert URL-Format 
	arg(0).Value = convertToUrl(sVerzeichnis & sDateiname)
	arg(1).Name = "FilterName"
	arg(1).Value = "calc_pdf_Export"
	dim aFilterData(0) as new com.sun.star.beans.PropertyValue
	aFilterData(0).Name = "Selection"
	aFilterData(0).Value = obereiche
	arg(2).Name = "FilterData"
	arg(2).Value = aFilterData()

	'Datei schreiben
	odoc.storetoUrl(arg(0).value,arg())
	
end sub
Probier' mal, ob es so läuft.
Gruß,
mikele

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

Re: Makros zusammensetzen

Beitrag von mikele » Sa 29. Nov 2025, 12:20

Hallo,
das Ganze noch etwas komprimierter:

Code: Alles auswählen

sub aktuelle_tabelle
	oDoc=ThisComponent
	oTab=oDoc.CurrentController.ActiveSheet
	sPfad="file:///Users/danielherrmann/Desktop/"
	sDateiname=oTab.Name & ".pdf"
	pdf_export_Tabellen(,sPfad,sDateiname)
end sub

sub mehrere_tabellen
	sPfad="file:///Users/danielherrmann/Desktop/"
	sDateiname="tabellen.pdf"
	aTabellen=Array("Tabelle1","Tabelle3")
	pdf_export_Tabellen(Array(oTab.Name), sPfad, sDateiname)
end sub


function pdf_export_Tabellen(optional aTabellen, optional sPfad, optional sDateiname)
	'aTabellen ... Array der Tabellennamen, Standard: aktuelle Tabelle
	'sPfad ... String des Dateipfades (inkl. letzten Trennzeichen), Standard: Verzeichnis des aktuellen Dokuments
	'sDateiname ... String des Dateinamens (inkl. .pdf), Standard: aktueller Dateiname.pdf
	odoc=thiscomponent
	if isMissing(aTabellen) then
		oTab=oDoc.CurrentController.ActiveSheet
		aTabellen=Array(oTab.Name)
	end if
	akt_url=split(oDoc.Url,"/")
	akt_Name=akt_url(uBound(akt_url))
	akt_url(uBound(akt_url))=""
	if isMissing(sPfad) then
		sPfad=join(akt_url,"/")
	end if
	if isMissing(sDateiname) then
		sDateiname=left(akt_Name,len(akt_Name)-4) & ".pdf"
	end if 
	'Container für Mehrfachbereiche erstellen
	obereiche = odoc.createInstance("com.sun.star.sheet.SheetCellRanges")
	for i=0 to ubound(aTabellen)
		oTab=odoc.sheets.getbyname(aTabellen(i))
		aDruckbereiche=oTab.printareas
		if ubound(aDruckbereiche)<0 then
			obereiche.addRangeAddress(oTab.getRangeAddress, 0)	'ganze Tabelle
		else
			for k=0 to ubound(aDruckbereiche)
				obereiche.addRangeAddress(aDruckbereiche(k), 0)
			next
		end if
	next		
	'der eigentliche pdf-Export
	'
	'Argumente festlegen
	Dim arg(2) as new com.sun.star.beans.PropertyValue
	arg(0).Name = "URL"	
	arg(0).Value = convertToUrl(sPfad & sDateiname)
	arg(1).Name = "FilterName"
	arg(1).Value = "calc_pdf_Export"
	dim aFilterData(0) as new com.sun.star.beans.PropertyValue
	aFilterData(0).Name = "Selection"
	aFilterData(0).Value = obereiche
	arg(2).Name = "FilterData"
	arg(2).Value = aFilterData()

	'Datei schreiben
	odoc.storetoUrl(arg(0).value,arg())
	
end function
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