Mehrere Blättter aktivieren

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Mehrere Blättter aktivieren

Re: Mehrere Blättter aktivieren

von Axel Richter » Mi, 23.03.2011 15:55

Hallo delta9,
delta9 hat geschrieben:"A1" usw. ist mehr so eine Verlegenheitsangabe, damit das ganze Blatt aufgenommen wird?
Nahein! ;-) Bitte sei *vorsichtig* mit der Benutzung von Ranges, die über mehrere Blätter gehen, wenn Du sie nicht durchschaust.
Auch, wenn Du manuell, also nicht per Makro, mehrere Blätter selektierst, sind immer *nicht* nur die Blätter selektiert, sondern auch *immer* Zellbereiche *auf* den Tabellenblättern.

Du merkst es, wenn Du Dir (per xray) mal ThisComponent.CurrentSelection.AbsoluteName anschaust, wenn mehrere Blätter selektiert sind.

Du merkst es auch, wenn Du bei mehreren selektierten Blättern mal etwas in irgendeine Zelle eingibst. Dann steht das sofort in allen entsprechenden Zellen der gleichzeitig selektierten Blätter.
Bitte denke also daran, die Selection nach dem Druck wieder auf ein Blatt zu reduzieren, indem Du per
oController.select(thiscomponent.sheets(0).getCellRangeByName("A1"))
dafür sorgst, dass nur noch ein Blatt in der Selection ist. Sonst machst Du Dir viel Freude, wenn Du etwas in Tabelle1 in A1 eintippst, was sich dann auch in alle noch gleichzeitig selektierten Blätter auch in A1 einträgt.

viele Grüße

Axel

Re: Mehrere Blättter aktivieren

von delta9 » Mi, 23.03.2011 15:29

Hallo Axel,
ich hätte es ja nicht mehr erwartet, aber nun klappts. Vielen Dank an Dich und die anderen Mithelfer.

Im einzelnen:

A "A1" usw. ist mehr so eine Verlegenheitsangabe, damit das ganze Blatt aufgenommen wird?
Denn es klappt nun auch wunderbar mit den festgelegten Druckbereichen.

B Ich habe es mit Winfrieds dispatch-Druck-Komanndo (s.o) kombiniert und habe nun genau das, was ich haben will, nämlich die freie Druckerauswahl

c Ist ja eigentlich klar dass Druckansicht alles zeigt, es wird ja auch nicht wie beim richtigen Druckmenü abgefragt, was gedruckt werden soll,
bin nur nicht vorher darauf gekommen.



Stefan

Re: Mehrere Blättter aktivieren

von Axel Richter » Mi, 23.03.2011 12:45

Hallo delta9,
delta9 hat geschrieben:Verstehe ich richtig. dass dein Beispiel so gedacht sind, dass immer nur die Zellen A1 gedruckt werden sollen?
Nein, es wird der Range "Tabelle1.A1;Tabelle2.A1;Tabelle3.A1" in die Selection getan und somit zwangsläufig die drei Blätter ausgewählt.
delta9 hat geschrieben:Aber bei meinem Test deines Makros ist die Druckvorschau völlig unbeeindruckt davon was ich vorher in oRanges reinschreibe. Er druckt (anzeigend) immer alle Seiten und alle Inhalte auf den Seiten!?
Ja, offensichtlich zeigt Calc in der Seitenansich *immer* alle druckbaren Blätter an, unabhängig von der Auswahl.

Folgendes druckt aber tatsächlich die ausgewählten Tabellen (im Beispiel 1 und 3) auf dem Standarddrucker aus, wenn die Standard-Option [x] Ausgewählte Tabellen gesetzt ist.

Code: Alles auswählen

oRanges = thiscomponent.createInstance("com.sun.star.sheet.SheetCellRanges")

oRange = thiscomponent.sheets(0).getCellRangeByName("A1")
oRanges.addRangeAddress(oRange.RangeAddress, True)
oRange = thiscomponent.sheets(1).getCellRangeByName("A1")
'oRanges.addRangeAddress(oRange.RangeAddress, True)
oRange = thiscomponent.sheets(2).getCellRangeByName("A1")
oRanges.addRangeAddress(oRange.RangeAddress, True)

oController = thiscomponent.currentcontroller
oController.select(oRanges)

thiscomponent.print(array())
viele Grüße

Axel

