Die ersten zwei Teile der Workshop-Reihe haben Ihnen die Grundlagen der Makroprogrammierung vorgestellt. In dieser Ausgabe zeigen wir einige Spezialfunktionen und stellen auch den VBA-Support vor.
OpenOffice bietet mit StarBasic eine mächtige Makrosprache, die in Anlehnung an Microsofts Visual Basic for Applications (VBA) entstanden ist. Während sich die Grundelemente der beiden Programmiersprachen (wie Schleifen, If-Then-Else-Konstruktionen und mit Sub definierte Unterprogramme) stark ähneln, unterscheiden sich die Objektkonzepte bei VBA und StarBasic sehr stark. Für ein wirkliches Verständnis der (Objekt-)Methoden, mit denen Sie in StarBasic Tabellen beeinflussen können, würde unsere Workshop-Reihe zu weit gehen, dafür ist die Lektüre eines längeren StarBasic-Buchs nötig, etwa [1]. Wir zeigen Ihnen darum Beispielcode für einige häufig benötigte Zugriffsmethoden, mit dem Sie etwa die aktuelle Auswahl (die markierten Zellen) herausfinden und damit arbeiten können. Außerdem stellen wir Ihnen den in OpenOffice integrierten VBA-Support vor, über den Sie – zumindest teilweise – Makroprogramme aus Excel-Dokumenten auch in OpenOffice nutzen können.
Zellbereiche verwenden
Im letzten Teil des Workshops haben wir Ihnen Funktionen Wert = Get(x,y) und Put(x,y,Wert) vorgestellt, mit denen Sie direkt auf die Inhalte bestimmter Zellen zugreifen können, sie verwendeten beide die OpenOffice-Methode getCellByPosition(x,y). Sie können in ähnlicher Weise auch ganze Bereiche manipulieren – um etwa die Zellen B2 bis C5 kursiv zu formatieren, könnten Sie den Code in Listing 1 benutzen.
Bereich kursiv setzen
Sub Kursiv ()
Bereich = ThisComponent.Sheets(0).getCellRangeByName("B2:C5")
Bereich.CharPosture = com.sun.star.awt.FontSlant.ITALIC
End Sub
Die Methode getCellRangeByName arbeitet ähnlich wie getCellByPosition(x,y), erwartet aber eine Bereichsangabe der Form "B2:C5". Die kursive Schrift setzen Sie, indem Sie dem Attribut CharPosture der Bereichsvariable den konstanten Wert com.sun.star.awt.FontSlant.ITALIC zuweisen. Um die Schrägstellung wieder zu entfernen, würden Sie stattdessen com.sun.star.awt.FontSlant.NONE verwenden. Eine Übersicht weiterer Schrifteigenschaften, die Sie auf ähnliche Weise nutzen können, finden Sie in der StarBasic-Dokumentation [2] im Abschnitt Constant Groups, ein Beispiel wäre com.sun.star.awt.FontWeight.BOLD – diesen Wert (der fette Schrift repräsentiert) müssen Sie aber dem Attribut CharWeight zuweisen, also
Bereich.CharWeight = com.sun.star.awt.FontWeight.BOLD
Weitere Zeichenattribute finden Sie im OpenOffice-Wiki [3]. Sie könnten theoretisch auch den Makro-Rekorder verwenden, um solche einfachen Formatänderungen aufzuzeichnen. Abbildung 1 zeigt den Code, den Sie mit dem Makrorekorder erzeugen, indem Sie zunächst die Aufzeichnung starten, dann den Zellbereich B2:C5 markieren, auf die Kursiv-Schaltfläche klicken und schließlich die Aufzeichnung stoppen. Im Ergebnis leistet dies das Gleiche, der Code ist aber für weitere Anpassungen kaum geeignet: Alle mit dem Rekorder aufgezeichneten Makros verwenden das so genannte UNO-Interface (Universal Network Objects) von StarBasic, das keine direkt verständlichen Anweisungen (wie “Setze die Schrift in den markierten Zellen fett”) kennt, sondern sehr umständlich Argumentlisten aufbaut und dann dem so genannten Dispatcher übergibt, der die darin enthaltenen Anweisungen interpretiert und umsetzt.

