Seite 1 von 1

gelöst: nur (Druck)-Bereich eines sheets für Makro nutzen

Verfasst: Mi, 22.08.2012 11:07
von wasty
Hallo Experten,

ich habe mit einem Bekannten (hauptsächlich er) ein Makro1 geschrieben, das nur den Druckbereich aus einem Tabellenblatt mit Namen versehen und als pdf an einen vorgegebenen Speicherpfad/Ort speichern soll.

Was funktioniert: den Namen übernimmt das Makro aus Zelle u16=string2 und den Speicherpfad aus u19=string1 und erzeugt ein pdf.
Was nicht funktioniert: Als pdf werden alle 8 Tabellenblätter komplett gespeichert. Der Befehl aus dem aktuellen/mit Namen benannten Tabellenblatt nur den Druckbereich zu speichern klappt nicht.
Der Druckbereich wurde per Hand "Format-Druckbereiche-festlegen" oder über ein Namenfeld (im Makro="druck_best1") mit Druckbereich C1:O54 angelegt/markiert, bevor das Makro ausgeführt wird.
Nutze oo3.3 unter Apple Leopard. Habe Datei idR als .xls vorliegen aber auch als .ods ausprobiert.

Ein anderes Makro2 habe ich im Forum gefunden, dass das gleiche bewirken soll aber auch daran scheitert, nur den Druckbereich des Tabellenblattes zu speichern.

Hätte jemand eine Idee, wie/wo man eine Änderung anbringen muss, damit immer nur der Druckbereich des aktiven Tabellenblattes als pdf gespeichert wird?

Für Vorschläge wäre ich dankbar!

Grüße
wasty


Nachfolgend das Makro1 mit übernahme des Speicherpfades aus der Tabelle

Code: Alles auswählen

REM  *****  BASIC  *****
sub best_dr_2
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 = "Nr"
args1(0).Value = 3 rem hier 3.Tabellenblatt (von ca 8Stk)
 
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
 
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "druck_best1" rem Bereich festlegen und Namen vergeben zB druck_best1; hier C1:O54
 
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())
 
rem ----------------------------------------------------------------------
dim args3(2) as new com.sun.star.beans.PropertyValue
 
oDoc = thisComponent 
otable=oDoc.Sheets(2) rem mail=0 !!!! zählt 0,1,2 ...
ocell=otable.getCellbyPosition(20, 15)    'Feld mit Dateiname u16 1.=0 !!!
oString2 = ocell.String
 
oDoc = thisComponent
otable=oDoc.Sheets(2)
ocell=otable.getCellbyPosition(20, 18)    'Feld mit Pfad zum speichern (bei Mac zB.string1="/users/bka/desktop/"+ string2=1974 Meier,Gerd
oString1 = ocell.String
 
args3(0).Name = "URL"
args3(0).Value = "file:///" & oString1 & oString2 & ".pdf"
rem args3(0).Value = "/users/bka/desktop/...string2...pdf"
 