Re: Mehrere Blättter aktivieren

von delta9 » Mi, 23.03.2011 11:14

Hallo Axel,
das schient mir nur schon sehr nahe an der Lösung.

Verstehe ich richtig. dass dein Beispiel so gedacht sind, dass immer nur die Zellen A1 gedruckt werden sollen?

Aber bei meinem Test deines Makros ist die Druckvorschau völlig unbeeindruckt davon was ich vorher in oRanges reinschreibe. Er druckt (anzeigend) immer alle Seiten und alle Inhalte auf den Seiten!?

Dabei habe ich fast nichts geändert an Deinem Code (eine Seite zum Test erfolglos rauskommentiert, vierte Seite wird auch gedruckt)

Code: Alles auswählen


Sub Test

dim oRanges
dim oRange
dim oController
dim oDispatcher

oRanges = thiscomponent.createInstance("com.sun.star.sheet.SheetCellRanges")
oRange = thiscomponent.sheets(0).getCellRangeByName("A1")
oRanges.addRangeAddress(oRange.RangeAddress, True)
'oRange = thiscomponent.sheets(1).getCellRangeByName("A1")
'oRanges.addRangeAddress(oRange.RangeAddress, True)
oRange = thiscomponent.sheets(2).getCellRangeByName("A1")
oRanges.addRangeAddress(oRange.RangeAddress, True)
oController = thiscomponent.currentcontroller
oController.select(oRanges)
oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
oDispatcher.executeDispatch(oController.Frame, ".uno:PrintPreview", "", 0, Array()) 
End Sub
Stefan

Re: Mehrere Blättter aktivieren

von delta9 » Mi, 23.03.2011 11:02

Hallo Winfried,
da hast Du Dir ja viel Mühe gegeben. Eventuell kann ich das auch nochmal gebrauchen, aber es trifft nicht ganz den Kern meines Problems.

Ich will ja bestimmte Blätter per Makro AUSWÄHLEN. Dass nur die ausgewählten Blätter gedruckt werden, kann ich ja im Druckdialog noch mit einem Mausklick von Hand erledigen. Mühsam wäre aber das manuelle Auswählen, das ich gerne automatisieren möchte.

Ich ging davon aus, das gäbe es einen direkten Befehl dafür, scheint aber nicht so einfach zu sein?

Stefan

Re: Mehrere Blättter aktivieren

von komma4 » Di, 22.03.2011 20:32

delta9 hat geschrieben:Ich zumindest will bestimmte BLÄTTER (Sheets) bzw. deren Druckbereich ausdrucken.
Nochmal ein wenig nachgedacht und recherchiert:


Im DevelopersGuide /Spreadsheet/Spreadsheet.htm#1+2+3+1+Printer+and+Print+Job+Settings
steht nichts von einer Druckoption "nur ausgewählte Blätter drucken"

Die Möglichkeit das festzulegen entspricht der Einstellung in Extras>Optionen...>OpenOffice.org Calc>Drucken.

Wenn Du nicht sicherstellen kannst, dass der Benutzer die Option gesetzt hat, dann stelle sie selbst ein:

in der Datei ~/.openoffice.org/3/user/registry/data/org/openoffice/Office/Calc.xcu

setze

Code: Alles auswählen

 <node oor:name="Print">
  <node oor:name="Other">
   <prop oor:name="AllSheets" oor:type="xs:boolean">
    <value>true</value>
   </prop>
  </node>
 </node>
auf FALSE



Die gute Nachricht:

dafür habe ich ein funktionierendes Codebeispiel:

Code: Alles auswählen

Sub de47499
' 2011-03-22

oServiceManager = GetProcessServiceManager()

oConfigProvider = oServiceManager.createInstance( _
   "com.sun.star.configuration.ConfigurationProvider" ) 

Dim aProp(1) As New com.sun.star.beans.PropertyValue
    
aProp(0).Name = "nodepath" 
aProp(0).Value = "org.openoffice.Office.Calc/Print/" 
    
oCUA = oConfigProvider.createInstanceWithArguments( _
   "com.sun.star.configuration.ConfigurationUpdateAccess" , aProp() ) 
    
If oCUA.hasByName( "Other" ) Then 

   oNodePrintAllSheets = oCUA.getByName( "Other" ) 
   oNodePrintAllSheets.setPropertyValue( "AllSheets", "FALSE" )
       
   oCUA.commitChanges ()
   
