Seite 1 von 1

Makros zusammensetzen

Verfasst: Di 25. Nov 2025, 21:06
von menhir
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

Re: Makros zusammensetzen

Verfasst: Mi 26. Nov 2025, 11:10
von mikele
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? ...)

Re: Makros zusammensetzen

Verfasst: Fr 28. Nov 2025, 12:20
von menhir
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...

Re: Makros zusammensetzen

Verfasst: Fr 28. Nov 2025, 17:41
von mikele
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.

Re: Makros zusammensetzen

Verfasst: Sa 29. Nov 2025, 12:20
von mikele
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

Re: Makros zusammensetzen

Verfasst: Mo 1. Dez 2025, 16:41
von menhir
Besten Dank Mikele
Bin des Programmierens nicht mächtig...
Immer wieder Laufzeitfehler mit Hinweisen.

Für mich reichen die einzelnen Makros. :cry:

Re: Makros zusammensetzen

Verfasst: Di 2. Dez 2025, 12:00
von mikele
Hallo,
in meine letzten Post war ein Fehler im Code :oops:

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(aTabellen, 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
Unabhängig davon, dass du eine Lösung für dich gefunden hast (was völlig ok ist), würden mich die Fehlermeldungen doch interessieren. Ein typischer Fehler wäre, wenn das Verzeichnis, das im Code angesprochen wird, nicht existiert oder die Datei noch keinen Namen hat.