Hallo,
ich versuche in Oo-Calc über ein Makro verschiedene Spalten auszublenden.
In meinem Versuch habe ich die Spalte B + D ausgeblendet.
Es kommt folgender Makrocode heraus:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub spaltenausblenden
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 ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:HideColumn", "", 0, Array())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:HideColumn", "", 0, Array())
end sub
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Leider kann ich nicht ersehen wo im Code die Spalte B und D steht.Ich möchte das
Makro per Hand erweitern.
Desweiteren möchte ich diesen Code erweitern damit nach Ausblenden der Spalten autom.
die letzte ausgefüllte Zeile erkannt wird und darüber ein Druckbereich gebildet wird.
A B C D E F G H I
1
2
3
4
5
6
7
8
9
Es soll also die Spalte B + D ausgeblendet werden, das Makro soll den letzten Eintrag erkennen
( also I9 ) und soll über diesen Bereich ( A1:A9; C1:C9, E1:I9 ) einen " Druckbereich " anlegen.
Wäre für jeden Ansatz dankbar.
mfg
mike 6
Spalten ausblenden und Druckbereich bilden
Moderator: Moderatoren
Hey Mike6,
viele, viele Fragen, aber versuchen wir mal, Antworten zu finden.
Also zunächst Grundsätzliches: Bei so komplexen Zusammenhängen solltest du dich mit der Makro-Programierung beschäftigen - native - und nicht den Makro-Rekorder nutzen. Dieser produziert nämlich nur "Dispatcher-Code", eine spezielle Hilfsstruktur, mit der nicht alles abbildbar ist und vor allem: du kannst sie kaum erweitern.
Also - lern Basic, UNO und API (<Werbung an> zum Beispiel durch mein neues Buch - was hoffentlich bald rauskommt - OOo 2.0 Basic siehe auch ->hier </Werbung aus>), dann klappt es auch mit der Programmierung.
Nun zum Konkreten:
Ausblenden der Spalten:
So, nun sind die Spalten "B" und "D" ausgeblendet. Problem 1 gelöst.
Feststellen der letzten benutzten Spalte/Zeile:
Das lässt sich am einfachsten über einen Zellbereich lösen, wobei du ja gar nicht den tatsächlichen Endpunkt benötigst, sondern diesen Bereich nur als Druckbereich definieren möchtest.
Also musst du zunächst einen ZellCursor erzeugen, der eine Startadresse haben muss. Ich gehe mal davon aus, dass die Zelle "A1" immer im gewünschten Zellbereich liegt und ausgefüllt (mit Inhalt) ist:
Also los:
Jetzt hast du den Bereich der benutzen Zellen als Zellbereichsadresse. Diese musst du nun nur noch als Array dem Druckbereich übergeben:
Tia, das war es. Ich hoffe, es hilft
Gruss
Thomas
viele, viele Fragen, aber versuchen wir mal, Antworten zu finden.
Also zunächst Grundsätzliches: Bei so komplexen Zusammenhängen solltest du dich mit der Makro-Programierung beschäftigen - native - und nicht den Makro-Rekorder nutzen. Dieser produziert nämlich nur "Dispatcher-Code", eine spezielle Hilfsstruktur, mit der nicht alles abbildbar ist und vor allem: du kannst sie kaum erweitern.
Also - lern Basic, UNO und API (<Werbung an> zum Beispiel durch mein neues Buch - was hoffentlich bald rauskommt - OOo 2.0 Basic siehe auch ->hier </Werbung aus>), dann klappt es auch mit der Programmierung.
Nun zum Konkreten:
Ausblenden der Spalten:
Code: Alles auswählen
...
oSheet = thisComponent.sheets(0) 'das erste Tabellenblatt
oSpB = oSheet.getColumns().getByName("B") ' die Spalte B
oSpB.isVisible = false 'Spalte B ausgeblendet
oSpD = oSheet.getColumns().getByName("D") ' die Spalte D
oSpD.isVisible = false 'Spalte D ausgeblendet
...
Feststellen der letzten benutzten Spalte/Zeile:
Das lässt sich am einfachsten über einen Zellbereich lösen, wobei du ja gar nicht den tatsächlichen Endpunkt benötigst, sondern diesen Bereich nur als Druckbereich definieren möchtest.
Also musst du zunächst einen ZellCursor erzeugen, der eine Startadresse haben muss. Ich gehe mal davon aus, dass die Zelle "A1" immer im gewünschten Zellbereich liegt und ausgefüllt (mit Inhalt) ist:
Also los:
Code: Alles auswählen
...
oCursor = oSheet.createCursorByRange(oSheet.getCellRangeByName("A1"))
oCursor.gotoEndofUsedArea(true) ' Bereich markieren
oAdress = oCursor.RangeAddress 'Die Adresse des Zellobjektes
...
Code: Alles auswählen
...
Dim aDruckbereiche(0) 'Array mit einem Elemet erzeugen
aDruckbereiche(0) = oAdress 'Wert zuweisen
oSheet.setPrintAreas(aDruckbereiche()) 'Druckbereich festlegen
...

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo,
soweit habe ich alles hinbekommen
. Ich habe Makros für:
a) Spalten ausblenden
b) Spalten einblenden
c) Druckbereich festlegen
und d) Druckbereich aufheben
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM Hier werden die Spalten B, D und F ausgeblendet.
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub Spalten_ausblenden
oSheet = thisComponent.sheets(0) 'das erste Tabellenblatt
oSpB = oSheet.getColumns().getByName("B") ' die Spalte B
oSpB.isVisible = false 'Spalte B ausgeblendet
oSpD = oSheet.getColumns().getByName("D") ' die Spalte D
oSpD.isVisible = false 'Spalte D ausgeblendet
End Sub
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM Hier werden die Spalten B, D und F wieder eingeblendet.
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub Spalten_einblenden
Doc = thisComponent
Sheet = Doc.Sheets(0)
Sheet.Columns(1).IsVisible = True
Sheet.Columns(3).IsVisible = True
Sheet.Columns(5).IsVisible = True
End Sub
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM Hier wird der Druckbereich festgelegt.
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub druckbereich_anlegen
Dim CellrangeAddress AS New com.sun.star.table.CellRangeAddress
Dim args(0)
Doc = ThisComponent
Sheet = Doc.Sheets(0)
Cellrangeaddress.Sheet = 0
Cellrangeaddress.StartColumn = 0 ' Spalte A
Cellrangeaddress.Startrow = 0 ' Zeile 1
Cellrangeaddress.EndColumn = 2 ' Spalte C
Cellrangeaddress.EndRow = 5 ' Zeile 6
args(0) = Cellrangeaddress
sheet.setPrintAreas(args())
End Sub
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM Hier wird der Druckbereich wieder gelöscht.
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub druckbereich_loeschen
rem define variables
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:DeletePrintArea", "", 0, Array())
end sub
##########################################################################
Was jetzt noch fehlt wäre:
Ein Makro für alles:
a) Spalten ausblenden
b) Druckbereich festlegen
c) Druckbereich drucken ( evtl. Auswahl des Druckers )
e) Spalten wieder einblenden
f) Druckbereich wieder entfernen
Ich hoffe der Quellcode ist nicht zu aufgebläht.
Ein Bäcker kann eben besser Brot backen,
ein Programmierer besser programmieren.
++ PS. Das Buch werde ich selbstverst. kaufen ++
mfg
mike6
soweit habe ich alles hinbekommen

