| Der Umgang mit Zellen und Bereichen von Kalkulations-Blättern ist die Grundlage für den Austausch von Daten zwischen dem Kalkulations-Programm und Basic. | Auf dieser Seite finden sie einige ausgewählte Beispiele zu diesem Thema: Adressierung von Zellen und Bereichen, sowie Zugriff auf deren Inhalt. |
Basic
|
LibreOffice-Basic und MS-Visual Basic for Applications |
| Basic-Funktionen | |
| Range | Ein ReadOnly-Bereich von Zellen |
| Objekte in Basic-Subs | |
| Allgemein | Umgang mit Basic-(VBA)-Objekten |
Workbook
|
Das Datei-Objekt |
Worksheet
|
Ein Arbeitsblatt als Objekt |
| Range | Ein Bereich von Zellen auf einem Arbeitsblatt |
| Cells | Eine bestimmte Zelle in einem Bereich |
| Eigenschaften & Methoden: | |
| Aktivierung | EIn bestimmtes Objekt anzeigen |
| Name | Namen statt Adressen für Bereiche |
| Value | Werte von Zellen |
| Formula | Formeln in berechneten Zellen |
| Clear | Bereiche löschen |
| Sort | Sortieren von Bereichen |
Bereiche als Argumente von Basic-Funktionen |
|
|
Basic-Funktionen werden meistens zum Rechnen verwendet. Daher braucht man oft
Zahlen (d.h. die Typen Integer, Double, ....) oder
Text (String), jedoch nur selten Objekte. ► Wichtige Ausnahmen sind die Objekte Range und Cell: Es ist möglich, als Argument einen Bereich von Zellen anzugeben, z.B. =range_demo(A1:C10) und die Werte des angegebenen Bereichs in der Funktion zu lesen. |
Typische Anwendungen sind z.B. Funktionen wie Anzahl, Minimum, Mittelwert,
Maximum, Summe, ... • Normalerweise ist es für eine Funktion jedoch nicht erlaubt, den Inhalt des angegebenen Bereichs zu ändern. |
|
Die rechts gezeigte Funktion hat keinen praktischen Wert, sondern demonstriert
lediglich die Verwendung einer Variablen vom Typ Range Die Funktion berechnet alternativ die anzahl der Zellen im angegebenen bereich oder die summe der Werte aller Zellen im bereich oder deren Mittelwert (miwe). Jedes Range-Objekt verfügt über einige nützliche Einschaften und Methoden, z.B. die Eigenschaft Count, welche an die Variable anzahl zugewiesen wird. Alle Zellen des Bereichs werden typisch in einer For-Each-Schleife durchlaufen. Dabei wird je eine Zelle des Bereichs als Objekt an die Variable c zugewiesen, die ebenfalls vom Typ Range sein muss. Innerhalb der Schleife kann man alle Eigenschaften der jeweiligen Zelle lesen, z.B. mit der Eigenschaft Value den jeweiligen Wert. Nach dem Ende der Schleife wird zur Demonstration der Mittelwert miwe berechnet und eines der 3 möglichen Ergebnisse zurückgegeben. |
Basic-Funktion zur (alternativen)
Berechnung von Anzahl, Summe oder Mittelwert der Zellen eines Bereichs:
Function range_demo(bereich As Range) As Double
Dim anzahl As Integer Dim wert, summe, miwe As Double Dim c As Range
anzahl = bereich.Count
End Function
summe = 0 For Each c In bereich
wert = c.Value
Nextsumme = summe + wert miwe = summe / anzahl range_demo = summe
'range_demo = CDbl(anzahl)
'range_demo = miwe In dieser Version wird die Summe aller Werte im bereich berechnet. Wenn man (durch Entfernen des führenden Kommentar-Zeichens) eine der beiden anderen Zeilen einschaltet, kann man alternativ Anzahl oder Mittelwert zurückgeben. |
Option VBASupportDie meisten einfachen Funktionen sind zwischen LibreOffice-Calc und MS-Excel ohne Änderung portabel. Einige wenige Elemente sind nicht portabel, darunter der Variablen-Typ Range• Die von LibreOffice-Basic ohne diese Option für einen Bereich von Zellen verwendete Syntax ist kompliziert und nicht nach MS-VBA portabel. |
● Man kann die einfache MS-VBA Syntax auch in LibreOffice-Basic verwenden, wenn man am Anfang des Basic-Moduls (vor der ersten Basic-Function) diese Zeile einfügt: Option VBASupport 1
• Diese Option ist in MS-VBA nicht verwendbar: Man schaltet sie allenfalls mit einem vorangestellten Kommentar-Zeichen ab: ' Option VBASupport 1 |
Objekte in Basic-Subs |
|
| Alle ab hier folgenden Kapitel dieser Seite beziehen sich auf Basic-Subs. Subs sind im Gegensatz zu ↑ Functions wenig portabel und stark an das jeweilige Programm gebunden. | Die Angaben aller folgenden Kapitel beziehen sich vorzugsweise auf MS-VBA und sind ohne Änderungen nicht auf LibreOffice übertragbar. |
| Das oberste Objekt der Hierarchie ist in LibreOffice-Basic das Objekt ThisComponent, in VBA das Objekt Application. Alle anderen Objekte sind ihm untergeordnet. | Die Hinweise in diesem Kapitel ersetzen kein Manual. Sie sollen lediglich als Anregung dienen, wonach sie (z.B. in der Basic-Hilfe) suchen sollen. |
Listen (Arrays):► Das übergeordnete Objekt jeder Objekt-Art ist die jeweilige Objekt-Liste (→ Array).► Der Name der Liste besteht normalerweise aus der Objekt-Bezeichnung und "s". ► In der Liste sind alle betreffenden Objekte enthalten und werden als Elemente (wien in jedem anderen Array) adressiert. ► Beispiel: Die Listen Sheets, Worksheets enthalten alle Sheet-bzw. Worksheet-Objekte einer geöffneten Kalkulations-Datei). ♦ Details zu Arrays in Basic und VBA |
Liste aller Sheet-Objekte in LibreOffice-Basic:
Sub sheets_list()
Liste aller Worksheet-Objekte in VBA
Dim sh, Sheets As Object
Sheets = ThisComponent.Sheets
End Sub
For Each sh in Sheets MsgBox "Sheet " & sh.Name
Next
Sub worksheets_list()
Dim ws As Worksheet
For Each ws In Worksheets
End Sub
MsgBox "Worksheet " & ws.Name
Next |
Länge einer Liste:Die Eigenschaft Count bezeichnet die Länge einer Liste = Anzahl der darin enthaltenen Elemente. |
Anzahl der Sheets in LibreOffice-Basic:
Sub sheets_count()
Anzahl der WorkSheets in VBA:
Dim Sheets As Object Sheets = ThisComponent.Sheets MsgBox (Sheets.Count & " Sheets")
End Sub
Sub worksheets_count()
MsgBox (Worksheets.Count & " Worksheets")
End Sub
|
Adressierung nach IndexLibreOffice verwendet wie die gesamte moderne Informatik Indices (0...Count-1), VBA verwendet Indices (1...Count)In beiden Beispielen wird das erste Kalkulations-Blatt adressiert. Die Zuweisung zu einer Objekt-Variablen erfolgt in LibreOffice genauso wie für jede andere Variable, in VBA jedoch mit der Anweisung Set |
Adressierung eines Sheets mit Index in LibreOffice-Basic
Sub sheet_nr()
Adressierung eines Worksheets mit Index in VBA
Dim mysh, Sheets As Object Sheets = ThisComponent.Sheets
End Sub
mysh = Sheets(0) MsgBox "Sheet.Name=" & mysh.Name
Sub worksheet_nr()
Dim myws as Worksheet
Set myws = Worksheets(2)
End Sub
MsgBox "Worksheet.Name=" & myws.Name |
Adressierung nach NameAlternativ kann man ein Objekt mit seinem Namen (String) adressieren.Zu einem (Work)Sheet navigierenZur Demonstration wird das mit seinem Namen bezeichnete Blatt angezeigt. In LibreOffice verwendet man dazu die Methode setActiveSheet() des Controllers, in VBA die Methode Select des Worksheet-Objekts.In beiden Fällen wird das Worksheet "Tabelle2" angezeigt. |
Adressierung eines Sheets mit Name in LibreOffice-Basic
Sub sheets_name()
Adressierung eines Worksheets mit Name in VBA
Dim mysh, Sheets As Object
Sheets = ThisComponent.Sheets
End Sub
mysh = Sheets.getByName("Tabelle2") ThisComponent.getcurrentController.setActiveSheet(mysh)
Sub worksheets_name()
Dim ws, n
Set ws = Worksheets("Tabelle2")
End Sub
ws.Select |
Schleife über alle ObjekteDie Anweisung For Each ... Next durchläuft alle Objekte einer Liste. |
Ein Beispiel dazu finden sie ganz oben in diesem Kapitel. |
Das aktive ObjektIn einer Liste kann ein Objekt gerade ausgewählt (im Vordergrund, markiert, usw.) sein. Dafür gibt es meist eine eigene Bezeichnung, die mit "Active" beginnt.In LibreOffice kann man einige Eigenschaften der aktiven Datei ThisComponent lesen, allerdings erst dann, wenn diese erstmals gespeichert wurde. VBA führt die aktive Datei als Objekt ActiveWorkbook, das aktive Arbeitsblatt ebenso wie LivbreOffice als ActiveSheet |
Aktive Datei und Sheet in LibreOffice-Basic
Sub sheet_active()
Aktives Arbeitsblatt und Worksheet in VBA
Dim sh As Object
MsgBox "Location=" & ThisComponent.Location
End Sub
sh = ThisComponent.CurrentController.ActiveSheet MsgBox ("ActiveSheet = " & sh.Name)
Sub worksheet_active()
Dim wb, ws
Set wb = ActiveWorkbook
End Sub
Set ws = ActiveSheet MsgBox (wb.Name & "!" & ws.Name) |
|
Suchen sie in der MS-Excel Visual Basic Referenz
nach Objekten, Eigenschaften und Methoden.Der VBA-Interpreter bietet ein angenehmes Service: Deklarieren sie ein Objekt. Verwenden sie das Objekt in einer Programmzeile und setzen sie danach einen Punkt: VBA zeigt oft (warum nicht immer ??) eine Liste aller verwendbaren Elemente an, aus der man bequem durch Mausklick wählen kann. |
Automatische Anzeige der Unter-Objekte, Eigenschaften und Methoden durch
den VBA-Interpreter:
|
Worksheet - ein Kalkulations-Arbeitsblatt |
|
Liste, Anzahl und Adressierung der Worksheets
|
entnehmen sie dem Kapitel Objekte weiter oben auf dieser Seite. |
|
Ausgewählte Unter-Objekte, Eigenschaften und Methoden:
ActiveSheet
ws.Cells, ws.ChartObjects, ws.Name ws.Activate, ws.Calculate, ws.Delete, ws.PrintOut, ws.SaveAs, ws.Select |
Sub worksheet_demo()
Dim ws As Worksheet
Set ws = Worksheets("Tabelle2")
End Sub
ws.Activate |
Events:Sind genauso zu behandeln wie im Kapitel Workbook beschrieben.► Das Ereignis (Event) Worksheet_Activate tritt bei jedem Aktivieren eines Worksheets auf. ► Ein wichtiges Ereignis ist Worksheet_Change: es tritt bei jeder Änderung im Worksheet auf. ► Die Variable Target enthält die Information, wo und was geändert wurde. ► Verzweigen sie nach Target.Address, um auf Änderungen bestimmter Bereiche zu reagieren und ignorieren sie alle anderen Änderungen (Exit Sub). ► Danach besteht die Möglichkeit, Verzweigungen (wie hier mit Select Case) je nach dem eingetragenen Wert auszuführen. |
Private Sub Worksheet_Activate()
MsgBox("event Worksheet_Activate") End Sub Private Sub Worksheet_Change(ByVal Target As range) Dim m as String
'MsgBox ("Changed = " & Target.Address)
If Target.Address <> "$A$1" Then
'Verzweigung nach Adresse Exit Sub
End IfMsgBox ("Changed = A1") ' Verzweigung nach eingetragenem Wert
Select Case Target
Case 1: m = "eins"
End Select&Case 2: m = "zwei" Case Else: m = "?" MsgBox (m) |
Range - Ein Bereich von beliebig vielen Zellen |
|
|
►
Wenn sie auf einem Kalkulations-Blatt eine Zelle anklicken, dann haben
sie einen Bereich von 1 Zelle ausgewählt. ► Wenn sie die Maus mit gedrückter Maustaste über das Kalkulations-Blatt ziehen, dann wählen sie einen rechteckigen Bereich mehrerer Zellen aus. ► Bereiche werden in Kalkulations-Formeln durch die Syntax Anfangs-Zelle:End-Zelle
ausgedrückt, z.B: "A1:C5" (relativ
adressiert) oder "$A$1:$C$5" (absolut adressiert)
oder "Tabelle1!A1C5" (mit Angabe des Arbeitsblatts).
|
Die hier vorgestellte Basic-Syntax ('Grammatik') zur Arbeit mit Bereichen
ist die einfache, von MS-VBA verwendete Version. Sie ist auch in
LibreOffice
verwendbar, wenn man am Beginn des Moduls diese Option angibt:
Option VBASupport 1
In MS-VBA ist diese Option nicht verwendbar: Die Zeile wird mit einem
vorangestellten Kommentar-Zeiochen abgeschaltet:
' Option VBASupport 1
|
|
Das Beispiel rechts zeigt, wie man Bereiche in Basic adressiert und verwendet. • Wie für alle anderen Objekte erfolgt die Zuweisung an eine Variable mit der Set-Anweisung. • Die Eigenschaft Value eines Range-Objekts bezeichnet seinen aktuellen Wert. Das Beispiel zeigt, wie man den Wert einer einzelnen Zelle lesen und schreiben kann. |
Dim x,y as Range
Dim z // Adressierung
Set x = Range("A1")Set y = Range("A1:C5") // Lesen
z = Range("B1").Value
// Schreiben
Range("B1").Value = 123Range("B1").Value = "xyz" |
|
Anzahl und Adressierung der Zellen eines Range Die Zellen eines beliebig großen Bereichs werden durch einen ganzzahligen Index (1 .. Count) fortlaufend adressiert. Wenn sie bestimmte Zellen adressieren wollen, verwenden sie dazu ↓ Cells Das Beispiel funktioniert in LibreOffice ebenso wie in MS-Excel. Die Ausführung eines Basic-Sub erfolgt je nach Programm und Version unterschiedlich. Die Zuweisung des Sub an ein Objekt ist eine bedienungs-freundliche Variante: • Erzeugen sie im Kalkulations-Blatt ein beliebiges Objekt (Zeichnen/Rechteck, Grafik, ...), markieren sie es mit Rechtsklick und binden sie das Sub mit 'Makro zuweisen' an das Objekt. Das Sub wird beim Anklicken des Objekts ausgeführt. |
Demonstration: Größe und Werte des Bereichs A1:A3
Option VBASupport 1 ' Nur in LibreOffice
Sub range_demo() Dim i As Integer Dim sr As Range Dim v
Set sr = Range("A1:A3")
End Sub
MsgBox("Count = " & sr.Count) For i = 1 To sr.Count
v = sr(i).Value
Next i
MsgBox("Value(" & i & ")=" & v) |
Namen:Verwenden sie nach Möglichkeit Namen für Zell-Bereiche, die mit Basic adressiert werden sollen.
Namen sind unempfindlich gegen Änderungen im Arbeitsblatt. Adressen werden durch
Einfügen oder Löschen von Zellen geändert !Die Definition der Namen erfolgt je nach Programm-Version unterschiedlich, z.B.: • Markieren sie den zu benennenden Bereich • Menü • Alternative: Im Adress-Fenster (links oberhalb des Zellen-Bereichs) wird die Adresse des markierten Bereichs oder seiner ersten Zelle angezeigt. Tragen sie hier einen Namen ein und schließen sie die Eingabe mit der <return>-Taste ab. |
• Sichere Programmierung, funktioniert auch dann, wenn der Bereich verschoben, vergrößert oder verkleinert wurde: Set sr = Range("bereichsname")
• Weniger empfehlenswert: funktioniert nicht mehr, wenn die Adresse geändert wurde: Set sr = Range("A1:A3")
|
Aktivierung - Navigation mit VBA |
|
| Die Methode Activate kann zur Navigation verwendet werden. Je komplexer eine Lösung, desto wichtiger ist eine übersichtliche Navigation. | Die Navigation kann durch Anklicken von Buttons erfolgen, oder vollautomatisch. |
Splash-Screen:Beim Öffnen eines komplexen Dokuments wird (auch in Kalkulations-Programmen !) eine übersichtliche Startseite angezeigt. Beachten sie: der Event-Handler muss sich im Workbook-Objekt befinden ! |
Private Sub Workbook_Open()
Worksheets("Start").Activate
End Sub
|
Sprung zu einem Arbeitsblatt:Dieses Programm befindet sich in einem VBA-Modul. Wenn sie nicht wollen, dass es in der Makro-Liste angezeigt wird, dann verwenden sie Private Sub.► Jedes grafische Objekt (Icon-Bild, Button, Shape, Chart, Textfeld...) lässt sich mit diesem Programm verknüpfen. |
Sub goto_tabelle1()
Worksheets("Tabelle1").Activate
End Sub
|
Sprung zu einer Zelle:So können sie eine bestimmte Zelle oder einen Bereich auswählen. Wenn sie die Angaben von Workbook und Worksheet weglassen, werden diese automatisch durch ActiveWorkbook und ActiveSheet ersetzt. Mit der Aktivierung einer Zelle setzen sie gleichzeitig die Eigenschaft ActiveCell |
Sub goto_range()
'Range("A1").Activate
Worksheets("Tabelle1").Range("A1").Activate
|
Value - Der Wert einer Zelle |
|
| Eigenschaft Value liefert den Wert einer Zelle, genauso wie er angezeigt wird. Dabei ist unerheblich, ob dieser Wert manuell (oder durch Basic) eingegeben wurde oder durch eine ↓ Formel berechnet. |
Sub value_demo()
Dim r As Range
Set r = Range("A1")
End Sub
MsgBox ("Value = " & r.Value) |