Abbildung 1: Diesen Code erzeugt der Makrorekorder, wenn Sie den Zellbereich “B2:C5” markieren und auf die Kursiv-Schaltfläche klicken.
Wer professionell OpenOffice-Makros erstellen will, wird an einer Einarbeitung in UNO nicht vorbei kommen (und kann dann auch wieder von den Aufzeichnungen des Makro-Rekorders profitieren), für den Hausgebrauch ist es nicht sinnvoll, sich mit UNO zu beschäftigen.
Mit der Auswahl arbeiten
Der bisher gezeigte Code kann nun mit Zellbereichen arbeiten, aber nur mit vorab festgelegten. Wollen Sie ein Makro schreiben, das beliebige markierte Zellen verändert, hilft Ihnen dieses Verfahren nicht weiter. OpenOffice bietet aber eine Möglichkeit, herauszufinden, welche Zellen in der Tabelle derzeit markiert sind.
Die Methode ThisComponent.getCurrentSelection() gibt die aktuelle Auswahl (engl. selection) zurück. Hierbei gibt es allerdings die Schwierigkeit, dass unterschiedliche Auswahl möglich sind: eine einzelne markierte Zelle, ein Bereich (wie B2:C5) oder eine Reihe von nicht zusammenhängenden Bereichen (wie B2:C5, F6:G8) – schließlich unterstützt Calc Mehrfachauswahlen.
Wann immer Sie also mit einer Auswahl arbeiten, sollten Sie zunächst prüfen, um welchen Typ von Auswahl es sich handelt – tun Sie das nicht, kann es sein, dass Ihr Makro nicht funktioniert. Um welche Art von Auswahl es sich handelt, können Sie mit der Methode supportsService feststellen: Listing 2 zeigt ein Beispiel dafür, und in Abbildung 2 sehen Sie, wie dieses Makro korrekt eine Mehrfachauswahl erkennt.
Zelle, Einfach- oder Mehrfachauswahl?
Sub AuswahlPruefen
Auswahl = ThisComponent.getCurrentSelection
If Auswahl.supportsService("com.sun.star.sheet.SheetCell") Then
MsgBox ("einzelne Zelle")
ElseIf Auswahl.supportsService("com.sun.star.sheet.SheetCellRange") Then
MsgBox ("Einfachauswahl")
ElseIf Auswahl.supportsService("com.sun.star.sheet.SheetCellRanges") Then
MsgBox ("Mehrfachauswahl")
End If
End Sub
Wie Sie im Detail die einzelnen Zellen eines markierten Bereichs ansprechen, erfahren Sie im folgenden Absatz; vorher stellen wir den VBA-Support vor, der diese Aufgabe deutlich erleichtert. Wenn Sie keinen Wert darauf legen, “reine” StarBasic-Makros (ohne VBA-Elemente) zu erstellen, können Sie die Programmierung deutlich beschleunigen.
VBA-Support
VBA (Visual Basic for Applications) ist die Makrosprache, die Microsoft entwickelt und in viele eigene Anwendungen eingebunden hat, darunter als prominenteste Vertreter die Office-Programme Word, Excel und PowerPoint. VBA ist in diesem Sinne ein Verwandter von StarBasic, und die grundsätzliche Syntax eines VBA-Programms entspricht auch der StarBasic-Syntax. Allerdings verwendet VBA ein vollständig anderes Objektmodell, so dass Programme, die mit Objekten in Dokumenten arbeiten, sich unter VBA und StarBasic stark unterscheiden.
Da Microsoft Office nach wie vor eine sehr hohe Verbreitung hat, haben die OpenOffice-Entwickler schon früh damit begonnen, begrenzten Support für das Microsoft-Objektmodell zu entwickeln. Dadurch wird es bei der Übernahme von Word- und Excel-Dokumenten in OpenOffice leichter, integrierte VBA-Makros weiter zu nutzen. Wenn Sie selbst Programmierkenntnisse in VBA haben, können Sie auch direkt VBA-Makros in OpenOffice schreiben und sparen sich damit den Aufwand, sich in das OpenOffice-Modell einzuarbeiten. Außerdem können Sie auf diese Weise Makros programmieren, die sowohl unter Word und Excel als auch unter OpenOffice nutzbar sind.
Der Schlüssel zum VBA-Support ist die Option vbasupport, die Sie ganz am Anfang des Makrodokuments aktivieren müssen:
Option vbasupport 1
Sobald diese Zeile auftaucht, können Sie viele VBA-Features nutzen. Ein kleines Beispiel dafür ist die im nativen StarBasic unbekannte globale Variable selection, die alle markierten Zellen enthält. Mit einer For-Each-Schleife ändern Sie dann z. B. schnell in allen markierten Zellen die dort gespeicherten Werte:
Option vbasupport 1
Sub TestVBA
For Each zelle in selection
zelle = zelle+1
Next zelle
End Sub
Dieses einfache Beispiel setzt voraus, dass alle markierten Zellen einen numerischen Inhalt haben, also nicht Text oder Formeln enthalten. Um das gleiche Ergebnis ohne die VBA-Funktionen zu erhalten, wäre der StarBasic-Code aus Listing 3:
Zellen aus Bereich bearbeiten
Sub TestOOO
sel = ThisComponent.getCurrentSelection().rangeAddress
blatt = ThisComponent.CurrentController.ActiveSheet
For j = sel.startColumn TO sel.EndColumn
For i = sel.startRow TO sel.EndRow
zelle = blatt.getCellByPosition(j,i)
zelle.value = zelle.value + 1
Next
Next
End Sub
StarBasic kann auch die aktuelle Auswahl erkennen, aber es ist nicht möglich, mit For Each alle Zellen der Auswahl anzusprechen; stattdessen ist hier eine geschachtelte Schleife nötig. Auch muss das Makro den Zellwert explizit über zelle.value = zelle.value + 1 ansprechen, während VBA die gewünschte Rechenoperation auch “versteht”, wenn Sie einfach zelle = zelle +1 schreiben.
VBA kennt verschiedene Kurznotationen, um bestimmte Zellen anzusprechen. OpenOffice unterstützt bei aktiviertem VBA-Support direkte Zellangaben wie [C1] für einzelne Zellen und [B3:F6] für Zellbereiche. Damit sind Skripte der folgenden Art möglich:
Sub Test
[A1] = "Ich bin Text in Zelle A1"
For Each zelle in [B2:F3]
zelle = "Test"
Next zelle
End Sub
Das Kursivsetzen geht jetzt auch einfacher, bei aktiviertem VBA-Support können Sie statt der Zeilen in Listing 1
For Each zelle in [B2:C5] Zelle.Font.Italic = True Next
Tatsächlich geht es sogar noch kürzer, weil auch VBA-Zellbereiche das Italic-Attribut haben:
[B2:C5].Font.Italic = True
Das ist schneller hingeschrieben und auch leichter verständlich, darum ist es schade, dass StarBasic nicht von Haus aus solche Kurznotationen unterstützt.
Fazit
Für Gelegenheitsmakroprogrammierer bedeutet der VBA-Support in OpenOffice eine deutliche Erleichterung, denn Makros mit überschaubaren Aufgabengebieten sind in VBA leichter erstellt. Wer schon Vorkenntnisse aus früheren Experimenten mit VBA in Excel und Word hat, profitiert zudem davon, dass kein vollständiges Umlernen nötig ist. Wer ambitionierte Projekte angehen will, kommt nicht daran vorbei, sich mit UNO vertraut zu machen. Einiges an Literatur gibt es auch gratis im Internet, z. B. das StarOffice-8-Programmierhandbuch [4] und eine (englischsprachige) Anleitung zum Portieren von VBA-Makros [5]. Im Wiki gibt es einen Basic-Guide [6] (Abbildung 3), leider auch nur auf Englisch.

Abbildung 3: Das Basic Programming Guide unterliegt als Wiki regelmäßigen Aktualisierungen – leider nur auf Englisch.
Damit endet unsere kleine Einführung in die OpenOffice-Makroprogrammierung. Wenn Sie nun selbst experimentieren und dabei das eine oder andere nützliche Makro erstellen, dann lassen Sie doch die übrigen EasyLinux-Leser daran teilhaben: Wir werden einen kleinen Bereich auf der Heft-DVD für Ihre Beiträge reservieren.
[1] Thomas Krumbein: “Makros in OpenOffice.org Basic/StarBasic”, Galileo Computing, 2008
[2] StarBasic-Konstanten: http://api.openoffice.org/docs/common/ref/com/sun/star/awt/module-ix.html
[3] Zeichenattribute: http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Text/Formatting
[4] StarOffice-8-Programmierhandbuch für BASIC: http://dlc.sun.com/pdf/819-1326/819-1326.pdf
[5] Porting Excel/VBA to Calc/StarBasic: http://documentation.openoffice.org/HOW_TO/various_topics/VbaStarBasicXref.pdf
[6] BASIC Programming Guide: http://wiki.services.openoffice.org/wiki/Documentation/BASIC_Guide
[7] StarBasic-Workshop, Teil 1: Hans-Georg Eßer, “Tabellenprogrammierer”, EasyLinux 04/2008, S. 77 ff., https://www.linux-community.de/artikel/16898
[8] StarBasic-Workshop, Teil 2: Hans-Georg Eßer, “Tabelle unter Kontrolle”, EasyLinux 02/2009, S. 83 ff., https://www.linux-community.de/artikel/17467


