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

Makro Drucken langsam

CALC ist die Tabellenkalkulation, die Sie immer wollten.
Antworten
cynep8
Beiträge: 26
Registriert: Mi 15. Mär 2017, 21:06

Makro Drucken langsam

Beitrag von cynep8 » Fr 9. Nov 2018, 17:14

Hallo liebes Forum,
ich habe mir vor einiger Zeit mit eurer Hilfe ein Makro zusammen gestellt welches mir erlaubt einen bestimmten Bereich (aus Zelle gelesen) zu drucken. Nun habe ich an meinem Dokument weiter gebastelt und noch einiges hinzugefügt. Unter anderem habe ich viele Formularsteuerelemente eingebaut die aber nicht im Druckbereich sind. Wenn ich mein Drucken Makro starte geht das Programm erstmal alle Steuerelemente durch bevor es anfängt zu drucken. Das dauert recht lange, wenn ich aber die normal drucken Funktion in LibreOffice verwende passiert das nicht.

Ich hoffe Ihr könnt mir helfen!

Code: Alles auswählen

Dim ocalc as Object
Dim Tab as Object
Dim Druckbereich as Object

const SFolderURL = "file:///C:/Users/admin/Dokumente/_Rechnungen/Rechnung_Normal/" '<--- Speicherordner für PDF-Datein
const sNameCell = "G5"' <------------------------------- Zelle in der der Dateiname steht
const sPrintAreaCell ="A60"'<--------------------------- Zelle, in der der auszudruckende Bereich steht, z.B.  A2:F29

sub Drucken
    Dim myProps(0) as New com.sun.star.beans.PropertyValue
    myProps(0).Name="FilterName"
    myProps(0).Value = "calc_pdf_Export"
    aTab = array("RG_Normal")'<--------------- Namen der auszugebenden Tabellenblätter kommasepariert
    Dim aPrintAreas(0)
    oCalc = thisComponent
    osheets = oCalc.Sheets
    'vorhandene Druckbereiche löschen
    for i = 0 to osheets.count - 1
        osheet = oSheets(i)
        osheet.setPrintAreas(Array())
    next i
    for i = 0 to ubound(aTab)
        oSheet = oCalc.sheets().getByName(aTab(i))  'Blatt wählen
        sFilename = oSheet.getCellRangeByName(sNameCell).string   'Dateiname auslesen 
        oPrintAreaCell = oSheet.getCellRangeByName(sPrintAreaCell)
        sPrintArea = oPrintAreaCell.String
        oCellRange = oSheet.getCellRangeByName(sPrintArea)'zu druckender Zellbereich 
        oAddress = oCellRange.RangeAddress'Zelladressen des zu druckenden Zellbereiches
        'neuen Druckbereich setzen
        aPrintAreas(0) = oAddress
        oSheet.setPrintAreas(aPrintAreas)
        sUrl = SFolderURL & sFilename & ".pdf"    'Speicherpfad zusammensetzen
        oCalc.storetoUrl(sUrl,myProps()) 'Speichern
        oSheet.setPrintAreas(Array())

 next i
Controller = ocalc.getCurrentController()
Tab = Controller.ActiveSheet
Druckbereich = Tab.getCellRangeByName(sPrintArea)
DruckbereichDrucken

end Sub





sub DruckenZwei
    Dim myProps(0) as New com.sun.star.beans.PropertyValue
    myProps(0).Name="FilterName"
    myProps(0).Value = "calc_pdf_Export"
    aTab = array("RG_Normal")'<--------------- Namen der auszugebenden Tabellenblätter kommasepariert
    Dim aPrintAreas(0)
    oCalc = thisComponent
    osheets = oCalc.Sheets
    'vorhandene Druckbereiche löschen
    for i = 0 to osheets.count - 1
        osheet = oSheets(i)
        osheet.setPrintAreas(Array())
    next i
    for i = 0 to ubound(aTab)
        oSheet = oCalc.sheets().getByName(aTab(i))  'Blatt wählen
        sFilename = oSheet.getCellRangeByName(sNameCell).string   'Dateiname auslesen 
        oPrintAreaCell = oSheet.getCellRangeByName(sPrintAreaCell)
        sPrintArea = oPrintAreaCell.String
        oCellRange = oSheet.getCellRangeByName(sPrintArea)'zu druckender Zellbereich 
        oAddress = oCellRange.RangeAddress'Zelladressen des zu druckenden Zellbereiches
        'neuen Druckbereich setzen
        aPrintAreas(0) = oAddress
        oSheet.setPrintAreas(aPrintAreas)
        sUrl = SFolderURL & sFilename & ".pdf"    'Speicherpfad zusammensetzen
        oCalc.storetoUrl(sUrl,myProps()) 'Speichern
        oSheet.setPrintAreas(Array())

 next i