End If

exit sub 

Die schlechte Nachricht:

die Eigenschaft wird durch die SUB zwar gesetzt, von einer laufenden OOo-Anwendung aber nicht ausgewertet.
Erst nach einem Neustart von OOo wird das beim Drucken berücksichtigt.... :(

Re: Mehrere Blättter aktivieren

von Axel Richter » Di, 22.03.2011 20:28

Hallo delta9,
delta9 hat geschrieben:Wie kann ich per Makro mehrere Blätter selektieren
Ein CellRange, bestehend aus nicht zusammenhängenden einzelnen CellRanges kann per Makro so erstellt werden:

Code: Alles auswählen

oRanges = thiscomponent.createInstance("com.sun.star.sheet.SheetCellRanges")

oRange = thiscomponent.sheets(0).getCellRangeByName("A1")
oRanges.addRangeAddress(oRange.RangeAddress, True)
oRange = thiscomponent.sheets(1).getCellRangeByName("A1")
oRanges.addRangeAddress(oRange.RangeAddress, True)
oRange = thiscomponent.sheets(2).getCellRangeByName("A1")
oRanges.addRangeAddress(oRange.RangeAddress, True)
Nun steht in oRanges "Tabelle1.A1;Tabelle2.A1;Tabelle3.A1".

Nun selektieren wir das und schauen es uns in der Druckvorschau an:

Code: Alles auswählen

oController = thiscomponent.currentcontroller
oController.select(oRanges)

oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
oDispatcher.executeDispatch(oController.Frame, ".uno:PrintPreview", "", 0, Array()) 
Voraussetzung ist natürlich, dass es die drei Tabellen gibt und dass in allen drei auch etwas drin steht.

viele Grüße

Axel

Re: Mehrere Blättter aktivieren

von delta9 » Di, 22.03.2011 16:35

Hallo Komma 4

ja, den Beitrag habe ich auch schon gesehen.

Aber wie Stephan ja schreibt, wählt man bei dieser Auswahl der Seiten nur die x-te y-te und z-te Seite von einem gewählten Ausdruck aus.
Also wenn ich ohne diese Seitenauswahl 20 Seiten ausdrucken würde, dann kann ich wählen ob ich hiervon z.B. nur die Seiten 5 bis 9 drucke möchte, die
Nummerierung bezieht sich auf die Druckseiten. (Na ja, Stephan hats klarer formuliert als ich :o )

Ich denke, xemu hat vielleicht ein ähnliches Problem wie ich.

Ich zumindest will bestimmte BLÄTTER (Sheets) bzw. deren Druckbereich ausdrucken. Hierzu müsste ich diese irgendwie selektieren.
Natürlich könnte ich mir irgendwie hochkompliziert ausrechnen, welchen Druckseiten das entspricht, aber geht's nicht auch einfacher?

Stefan

Re: Mehrere Blättter aktivieren

von komma4 » Di, 22.03.2011 15:02

delta9 hat geschrieben:Wie kann ich per Makro mehrere Blätter selektieren, auswählen, markieren (oder wie das heisst) die gedruckt werden sollen?
vielleicht so: viewtopic.php?f=18&t=47574 ?

Re: Mehrere Blättter aktivieren

von delta9 » Di, 22.03.2011 11:31

Hallo Stephan,
das war je ein sehr interessanter Ausflug, bin nun wieder etwas schlauer.

Vermutlich habe ich mein ursprüngliches Anliegen mit meiner Nebenfrage selber zugeschüttet, daher nochmal:

Wie kann ich per Makro mehrere Blätter selektieren, auswählen, markieren (oder wie das heisst) die gedruckt werden sollen?


Stefan

Re: Mehrere Blättter aktivieren

von Stephan » Mo, 21.03.2011 14:24

Ob Du (oder ein anderer) damit was anfangen kann...? Ich eher nicht
Die IDs sind nur eine andere Bezeichnung für die entsprechenden Dispatcher-Befehle. Der Code:

Code: Alles auswählen

Sub PrintDialog
   GlobalScope.BasicLibraries.LoadLibrary("Tools")
   DispatchSlot(5504)
End Sub
ist also prinzipiell nur eine andere Implemetierung für:

Code: Alles auswählen

sub PrintDialog2
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array())
end sub
wobei auch gehen sollte:

Code: Alles auswählen

