Makro zum drucken, dass den Druckbereich dynamisch auswählt

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

AndiO
Beiträge: 9
Registriert: Fr, 01.11.2013 17:36

Makro zum drucken, dass den Druckbereich dynamisch auswählt

Beitrag von AndiO »

Hallo,

ich möchte gerne zwei Makros einbinden. Leider kenne ich mich damit noch nicht so recht aus und konnte bisher die Lösung noch nicht finden. Daher bin ich für eure Hilfe sehr dankbar.

Im Grunde sollen beide Makros einen Druckbefehl ausführen:
  1. Es soll eine Schaltfläche eingefügt werden, bei der ein Druckbereich ausgewählt und dieser dann auf den Standarddrucker ausgedruckt wird.
  2. Eine zweie Schaltfläche soll ebenfalls dynamisch einen Druckbereich auswählen und diesen dann als PDF unter einem bestimmten Namen, der sich aus verschiedenen Inhalten des Domkuments und dem Blattnamen zusammen setzt, gespeichert werden.
Das große Problem ist nun, dass auf einem Tabellenblatt 100 mal das gleiche Formular untereinander steht. Nun muss also immer ein neuer Druckbereich, abhängig vom Ort der Schaltfläche, ausgewählt werden.

Hier mal ein Beispiel:
  • Das erste Formular geht von Zelle A1 bis E5
  • Das zeite Formular entsprechend von Zelle A6 bis E10
  • Jetzt steht in jedem Formular eine Schaltfläche, wenn ich darauf drücke, soll das Formular ausgedruckt werden.
  • Im ersten Fall also der Bereich A1 bis E5 und im zweiten Fall A6 bis E10
Im Grunde muss das Makro also - ausgehend von der Schaltfläche - den Druckbereich neu bestimmen.

Ich habe schon hier im Forum gesucht und mir ein Makro für den PDF-Druck raus gesucht, hier mal der Code:

Code: Alles auswählen

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

    
    sub Store_to_PDF1
        Dim aDruckbereich(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
        osheet = thisComponent.currentcontroller.activesheet  'hier wird das gerade aktive Tabellenblatt ausgewählt
        Filename = oSheet.getCellRangeByName("n1").string   'Zellinhalt auslesen für Dateinamen funktioniert!
        sPrintarea = osheet.getCellRangeByName("n2").string 'Zelleninhalt für Druckbereich aus Zelle n2 z.B. c3:g44 auslesen!
        oZellRange = oSheet.getCellRangeByName(sPrintarea)
        oAdress = oZellRange.RangeAddress
        'neuen Druckbereich setzen
        aDruckbereich(0) = oAdress
        oSheet.setPrintAreas(aDruckbereich())
        sUrl = "file:///C:/drucktest/" & Filename & ".pdf"    'Speicherort anpassen
        Dim myProps(0) as New com.sun.star.beans.PropertyValue
        myProps(0).Name="FilterName"
        myProps(0).Value = "calc_pdf_Export"
        oCalc.storetoUrl(sUrl,myProps()) 'Speichern
    end sub
Der Druckbereich wird hier aus der Zelle N2 ausgelesen. Im zweiten Formular sollte also dann der Druckbereich aus Zelle N7 ausgelesen werden - und der Dateiname entsprechend aus Zelle N6.

Ist das irgendwie möglich?

Wäre super, wenn mir da jemand weiter helfen kann :)

Grüße

Andi



Moderation:
Thema nach OOo Basic und Java verschoben, wo alle Themen zur Basic-Programmierung hingehören.
lorbass, Moderator
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von F3K Total »

Hi,
der Beitrag gehört eigentlich in die Kategorie OOo Basic und Java, aber ich habe da etwas für Dich:
  • Lege für jeden zu druckenden Bereich zwei Buttons an
  • Ändere den Titel von Button 1 zu Drucken den von Button 2 zu PDF
    pp.png
    pp.png (10.38 KiB) 4096 mal betrachtet
  • Binde dieses Makro an das Ereignis Aktion ausführen von jedem Drucken/PDF-Button

    Code: Alles auswählen

    sub S_Drucken_pdf(event)
        Dim aPrintarea(0)
        Dim Printprops()as new com.sun.star.beans.PropertyValue
        obutton = event.source.model
        stag = obutton.tag
        osheet = thiscomponent.currentcontroller.activesheet
        osheet.setPrintAreas(Array())
        atag = split(stag,",")
        sPrintarea = atag(0)
        oCellRange = oSheet.getCellRangeByName(sPrintarea)
        oCellAddress = oCellRange.RangeAddress
        'neuen Druckbereich setzen
        aPrintarea(0) = oCellAddress
        oSheet.setPrintAreas(aPrintarea)
        if obutton.label = "Drucken" then
           thisComponent.print(Printprops())
        else
            sFilename = atag(1)
            sUrl = "file:///C:/Users/USERNAME/Desktop/" & sFilename & ".pdf"    'Speicherort anpassen 
            Dim myProps(0) as New com.sun.star.beans.PropertyValue
            myProps(0).Name="FilterName"
            myProps(0).Value = "calc_pdf_Export"
            Thiscomponent.storetoUrl(sUrl,myProps())
        endif
    end sub 
  • Auf dem Reiter Allgemein der Eigenschaften der Buttons findest Du unten Zusatzinformation.
    • Trage hier auf jedem Drucken-Button den jeweiligen Druckbereich z.B. A1:E5
    • und auf jedem PDF-Button den jeweiligen Druckbereich z.B. A1:E5,gefolgt von einem , (Komma) und dann den Dateinamen ein:
      tag.png
      tag.png (1.38 KiB) 4096 mal betrachtet
  • Wenn Du dann den Formularentwurfsmodus wieder verläßt, funktionieren die Buttons.