Controller = ocalc.getCurrentController()
Tab = Controller.ActiveSheet
Druckbereich = Tab.getCellRangeByName(sPrintArea)
DruckbereichDrucken

Controller = ocalc.getCurrentController()
Tab = Controller.ActiveSheet
Druckbereich = Tab.getCellRangeByName(sPrintArea)
DruckbereichDrucken

end Sub


Sub DruckbereichDrucken
 
Dim Args1(0)
Dim Args2(1) as new com.sun.star.beans.PropertyValue
Dim Probs
Dim sDrucker as string


Probs = ocalc.getPrinter()
sDrucker = Probs(0).value


args1(0) = Druckbereich.RangeAddress
Tab.setprintAreas(args1())

args2(0).name = "Name"
args2(0).value = "<" & sDrucker & ">"
args2(1).name = "Wait"
args2(1).value = true

ocalc.print(args2())

redim args1()

Tab.setprintAreas(args1())

end Sub

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro Drucken langsam

Beitrag von mikele » Mo 12. Nov 2018, 20:26

Hallo,
Wenn ich mein Drucken Makro starte geht das Programm erstmal alle Steuerelemente durch bevor es anfängt zu drucken.
Die angegebenen Makro machen das nicht.
Das dauert recht lange, wenn ich aber die normal drucken Funktion in LibreOffice verwende passiert das nicht.
Bei der "normalen" Druckerfunktion (ich gehe mal davon aus, du meinst damit den Klick auf die Druckfunktion resp. Drucken-Diaolog) löscht du auch nicht erst alle Druckbereiche aller Tabellen, legst dann einen neuen Druckbereich auf einem Tabellenblatt fest, exportierst die Datei als pdf und druckst dann ein Tabellenblatt aus.
Kurz: Dein Makro macht noch einiges mehr, als "nur" zu drucken. Insofern ist der Vergleich zum Scheitern verurteilt.
Wenn du das Ganze beschleunigen möchtest, muss das Makro optimiert werden. Was soll es genau leisten?
Gruß,
mikele

cynep8
Beiträge: 26
Registriert: Mi 15. Mär 2017, 21:06

Re: Makro Drucken langsam

Beitrag von cynep8 » Di 13. Nov 2018, 02:22

Hallo mikele,
danke erst einmal für deine schnelle Antwort.
Ja genau, ich meinte den Drucken-Dialog. Beim PDF Dialog ging es auch schnell.
Wenn ich mein Drucken Makro starte geht das Programm erstmal alle Steuerelemente durch bevor es anfängt zu drucken.
Man kann dabei zusehen wie im Tabellenblatt alle Steuerelemente nacheinander von oben nach unten kurz aktiv angewählt werden. Ist Libre Office damit durch startet auch sofort der Druckvorgang. Nun weiß ich natürlich nicht ob das löschen der Druckbereiche dafür verantwortlich ist.

Das Makro:
Ich habe einen variablen Druckbereich der je nach Umfang 1. oder 2. Seiten umfasst(soll aus Zelle gelesen werden). Neben dem Druckvorgang soll immer ein PDF mit erstellt werden, welches in einem bestimmten Pfad und bestimmten Namen (aus Zelle gelesen) gespeichert wird. Die PDF Erstellung kann am Ende der Prozedur stattfinden. Ein weiteres Makro soll das gleiche tun wie das erste nur das es das Dokument zweimal druckt.

Viele Grüße
Cynep8

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro Drucken langsam

Beitrag von mikele » Di 13. Nov 2018, 08:22

Hallo,
warum wird einerseits per

Code: Alles auswählen

aTab = array("RG_Normal")'<--------------- Namen der auszugebenden Tabellenblätter kommasepariert
das Tabellenblatt hart definiert und dort der Druckbereich festgelegt und andererseits

Code: Alles auswählen

Controller = ocalc.getCurrentController()
Tab = Controller.ActiveSheet
Druckbereich = Tab.getCellRangeByName(sPrintArea)
DruckbereichDrucken
das aktive Tabellenblatt gedruckt (wenn es nicht zufällig das obige ist, ist der Druckbereich leer). Das Tabellenblatt wird "RG_Normal" wird also nur gedruckt, wenn es auch gleichzeitig das aktive ist. Als pdf werden allerdings die in aTab abgelegten Tabellenblätter (jeweils einzeln) abgespeichert.
Ist das alles so gewollt?
Gruß,
mikele

cynep8
Beiträge: 26
Registriert: Mi 15. Mär 2017, 21:06

Re: Makro Drucken langsam

Beitrag von cynep8 » Di 13. Nov 2018, 17:46

Ich kenne mich mit Basic leider nicht so gut aus und verstehe die Sachen auch nur sehr grob. Letztes Jahr habe ich mir aus verschiedenen Macros dieses zusammen gestückelt. Ich weiß daher auch nicht mehr was ich da eigentlich zusammen gestückelt hatte (Asche auf mein Haupt). Vermutlich war das eine vom PDF Macro und das andere vom drucken Macro.

