Spalten ausblenden und Druckbereich bilden

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

Moderator: Moderatoren

mike6
*****
Beiträge: 479
Registriert: Sa, 06.03.2004 13:58

Spalten ausblenden und Druckbereich bilden

Beitrag von mike6 »

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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

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:

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
...
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:

Code: Alles auswählen

...
oCursor = oSheet.createCursorByRange(oSheet.getCellRangeByName("A1"))
oCursor.gotoEndofUsedArea(true)     ' Bereich markieren
oAdress = oCursor.RangeAddress     'Die Adresse des Zellobjektes
...
Jetzt hast du den Bereich der benutzen Zellen als Zellbereichsadresse. Diese musst du nun nur noch als Array dem Druckbereich übergeben:

Code: Alles auswählen

...
Dim aDruckbereiche(0)    'Array mit einem Elemet erzeugen
aDruckbereiche(0) = oAdress    'Wert zuweisen
oSheet.setPrintAreas(aDruckbereiche())    'Druckbereich festlegen
...
Tia, das war es. Ich hoffe, es hilft :D

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
mike6
*****
Beiträge: 479
Registriert: Sa, 06.03.2004 13:58

Beitrag von mike6 »

Hallo,

soweit habe ich alles hinbekommen :D . 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
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Mike6,
Was jetzt noch fehlt wäre:
Ein Makro für alles
Tia, und wo ist das Problem? Funktionieren die Einzelmakros? Dann schreib Sie doch einfach zusammen:

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
Tia, bleibt noch die Sub Doc_drucken:

Code: Alles auswählen

sub Doc_drucken
    Dim arg()  as new com.sun.star.beans.PropertyValue
    thisComponent.print(arg())
end sub
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 :wink:

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
mike6
*****
Beiträge: 479
Registriert: Sa, 06.03.2004 13:58

Beitrag von mike6 »

Hallo,

vielen Dank für die Hilfe.:D


PS.
Versuch es doch mal mit einem Sauerteig.
Rezepte gibt es im Internet genug.

Kleiner Tipp vom mir:

Dispatcher-Code ( entspricht der Trockenhefe )
Native Basic Code ( entspricht der normalen Hefe )
Bitte nicht beides mischen !! :wink:




mfg
mike6
Antworten