Viel Erfolg
Gruß R
AndiO
Beiträge: 9
Registriert: Fr, 01.11.2013 17:36

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von AndiO »

Hallo,

erstmal vielen Dank für die schnelle Antwort!

Das heißt allerdings, dass ich für jedes Formular - und das sind ja 100 Stück - das Makro anpassen muss, richtig?

Ich hatte schon ähnlich gedacht, nämlich dass ich 100 Makros erstelle, in die ich die Werte direkt eintrage.

Gibt es denn vielleicht doch eine Möglichkeit, dass man die Werte dynamisch ermittelt? Wenn sonst Formular Nr. 101 dazu kommt, müsste man doch wieder das Makro anpassen, oder habe ich da jetzt einen Denkfehler?

Grüße

Andi
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von F3K Total »

Hallo Andi,
nein, nicht das Makro, sondern die Buttons müssen angepasst werden.
Wenn Du allerdings eine regelmäßige Ordnung in deinen "Formularen" hast, kann man das viel einfacher erledigen.
z.B. mit nur einem Button und einer Auswahlliste.
Doch dazu fehlt die Information.
Es wäre am Besten, wenn du hier z.B. ein verkürztes Beispieldokument hochladen würdest.

Gruß R
AndiO
Beiträge: 9
Registriert: Fr, 01.11.2013 17:36

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von AndiO »

Hallo,

gerne würde ich ein Beispiel hochladen, aber ich finde dazu nicht den richtigen Button? Wie kann ich denn ein Dokument hochladen?

Grüße

Andi
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von clag »

Hallo AndiO,

man stolpert doch direkt darüber wenn man eine Frage schreibt und abschickt :lol:
AndiO_Frage01.png
AndiO_Frage01.png (8.92 KiB) 4020 mal betrachtet
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
AndiO
Beiträge: 9
Registriert: Fr, 01.11.2013 17:36

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von AndiO »

oh man, wie peinlich :? aber jetzt habe selbst ich es gesehen :)
testdatei.ods
(10.54 KiB) 165-mal heruntergeladen
Ich hab mal eine kleine Datei geschrieben, damit es übersichtlicher bleibt. Hier kurz ein paar Infos dazu:
  • Die Formulare gehen von A1 bis D3, A4 bis D6 usw.
  • Der Druckbereich soll entsprechend über diese Zellen gehen, eintragen wollte ich diesen in F2, F5 etc., allerdings sollte dieser dann auch automatisch ausgelesen werden - dafür kenne ich aber keine Formel.
  • In Zelle F1, F4 etc. steht der Dateiname für die PDF-Datei. Hier habe ich auch noch zwei Probleme:
    1. Ich möchte Datum und Uhrzeit einfügen. Diese lese ich in F3, F6 etc. aus. Bei der Uhrzeit fehlen mir noch die Sekunden und im Dateinamen wird das ganze als Zahl umgewandelt, was ich natürlich nicht möchte, denn so kann man es ja nicht mehr lesen.
    2. Es soll auch der Name des Tabellenblatts eingetragen werden, hier also Tabelle1. Diesen würde ich z.B. in Zelle H3, H6 etc. einfügen und dann in F1, F4 etc. verknüpfen.
Warum überhaupt das ganze so kompliziert?

Die Formulare sind natürlich viel umfangreicher. Ausserdem sind es nicht nur 10 sondern 100 und ggf. müssen noch ein paar angefügt werden, so dass hier wieder individuelle Anpassungen notwendig wären was natürlich zu Fehlern führen kann.

Wäre schön, wenn es eine passende Lösung geben würde, denn es soll ja alles möglichst einfach und automatisiert ablauern können.

Grüße

Andi
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von F3K Total »

Hi,
der Aufbau deiner Tabelle ist nicht so gut, ich habe mal eine Vorschlag gemacht, wie das Ganze funktionieren könnte.
Grundsätzlich sollten Daten zu einem Thema entweder in einer Zeile oder in einer Spalte stehen.
Klicke in eine Kopfzeile (die mit dem Dateinamen) um die Tabelle, die gedruckt werden soll, zu markieren, und dann auf Drucken/PDF.
Die PDF landet im gleichen Ordner wie die .ods Datei.

Gruß R
Dateianhänge
testdateiF3K.ods
(13.12 KiB) 198-mal heruntergeladen
AndiO
Beiträge: 9
Registriert: Fr, 01.11.2013 17:36

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von AndiO »

Hallo,