Der Druckbereich ist immer auf dem aktiven Tabellenblatt.

Gruß
Cynep8

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro Drucken langsam

Beitrag von mikele » Di 13. Nov 2018, 19:21

Hallo,

Code: Alles auswählen

Der Druckbereich ist immer auf dem aktiven Tabellenblatt.
Dann hast du zufälligerweise Glück, dass dein aktives Blatt (von dem du das Makro vermutlich per Schaltfläche startest) gerade das RG_Normal ist.
Ist aber auch egal. Daher zurück zu meiner Frage: Was ist gewollt? Dazu wäre es hilfreich zu wissen, wie die Datei aufgebaut ist. Geht es um ein oder mehrere Tabellenblätter? Soll die Makro-Druck-und-pdf-Erstellung auf jedem Blatt greifen oder nur auf einem?
Kannst du uns eine Beispieldatei (ggf. anonymisiert) zur Verfügung stellen?
Gruß,
mikele

cynep8
Beiträge: 26
Registriert: Mi 15. Mär 2017, 21:06

Re: Makro Drucken langsam

Beitrag von cynep8 » Di 13. Nov 2018, 21:57

Es gibt mehrere Tabellenblätter wovon zwei aktiv sichtbar sind und wo etwas ausgedruckt werden soll. Bin ich auf dem Tabbellenblatt "RG_Normal" soll auch nur der Teil auf diesem Tabellenblatt gedruckt werden. Bin ich auf dem Tabellenblatt "RG_Versand" soll auch nur das von dem Tabellenblatt gedruckt werden.

Ich habe jetzt meine hoffentlich weit genug anonymisierte Vorlage mit an gehangen.
Dateianhänge
Rechnungsvorlage_neutral.ods
(98.67 KiB) 109-mal heruntergeladen

cynep8
Beiträge: 26
Registriert: Mi 15. Mär 2017, 21:06

Re: Makro Drucken langsam

Beitrag von cynep8 » Mo 26. Nov 2018, 16:06

Hallo,
soll ich noch etwas zum Dokument erklären?

Gruß cynep8

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro Drucken langsam

Beitrag von mikele » Mo 26. Nov 2018, 22:35

Hallo,
ich hatte etwas wenig Zeit um mich darum zu kümmern ...
Nun aber:
Ich habe die ganzen verschiedenen Drucken-Makros auf ein einziges reduziert, das von allen 4 Schaltflächen aufgerufen wird. Die Anzahl der Kopien wird anhand des Textes der Schaltfläche bestimmt (genauer anhand des 1. Zeichens).
Die Reihenfolge habe ich umgekehrt: zunächst wird gedruckt, dann als pdf exportiert. Die Option "Wait" habe ich auf "false" gesetzt. Dadurch wird nach dem Druckbefehl das Makro sofort weiter abgearbeitet.
Zur Beschleunigung habe ich das Löschen der Druckbereich ein das Start-Makro verlegt. Dort ist mir aufgefallen, dass du eigentlich auf dem RG_normal alle Datumsfelder mit dem aktuellen Datum versehene willst. Zumindest bei mir macht es das aber nicht, da auf der drawpage zwei Formulare mit dem Namen "Formular" existieren und im Makro nur das eine (blöderweise das falsche) benutzt wird. Ich habe es per getByIndex auf das richtige Formular gestellt.
Das Start-Makro habe ich ausschließlich an das Ereignis "Ansicht erstellt" gebunden. Das sollte reichen.

In den Datumsfeldern gab es eine Fehlermeldung, wenn das Datum gelöscht wurde. Den Fehler habe ich abgefangen.

Soweit erst mal ...
Dateianhänge
Rechnungsvorlage_neutral_neu.ods
(101.23 KiB) 101-mal heruntergeladen
Gruß,
mikele

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: Makro Drucken langsam

Beitrag von mikele » Di 27. Nov 2018, 21:36

Hallo,
die Bindung des Start-Makros an das Ereignis "Ansicht erzeugt" ist Unfug. Dadurch wird es auch vor dem Druck bzw. dem Speichern als pdf aufgerufen. Das Löschen der Druckbereiche führt dann z dem von dir beschriebenen Durchlauf durch alle Kontrollelemente (da nun das ganze Blatt gedruckt werden würde, werden alle Kontrollelemente die als "Nicht druckbar" markiert sind zu nächst ausgeblendet und dann wieder eingeblendet).
Also Bindung an "Dokument geöffnet" und soweit chic.
Dateianhänge
Rechnungsvorlage_neutral_neu2.ods
(101.47 KiB) 129-mal heruntergeladen
Gruß,
mikele

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten