💚 Das OpenOffice Forum bittet um Ihre Hilfe! 💚
Ihre Spende wird für die Deckung der laufenden Kosten der kommenden 12 Monate sowie den Ausbau 🌱 des OpenOffice Forums verwendet.
💚 Als Dankeschön werden Sie im Forum als OO-SUPPORTER gekennzeichnet. 💚
🤗 VIELEN DANK AN ALLE SPENDER - NUR DANK EUCH KÖNNEN WIR DAS FORUM ERHALTEN UND WEITERENTWICKELN 🤗
Calc-Makro Bastelhilfe
Re: Calc-Makro Bastelhilfe
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.
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
Re: Calc-Makro Bastelhilfe
Keiner da mit einer guten Idee? Kann ich kaum glauben. Oder ist es so trivial und ich seh's nur nicht?
Gruß,
Xaiorn
Xaiorn
Re: Calc-Makro Bastelhilfe
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?
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
mikele
Re: Calc-Makro Bastelhilfe
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?
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
Xaiorn
Re: Calc-Makro Bastelhilfe
Hallo,
trivial ist es nicht, aber so sollte es gehen ...Oder ist es so trivial
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
mikele
Re: Calc-Makro Bastelhilfe
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)
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
Xaiorn
Re: Calc-Makro Bastelhilfe
Hallo,
ein Makro für das Drucken (ist ein bisschen kniffliger, um das Ganze als einen Druckauftrag loszuschicken):
und eines für die pdf
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
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
mikele
Re: Calc-Makro Bastelhilfe
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.
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
Xaiorn
Re: Calc-Makro Bastelhilfe
Hallo,
ich vermute mal, dass ich die Druckbereiche unsauber gesetzt habe.
Probiere mal
Wenn die pdf genauso heißen soll wie die Originaldatei (natürlich mit .pdf am Ende) wird es einfacher:
Anstelle von
Einfach nur
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
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,"/"))
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
mikele
Re: Calc-Makro Bastelhilfe
Moin,
Der Name beim PDF klappt.
Das Druckmakro hat jedes Mal einen Fehler in der Zeile
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.
Der Name beim PDF klappt.
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)
Gruß,
Xaiorn
Xaiorn