also, erstmal vielen Dank für die bisherige Hilfe!!!

Leider passt es immer noch nicht so ganz, wobei es meinem Wunsch immer näher kommt :)

Ich versuche nochmal, die Sache zu beschreiben:
  • Die Formulare sind natürlich viel umfangreicher und ich kann die Felder nicht so anordnen wie im Beispiel, also Spalte für Spalte - ist das denn wichtig?
  • Das man in eine "Kopfzeile" klicken muss ist kompliziert (nicht für mich, aber für andere :) ). Kann man es so machen, dass es reicht, irgendwo im Formular hinzuklicken?
  • Da es mindestens 100 Formulare untereinander sind, sind die Buttons oben etwas umständlich. Aber wenn ich es richtig ausprobiert habe, kann ich sie ja einfach in jedes Formular kopieren, oder spricht was dagegen? (technisch gesehen :) )
  • Am liebsten wäre mir, wenn das Makro anhand "der Lage" des Buttons erkennt, welches Formular ausgedruckt werden soll, dann wäre auch das Problem mit dem Cursor in der Kopfzeile gelöst. Da liegt - glaube ich - aber wohl das größte Problem, denn ich hab noch nirgends etwas gefunden, wie ich in einem Makro einen relativen Pfad angeben kann. Zur Verdeutlichung hier mal ein Bild
    soll-soll-gedruckt-werden.jpg
    soll-soll-gedruckt-werden.jpg (45.75 KiB) 3928 mal betrachtet
Und jetzt noch zwei "Kleinigkeiten" :)
  1. Wie kann ich den Tabellennamen auslesen? Die Formel, die Du in D2 geschrieben hast, liest jetzt ja schon super auch die Zeit und das Datum aus, als letztes bräuchte ich aber noch den Namen des Tabellenblatts.
  2. Ich möchte die PDFs in einem extra Ordner speichern, wo kann ich den passenden Pfad angeben?
So, das sind erstmal meine aktuellen Wünsche :) Ich weiß, ist sicher etwas nervig, aber Makros sind nicht eben mein Spezialgebiet und ich möchte es doch gerne lösen können.

Grüße

Andi
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von F3K Total »

AndiO hat geschrieben:Ich weiß, ist sicher etwas nervig (1), aber Makros sind nicht eben mein Spezialgebiet(2) und ich(3) möchte es doch gerne lösen können.
(1) Genau!
(2) dann beschäftige dich damit, lerne es, es gibt genügend Informationsquellen im Internet.
(3) bislang hast DU noch nichts zur Lösung beigetragen.
R
AndiO
Beiträge: 9
Registriert: Fr, 01.11.2013 17:36

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von AndiO »

F3K Total hat geschrieben: (2) dann beschäftige dich damit, lerne es, es gibt genügend Informationsquellen im Internet.
(3) bislang hast DU noch nichts zur Lösung beigetragen.
OK, ich dachte, das hier wäre so eine Quelle und ich könnte es mit dieser Hilfe lösen und leider kann ich es nicht selber lösen denn ich weiß ja eben nicht, wie es geht und ob es überhaupt geht? Denn darüber habe ich bisher noch überhaupt nichts gefunden und ich habe schon einiges durchsucht...

Und im übrigen habe ich ja kein leeres Blatt hier eingestellt sondern hatte schon etwas gefunden, das aber nicht so ganz richtig war (siehe erster Thread) - ich habe also schon gesucht, und ehrlich gesagt auch ziemlich lange...
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von Karolus »

Hallo

Ich glaube, hier wäre das übliche Vorgehen: ein Serienbriefdokument in Wrter mit einem Tabellendokument in Normalform als DatenQuelle ( d.h. du benötigst in Calc keine hunderte vorstrukturierte und formatierte Bereiche ).

Damit kannst du die Aufgabe sinnvoll alleine lösen.

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
AndiO
Beiträge: 9
Registriert: Fr, 01.11.2013 17:36

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von AndiO »

Danke für den Tip, aber es soll halt genau so wie beschrieben umgesetzt werden. Hintergrund ist, dass ich das für einen Bekannten machen soll, der sich eben nur damit auskennt und das ganze vereinfachen möchte. Ich selber würde das Ganze eher als Datenbank erstellen, dann hätte ich alle Freiheiten, aber der Kollege kennt sich damit eben nicht aus :)
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von Karolus »

Hallo

Das ist blöd, der Kollege möchte etwas haben womit er sich nicht auskennt, und du möchtest es auf eine Weise lösen wo du dich nicht auskennst.... 8)

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
AndiO
Beiträge: 9
Registriert: Fr, 01.11.2013 17:36

Re: Makro zum drucken, dass den Druckbereich dynamisch auswä

Beitrag von AndiO »

ja, so ist es manchmal :)

Ich kenne mich halt mit vielem aus, vor allem in Excel, aber eben nicht bei Makros und genau das Thema ist bei OpenOffice auch noch grundlegend anders. Mit einer Datenbank könnte ich es lösen aber dann kann der Kollege selber daran nichts mehr ändern, denn damit kennt er sich halt nicht aus, ein Teufelskreis :)
Antworten