a) Spalten ausblenden
b) Spalten einblenden
c) Druckbereich festlegen
und d) Druckbereich aufheben
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM Hier werden die Spalten B, D und F ausgeblendet.
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub Spalten_ausblenden
oSheet = thisComponent.sheets(0) 'das erste Tabellenblatt
oSpB = oSheet.getColumns().getByName("B") ' die Spalte B
oSpB.isVisible = false 'Spalte B ausgeblendet
oSpD = oSheet.getColumns().getByName("D") ' die Spalte D
oSpD.isVisible = false 'Spalte D ausgeblendet
End Sub
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM Hier werden die Spalten B, D und F wieder eingeblendet.
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub Spalten_einblenden
Doc = thisComponent
Sheet = Doc.Sheets(0)
Sheet.Columns(1).IsVisible = True
Sheet.Columns(3).IsVisible = True
Sheet.Columns(5).IsVisible = True
End Sub
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM Hier wird der Druckbereich festgelegt.
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub druckbereich_anlegen
Dim CellrangeAddress AS New com.sun.star.table.CellRangeAddress
Dim args(0)
Doc = ThisComponent
Sheet = Doc.Sheets(0)
Cellrangeaddress.Sheet = 0
Cellrangeaddress.StartColumn = 0 ' Spalte A
Cellrangeaddress.Startrow = 0 ' Zeile 1
Cellrangeaddress.EndColumn = 2 ' Spalte C
Cellrangeaddress.EndRow = 5 ' Zeile 6
args(0) = Cellrangeaddress
sheet.setPrintAreas(args())
End Sub
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
REM Hier wird der Druckbereich wieder gelöscht.
REM++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sub druckbereich_loeschen
rem define variables
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:DeletePrintArea", "", 0, Array())
end sub
##########################################################################
Was jetzt noch fehlt wäre:
Ein Makro für alles:

a) Spalten ausblenden
b) Druckbereich festlegen
c) Druckbereich drucken ( evtl. Auswahl des Druckers )
e) Spalten wieder einblenden
f) Druckbereich wieder entfernen
Ich hoffe der Quellcode ist nicht zu aufgebläht.
Ein Bäcker kann eben besser Brot backen,
ein Programmierer besser programmieren.
++ PS. Das Buch werde ich selbstverst. kaufen ++
mfg
mike6
Hey Mike6,
Tia, bleibt noch die Sub Doc_drucken:
Fertig. OK, eine Druckerauswahl erhälst du so nicht, es wird der Standarddrucker mit den Standardeigenschaften benutzt, aber das ist doch schon mal ein guter Anfang.
Klar, der Code ist "aufgebläht" und das Mischen von Dispatcher-Code und Native Basic Code nicht "schön", aber was soll´s. Jeder beginnt ein mal
Gruss
Thomas
Tia, und wo ist das Problem? Funktionieren die Einzelmakros? Dann schreib Sie doch einfach zusammen:Was jetzt noch fehlt wäre:
Ein Makro für alles
Code: Alles auswählen
sub MeinGesamtmakro
Spalten_Ausblenden 'Aufruf Spalten_Ausblenden
Druckbereich_anlegen 'Aufruf Druckbereich festlegen
Doc_drucken 'Aufruf drucken
Spalten_Einblenden 'Aufruf Spalten wieder einblenden
Druckbereich_loeschen ' Druckbereich entfernen
end sub
Code: Alles auswählen
sub Doc_drucken
Dim arg() as new com.sun.star.beans.PropertyValue
thisComponent.print(arg())
end sub
Klar, der Code ist "aufgebläht" und das Mischen von Dispatcher-Code und Native Basic Code nicht "schön", aber was soll´s. Jeder beginnt ein mal

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic