BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das OpenOffice 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 OpenOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als OO-SUPPORTER gekennzeichnet. 🤗

Calc-Makro Bastelhilfe

Alles zur Programmierung im OpenOffice.org
Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » Sa 3. Sep 2022, 15:34

Hallo nochmal,

und wieder brauche ich etwas Hilfe bei einem Makro, bzw. bei zweien

In der gleichen Tabelle (nochmals angehängt, da ich den anderen Anhang gelöscht hatte und wieder nur ein Teil der riesigen Gesamttabelle) hätte ich gern ein Makro, dass nur die genutzten Seiten druckt.

Ja, diese Frage ist nicht neu, aber alles was ich finde, bezieht sich auf einen variablen Druckbereich von einem Blatt. In meinem Fall ist der Druckbereich immer der Gleiche (auf jedem Tabellenblatt der doppelt eingerahmte Bereich), aber diese ganze Seite soll halt abhängig vom Inhalt gedruckt werden oder eben nicht.

Der Einfachheit halber würde es mir reichen, wenn eine Seite gedruckt wird, die wahlweise in der Ecke oben links eine 1 stehen hat oder die in einem speziellen Feld mit Seitenzahl ausgewiesen ist (im Falle der angehängten Datei, Feld FA9 im Blatt Held).

Das Makro soll ohne weitere Abfragen über den Standarddrucker drucken, bzw. ein zweites Makro, ohne weitere Abfragen von den entsprechenden Seiten ein PDF erstellen.
Zuletzt geändert von Xaiorn am So 25. Sep 2022, 15:16, insgesamt 1-mal geändert.
Gruß,
Xaiorn

Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » Mo 19. Sep 2022, 17:22

Keiner da mit einer guten Idee? Kann ich kaum glauben. Oder ist es so trivial und ich seh's nur nicht?
Gruß,
Xaiorn

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Calc-Makro Bastelhilfe

Beitrag von mikele » Mo 19. Sep 2022, 22:54

Hallo,
das Problem ist eher, zu verstehen, was du meinst.
Was bedeutet "genutzte Seiten"? Etwas später formulierst du "diese ganze Seite soll halt abhängig vom Inhalt gedruckt werden". Ist das das Gleiche?
Sprich: Du möchtest alle Tabellen drucken, die jeweils in der Zelle FA9 (immer diese?) einen gewissen Wert haben (welchen?) - richtig???
und es soll 1x gedruckt und 1x als pdf exportiert werden - auch richtig?
Gruß,
mikele

Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » Di 20. Sep 2022, 07:57

Ja, die beiden Formulierungen bedeuten das gleiche. Ich habe insgesamt 14 Seiten, die einen gewissen festen Text haben (also nicht komplett leer sind, auch wenn sie ungenutzt sind, siehe Beispieltabelle).
Wenn nun aber in bestimmten Feldern Text ist, soll diese Seite gedruckt (bzw exportiert) werden.

Als eine Idee habe ich in dem Feld FA9 (für alle Seiten in diesem einen Feld)die jeweilige Seitenzahl ausgegeben, wenn die Seite an entsprechender Stelle nicht leer ist.

Heißt, wenn Seite 1 gedruckt werden soll, steht in dem Feld eine 1; für Seite 2 eine 2; für Seite 3 eine 3, etc. Also z.B. 1 3 7 11 soll heißen, dass nur diese vier Seiten (1, 3, 7, 11) gedruckt werden sollen.

Wenn es einfacher/besser umzusetzen ist, kann sich das Makro auch an dem ersten Feld (also jeweils oben links) der jeweiligen Seite orientieren, wo dann eine 1 steht (sonst eine 0 für "nicht drucken"). Allerdings ist dieses erste Feld nicht immer an der gleichen Absolutposition (also die Feldbezeichnung ist unterschiedlich, aber auf dem Druckbereich immer die erste).

Das Ganze hätte ich gern für richtiges Drucken über den Standarddrucker und für eine PDF Ausgabe, jeweils ohne weitere Anfragen.

Ist das so verständlicher?
Gruß,
Xaiorn

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Calc-Makro Bastelhilfe

Beitrag von mikele » Di 20. Sep 2022, 20:48

Hallo,
Oder ist es so trivial
trivial ist es nicht, aber so sollte es gehen ...

Code: Alles auswählen