sub PrintDialog3
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, "slot:5504", "", 0, Array())
end sub

In Deiner sxc-Datei findest Du z.B. die ID 5504 in Tabelle "Sfx2" in Zelle H46 und kannst den zugehötigen UNO-Befehl in Zelle F46 ablesen.
Möglicherweise (kommt auf den Zweck und persönliche Vorliebe an) erschließt sich eine Übersicht nach OOo-Modulen geordnet leichter, anhängend als PDF (online derzeitig auch nicht verfügbar)

2 weitere Beispiele wären:
slot:5500 --> 'öffnet Vorlagen und Dokumente'-Fenster
slot:5501 --> öffnet 'Öffnen'-Fenster

Anmerkung:
Beides ging zumindeest früher auch mittels Kommandozeile:
soffice slot:5500
soffice slot:5501


DispatchSlot(x) ist wohl auch nur verwendbar solange der Befehl keine Parameter benötigt. (benötigt! nicht zulässt, denn .uno:Print akzeptiert auch Parameter, aber braucht sie eben nicht zwingend)



Gruß
Stephan
Dateianhänge
Dispatch-commands-2.0.pdf
(197.11 KiB) 142-mal heruntergeladen

Re: Mehrere Blättter aktivieren

von komma4 » Mo, 21.03.2011 13:49

delta9 hat geschrieben:Und du hast mich neugierig gemacht: Gibt es eine Übersicht mit den Nummern des Befehls DispatchSlot(xxxx)?
Eine Quelle im Netz kann ich aktuell nicht finden... ich hänge mal meine Version von Dezember 2007 hier an.

Ob Du (oder ein anderer) damit was anfangen kann...? Ich eher nicht

[Die Dateierweiterung sxc wurde deaktiviert und kann nicht länger angezeigt werden.]


Viel Erfolg!

Re: Mehrere Blättter aktivieren

von delta9 » Mo, 21.03.2011 13:29

Hallo Winfried,
danke, das hilft mir schon mal gut weiter, vielen Dank!
Bleibt nur noch die Frage, wie ich die Blätter selektiere, auswählte oder wie das heisst, die gedruckt werden sollen?

Und du hast mich neugierig gemacht: Gibt es eine Übersicht mit den Nummern des Befehls DispatchSlot(xxxx)?

Stefan

Re: Mehrere Blättter aktivieren

von komma4 » Fr, 18.03.2011 19:38

delta9 hat geschrieben:Ist "sichtbarmachen" der treffendere Ausdruck? Man kann doch auch per Hand mehrere Arbeitsblätter über deren Reiter unten gleichzeitig "anwählen", sichtbar ist trotzdem nur eins.
Die Anweisung, die Du gepostet hat, macht das Blatt sichtbar - mit dem Code kann man aber nicht mehrere Blätter selektieren.

delta9 hat geschrieben:Oder anders gefragt: Kann ich den Druck per Makro so auslösen, dass ich vor dem Druck auswählen kann, welchen Drucker ich nehme usw. also das normale Druckmenü erscheint. Dann könnte ich auf dieses "sichtbar machen mehrerer Seiten" verzichten.
Von unserem Member turtle47

Code: Alles auswählen

Sub PrintDialog
   GlobalScope.BasicLibraries.LoadLibrary("Tools")
   DispatchSlot(5504)
End Sub
aus einem englischsprachigem Forum


Hilft Dir das weiter?

Re: Mehrere Blättter aktivieren

von delta9 » Fr, 18.03.2011 17:30

Ist "sichtbarmachen" der treffendere Ausdruck? Man kann doch auch per Hand mehrere Arbeitsblätter über deren Reiter unten gleichzeitig "anwählen", sichtbar ist trotzdem nur eins.

Egal wie das Wort heisst, ich meine es in dem Sinn, dass ich dann per Hand über Menüsteuerung diese "sichtbar" gemachten Blätter ausdrucken kann.

Oder anders gefragt: Kann ich den Druck per Makro so auslösen, dass ich vor dem Druck auswählen kann, welchen Drucker ich nehme usw. also das normale Druckmenü erscheint. Dann könnte ich auf dieses "sichtbar machen mehrerer Seiten" verzichten. (
(Wobei ich nicht das ganze Druckmenü nochmals selber irgendwie als Dialog mühsam programmiert aufbauen will - das ginge sicher auch)

Nach oben