args3(1).Name = "FilterName"
args3(1).Value = "calc_pdf_Export"
args3(2).Name = "FilterData"
rem ich denke mal der folgende Absatz ist nicht so wichtig (aber sehr lang!)
args3(2).Value = Array(Array("UseLosslessCompression",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Quality",0,90,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ReduceImageResolution",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("MaxImageResolution",0,300,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseTaggedPDF",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("SelectPdfVersion",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportNotes",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportBookmarks",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("OpenBookmarkLevels",0,-1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("UseTransitionEffects",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("IsSkipEmptyPages",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("IsAddStream",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EmbedStandardFonts",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("FormsType",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportFormFields",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("AllowDuplicateFieldNames",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerToolbar",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerMenubar",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("HideViewerWindowControls",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ResizeWindowToInitialPage",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("CenterWindow",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("OpenInFullScreenMode",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("DisplayPDFDocumentTitle",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("InitialView",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Magnification",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Zoom",0,100,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PageLayout",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("FirstPageOnLeft",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("InitialPage",0,1,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Printing",0,2,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Changes",0,4,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EnableCopyingOfContent",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EnableTextAccessForAccessibilityTools",0,true,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportLinksRelativeFsys",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PDFViewSelection",0,0,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ConvertOOoTargetToPDFTarget",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("ExportBookmarksToPDFDestination",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("_OkButtonString",0,"",com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("EncryptFile",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PreparedPasswords",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("RestrictPermissions",0,false,com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("PreparedPermissionPassword",0,Array(),com.sun.star.beans.PropertyState.DIRECT_VALUE),Array("Selection",0,,com.sun.star.beans.PropertyState.DIRECT_VALUE))
 
dispatcher.executeDispatch(document, ".uno:ExportToPDF", "", 0, args3())
  
end sub

und das Makro2, welches ich hier im Forum gefunden habe.

Code: Alles auswählen

Sub Store_to_PDF1
   oCalc = thisComponent
   oSheet = oCalc.sheets().getByName("RuV")  'Tabellennamen anpassen (speichert allerdings alle Tabellenblätter)
   
   Filename = oSheet.getCellRangeByName("q17").string   'Zellinhalt auslesen für Dateinamen
   
   myView = oCalc.CurrentController
   myView.setActiveSheet(oSheet)
   oZellRange = oSheet.getCellRangeByName("$c$1:$o$44")  'Bereich anpassen  (speichert allerdings alle Tabellenblätter)
   oCursor = oSheet.createCursorByRange(oZellRange)
   oAdress = oCursor.RangeAddress
   Dim aDruckbereich(0)
   aDruckbereich(0) = oAdress
   oSheet.setPrintAreas(aDruckbereich())
   Dim myProps(0) as New com.sun.star.beans.PropertyValue
   sUrl= "file:///C:/drucktest/" & Filename & ".pdf"    'Speicherort anpassen
   myProps(0).Name="FilterName"
   myProps(0).Value = "calc_pdf_Export"
   oCalc.storetoUrl(sUrl,myProps())
   oSheet.setprintareas(Array())'Druckbereich löschen
End Sub

Re: nur (Druck)-Bereich eines sheets für Makro nutzen

Verfasst: Do, 23.08.2012 22:16
von F3K Total
Hallo,
so geht es, ich habe nur am Anfang alle vorhandenen Druckbereiche gelöscht und einige unnötige Zeilen gelöscht.

Code: Alles auswählen

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 = oCalc.sheets().getByName("RuV")  'Tabellennamen anpassen (speichert allerdings alle Tabellenblätter)
    Filename = oSheet.getCellRangeByName("q17").string   'Zellinhalt auslesen für Dateinamen
    oZellRange = oSheet.getCellRangeByName("$c$1:$o$44")
    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
Viel Erfolg
Gruß R

Re: nur (Druck)-Bereich eines sheets für Makro nutzen

Verfasst: Di, 28.08.2012 11:38
von wasty
Hallo F3K Total,

die Änderung funktioniert ! super!
Wie das häufig so ist, steigen dann die Ansprüche. Ich habe ein wenig an dem code gebastelt, aber ohne die richtigen Kenntnisse kommt da bei mir nichts anderes als Fehlermeldungen heraus.

Ich würde gerne noch das Handling etwas verfeinern. Dazu wäre es ideal, wenn sowohl der Tabellenname oSheet = ...("ruv")
als auch der Druck/Ausgabebereich oZellRange = ....("$c$1:$o$44") ebenfalls über eine Zelle aus dem Tabellenblatt übernommen werden könnten. Oder muss der code/Makro auf jedem zu speichernden Tabellenblatt mit den spezifischen Namen + Druckbereich gespeichert werden?
Mit dem Filename = ...("q17").string klappt dies prima.

Hättest Du da noch eine Lösung?

Code: Alles auswählen

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 = oCalc.sheets().getByName("RuV")  'geht das hier auch mit .string zum auslesen aus der Zelle ("q16")
    Filename = oSheet.getCellRangeByName("q17").string   'Zellinhalt auslesen für Dateinamen funktioniert!
    oZellRange = oSheet.getCellRangeByName("$c$1:$o$44")  'hier zB ("q18") mit Zellinhalt zB  $b$1:$m$65
    oAdress = oZellRange.RangeAddress
    'neuen Druckbereich setzen
    aDruckbereich(0) = oAdress
    oSheet.setPrintAreas(aDruckbereich())
    sUrl = "file:///C:/drucktest/" & Filename & ".pdf"    'klappt einwandfrei
    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
Auch so schon mal vielen Dank für die tolle Lösung!
wasty

Re: nur (Druck)-Bereich eines sheets für Makro nutzen

Verfasst: Di, 28.08.2012 18:06
von F3K Total
Da hättest Du selbst drauf kommen können!

Code: Alles auswählen

sub Store_to_PDF2
    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("q17").string   'Zellinhalt auslesen für Dateinamen funktioniert!
    sPrintarea = osheet.getCellRangeByName("q18").string 'Zelleninhalt für Druckbereich aus Zelle q18 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"    'klappt einwandfrei
    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
Gruß R

Re: nur (Druck)-Bereich eines sheets für Makro nutzen

Verfasst: Mi, 29.08.2012 17:08
von wasty
Hallo F3K Total,

das klappt wie am Schnürchen, perfekt! Kann ich sehr flexibel einsetzen.

Hatte es auch mit .string für den Druckbereich probiert, gab aber in der nächsten Zeile eine Fehlermeldung.
Bei der activesheet-Auswahl konnte es natürlich nicht klappen.

Danke für Deine Geduld !!

Grüße
wasty

Re: gelöst: nur (Druck)-Bereich eines sheets für Makro nutze

Verfasst: Mi, 29.08.2012 17:23
von F3K Total
wasty hat geschrieben:Hatte es auch mit .string für den Druckbereich probiert, gab aber in der nächsten Zeile eine Fehlermeldung.
Bei der activesheet-Auswahl konnte es natürlich nicht klappen.
Ehrlich gesagt, weiß ich nicht, was Du mir damit sagen möchtest!
In meinem Makro wird der Druckbereich aus der Zelle q18 doch gerade per .string ausgelesen und das aktuelle Tabellenblatt mit .activesheet bestimmt.

Gruß R