Sub drucken
	'Zugriff auf Dokument
	oDoc=ThisComponent
	'Container für Sammlung der Druckbereiche erstellen
	obereiche = odoc.createInstance("com.sun.star.sheet.SheetCellRanges")
	'Durchlauf durch alle Tabellen
	for i=0 to oDoc.Sheets.Count-1
		oTab=oDoc.Sheets(i)
		'Druckbereiche definiert?
		if ubound(oTab.Printareas)>-1 then
			'Die erste Zelle des ersten Druckbereiches der Tabelle hat den Wert 1?
			if oTab.getcellbyposition(oTab.Printareas(0).StartColumn,oTab.Printareas(0).StartRow).value=1 Then
				'Tabelle zur aktuellen Tabelle machen
				oDoc.currentController.setActivesheet(oTab)
				'Tabelle ausdrucken
				odoc.print(array())
				'Warten, damit der Druckauftrag korrekt gesendet wird
				wait 1000
				'Durckbereiche für pdf-Export sammeln
				for k=0 to ubound(otab.printareas) 
					obereiche.addRangeAddress(otab.printareas(k), 0)
				next

			end if
		end if
	
	next
	'Pfad und Name der aktuellen Datei auslesen und in Array zerlegen
	aUrl=split(oDoc.Url,"/")
	'Dateiname als letztes Element eintragen
	aUrl(ubound(aUrl))="helden_export.pdf"
	'vollständigen Dateinamen im Url-Syntax erzeugen
	sPdf=convertToUrl(join(aUrl,"/"))
	'Paramter für pdf-Export anlegen
	Dim arg(2) as new com.sun.star.beans.PropertyValue
	arg(0).Name = "URL"	
	arg(0).Value = sPdf
	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()
	'Exportieren als pdf
	oDoc.storeToUrl(arg(0).value,arg())		

End Sub

Gruß,
mikele

Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » Mi 21. Sep 2022, 15:16

Hallo,

ja, das kommt dem schon sehr nahe, aber:

- es sind teilweise mehr als ein Druckbereich auf einem Tabellenblatt (je nach Blatt 1, 2 oder 3) die einzeln auf die "1" oben links geprüft werden müssen

- ich würd das gern in 2 Makros teilen (ich brauche entweder das PDF oder den Ausdruck). Wie mache ich das und brauche ich dann die Wartezeit?

- es kommt aktuell ein Druckauftrag pro Tabellenblatt. Das würde ich gern zu einem insgesamt zusammenfassen (also dass ich ein PDF über alle Tabellenblätter bekomme bzw. beim Dublexdruck etwas Papier sparen kann)
Gruß,
Xaiorn

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Calc-Makro Bastelhilfe

Beitrag von mikele » Do 22. Sep 2022, 12:41

Hallo,
ein Makro für das Drucken (ist ein bisschen kniffliger, um das Ganze als einen Druckauftrag loszuschicken):

Code: Alles auswählen

sub drucken

	oDoc=ThisComponent
	'globale Einstellung: alle Tabellen drucken?
	oSettings = createunoservice("com.sun.star.sheet.GlobalSheetSettings")
	'merken der ursprünglichen Einstellung
	alt=osettings.PrintAllSheets
	'setzen auf alle Tabellen drucken
	osettings.PrintAllSheets=true
	'alle Tabellen durchsuchen
	'ursprüngliche Druckbereiche merken
	'neu: nur die Druckbereiche setzen, die in der ersten Zelle eine 1 haben
	n=oDoc.Sheets.Count-1
	DIM aDruckbereiche(n)
	for i=0 to n
		oTab=oDoc.Sheets(i)
		aDruckbereiche(i)=oTab.Printareas
		Dim aDruck()
		z=0
		for k=0 to ubound(oTab.Printareas)
			if oTab.getcellbyposition(oTab.Printareas(k).StartColumn,oTab.Printareas(k).StartRow).value=1 Then
				ReDim aDruck(z)
				adruck(z)=oTab.Printareas(k)
				z=z+1
			end if			
		next
		'neuen Druckbereich setzen
		oTab.Printareas=aDruck
	next
	'Drucken
	oDoc.print(Array())
	wait(1000)
	'Druckbereiche zurücksetzen
	for i=0 to n
		oTab=oDoc.Sheets(i)
		oTab.Printareas=aDruckbereiche(i)
	next
	'globale Druckeinstellung zurücksetzen
	osettings.PrintAllSheets=alt
	
end sub
und eines für die pdf

Code: Alles auswählen

sub pdf_export

	'Zugriff auf Dokument
	oDoc=ThisComponent
	'Container für Druckbereiche erstellen
	obereiche = odoc.createInstance("com.sun.star.sheet.SheetCellRanges")
	'Durchlauf durch alle Tabellen
	for i=0 to oDoc.Sheets.Count-1
		oTab=oDoc.Sheets(i)
		'Druckbereiche definiert?
		if ubound(oTab.Printareas)>-1 then
			'Durchlauf durch die einzelnen Druckbereiche
			for k=0 to ubound(oTab.Printareas)
				'1 in der ersten Zelle?
				if oTab.getcellbyposition(oTab.Printareas(k).StartColumn,oTab.Printareas(k).StartRow).value=1 Then
					obereiche.addRangeAddress(otab.printareas(k), 0)
				end if
			next
		end if
	next
	'Pfad und Name der aktuellen Datei auslesen und in Array zerlegen
	aUrl=split(oDoc.Url,"/")
	'Dateiname als letztes Element eintragen
	aUrl(ubound(aUrl))="helden_export.pdf"
	'vollständigen Dateinamen im Url-Syntax erzeugen
	sPdf=convertToUrl(join(aUrl,"/"))
	'Paramter für pdf-Export anlegen
	Dim arg(2) as new com.sun.star.beans.PropertyValue
	arg(0).Name = "URL"	
	arg(0).Value = sPdf
	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()
	'Exportieren als pdf
	oDoc.storeToUrl(arg(0).value,arg())		

end sub
Gruß,
mikele

Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » Do 22. Sep 2022, 16:50

Hallo,

das Druckmakro nimmt leider immer noch nicht jede Seite, wenn auf einem Tabellenblatt mehr als ein Druckbereich ist (bspw. Blatt Fähigkeiten in der Beispieldatei). Davon abgesehen sieht das schon sehr gut aus.

Das PDF-Makro zerlegt die ursprünglichen Druckbereiche und gibt beliebige Ausschnitte des Arbeitsblattes (auch außerhalb des ursprünglichen Druckbereiches) aus.
Da der Dateipfad ausgelesen wird, kann der Dateiname der Tabelle doch bestimmt auch dem PDF gegeben werden? Anstelle von "helden_export"?

Außerdem scheint irgendetwas die automatische Berechnung der Tabelle auszuschalten, sodass man danach mit F9 aktualisieren, bzw. in die Einstellungen gehen muss. Wo das im Makro passiert, habe ich nicht gefunden.
Gruß,
Xaiorn

mikele
Beiträge: 771
Registriert: Sa 23. Jul 2011, 22:09

Re: Calc-Makro Bastelhilfe

Beitrag von mikele » Fr 23. Sep 2022, 20:48

Hallo,
ich vermute mal, dass ich die Druckbereiche unsauber gesetzt habe.
Probiere mal

Code: Alles auswählen

sub drucken

	oDoc=ThisComponent
	'globale Einstellung: alle Tabellen drucken?
	oSettings = createunoservice("com.sun.star.sheet.GlobalSheetSettings")
	'merken der ursprünglichen Einstellung
	alt=osettings.PrintAllSheets
	'setzen auf alle Tabellen drucken
	osettings.PrintAllSheets=true
	'alle Tabellen durchsuchen
	'ursprüngliche Druckbereiche merken
	'neu: nur die Druckbereiche setzen, die in der ersten Zelle eine 1 haben
	n=oDoc.Sheets.Count-1
	DIM aDruckbereiche(n)
	for i=0 to n
		oTab=oDoc.Sheets(i)
		'Druckbereiche speichern
		aDruckbereiche(i)=oTab.getPrintareas
		Dim aDruck()
		z=0
		for k=0 to ubound(aDruckbereiche(i))
			if oTab.getcellbyposition(aDruckbereiche(i)(k).StartColumn,aDruckbereiche(i)(k).StartRow).value=1 Then
				ReDim aDruck(z)
				adruck(z)=aDruckbereiche(i)(k)
				z=z+1
			end if			
		next
		'neuen Druckbereich setzen
		oTab.setPrintareas(aDruck)
	next
	'Drucken
'	oDoc.print(Array())
'	wait(1000)
	'Druckbereiche zurücksetzen
	for i=0 to n
		oTab=oDoc.Sheets(i)
		oTab.setPrintareas(aDruckbereiche(i))
	next
	'globale Druckeinstellung zurücksetzen
	osettings.PrintAllSheets=alt
	
end sub
Wenn die pdf genauso heißen soll wie die Originaldatei (natürlich mit .pdf am Ende) wird es einfacher:
Anstelle von

Code: Alles auswählen

	'Pfad und Name der aktuellen Datei auslesen und in Array zerlegen
	aUrl=split(oDoc.Url,"/")
	'Dateiname als letztes Element eintragen
	aUrl(ubound(aUrl))="helden_export.pdf"
	'vollständigen Dateinamen im Url-Syntax erzeugen
	sPdf=convertToUrl(join(aUrl,"/"))
Einfach nur

Code: Alles auswählen

	'Pfad und Name der aktuellen Datei auslesen und Endung ändern
	sPdf=left(odoc.Url,len(oDoc.Url)-3) & "pdf"
Gruß,
mikele

Xaiorn
Beiträge: 45
Registriert: Fr 22. Apr 2022, 19:17

Re: Calc-Makro Bastelhilfe

Beitrag von Xaiorn » Sa 24. Sep 2022, 08:53

Moin,

Der Name beim PDF klappt.
Xaiorn hat geschrieben:
Do 22. Sep 2022, 16:50
Das PDF-Makro zerlegt die ursprünglichen Druckbereiche und gibt beliebige Ausschnitte des Arbeitsblattes (auch außerhalb des ursprünglichen Druckbereiches) aus.
Das ist leider immer noch so.


Das Druckmakro hat jedes Mal einen Fehler in der Zeile

Code: Alles auswählen

		'neuen Druckbereich setzen
		oTab.setPrintareas(aDruck)
Wenn man das Makro mehrmals laufen lässt, ändert sich der Druckbereich mehrmals, bis es endlich durchläuft, allerdings druckt es nicht. es arbeitet in der Fußzeile, ansonsten passiert nichts.
Gruß,
Xaiorn

Antworten