Bekanntlich gibt es in Excel Arbeitsmappen, die wiederum aus Arbeitsblättern bestehen. Innerhalb eines Arbeitsblatts gibt es Zellen, die zu Zellbereichen zusammengefasst werden können. In jedem Arbeitsblatt ist stets genau eine Zelle die aktive Zelle. Wechselt man das Arbeitsblatt, ist auch automatisch eine andere, darin enthaltene Zelle die aktive Zelle. Für VBA sind all das Objekte.
Hier sehen wir eine Mappe namens „Mappe1.xlsm“ mit 4 Arbeitsblättern, auf die sich die folgenden Beispiele beziehen. Tabelle1 ist aktiv, darin ist B2:C4 als „MeinBereich“ benannt und zugleich auch ausgewählt. B2 ist die aktive Zelle:
Mappe1.xlsm | |||||
---|---|---|---|---|---|
✗ ✔ ƒx =ZUFALLSBEREICH(1;6) | |||||
A | B | C | D | E | |
1 | Team1 | Team2 | |||
2 | 1. Würfel | 1 | 3 | ||
3 | 2. Würfel | 6 | 3 | ||
4 | 3. Würfel | 2 | 6 | ||
5 | |||||
6 | |||||
Tabelle1 Tabelle2 Tabelle3 Tabelle4 |
In VBA gibt es für Arbeitsmappen Workbook
-, für Arbeitsblätter
Worksheet
-, für Zellen Cells
- und für Bereiche
Range
-Objekte. Diese Objekte sind natürlich auch über die entsprechende
Auflistung des jeweils übergeordneten
Objekts ansprechbar. Einfacher geht es oft, mit ActiveWorkbook
,
ActiveSheet
oder ActiveCell
auf die aktiven Objekte
zuzugreifen. Die folgenden Debug.Print
-Anweisungen geben stets den
gleichen Wert, nämlich die aktive Zelle B2 aus:
Public Sub Zellwert() Debug.Print Workbooks("Mappe1.xlsm").Worksheets(1).Range("B2") Debug.Print Workbooks(1).Worksheets("Tabelle1").Range("B2") Debug.Print Workbooks(1).Worksheets("Tabelle1").Cells(2, 2) Debug.Print ActiveWorkbook.Worksheets("Tabelle1").Cells(2, 2) Debug.Print ActiveSheet.Cells(2, 2) Debug.Print ActiveCell Debug.Print Workbooks(1).Worksheets(1).Range("MeinBereich").Cells(1) End Sub
Sowohl Range
als auch Cells
geben Bereiche zurück.
Sie unterscheiden sich allerdings, wie man sieht, in der Syntax. Außerdem kann
Cells
immer nur genau eine Zelle zurückgeben, während es bei
Range
mehrere sein können, wie das letzte Beispiel zeigt. Dort wird
aus dem, mit Range
angegebenen Bereich „MeinBereich“ die erste Zelle
zurückgegeben, und zwar wiederum mit Cells
. In der Praxis nutzt man
Cells
zumeist als zweidimensionales
Array, man kann aber auch, wie im letzten
Beispiel, nur einen Parameter angeben - dann wird der gesamte Bereich zeilenweise
durchlaufen.
Ein häufiges Einsatzgebiet für VBA in Excel ist das Durchlaufen einer Liste. Die folgende Sub zeigt, wie man das lösen kann: Hier wird einfach nur „erledigt“ in Spalte D geschrieben, aber natürlich könnte man so beispielsweise auch in jeder Zeile einen Wert auslesen und anhand dessen bestimmen, was passieren soll.
Public Sub Erledigt() Dim Zelle As Range Set Zelle = ActiveSheet.Range("MeinBereich").Cells(1) Do Until IsEmpty(Zelle.Value) 'Solange Zellen gefunden werden ... Zelle.Offset(0, 2) = "erledigt" '... Schreibe "erledigt" in Spalte D Set Zelle = Zelle.Offset(1) ' und gehe 1 Zeile nach unten Loop End Sub
Während man Werte einfach in Zellen schreiben kann, muss man für Formeln die
Zelleigenschaft FormulaLocal
(oder, falls man sprachunabhängigen Code
schreiben will, Formula
) verwenden:
ActiveSheet.Range("MeinBereich").FormulaLocal = "=ZUFALLSBEREICH(1;6)"
Will man umgekehrt Excelfunktionen in VBA verwenden, geht das mit dem
WorksheetFunction
-Objekt:
Debug.Print WorksheetFunction.Pi 3,14159265358979
Wie schon an anderer Stelle im Tutorial
erwähnt, kann eine Public Function
in Excel wie eine normale, in Excel
eingebaute Funktion verwendet werden (sog. Userdefined Function, UDF).
Ein vollständiger Überblick über das Objektmodell findet sich auf den Seiten von Microsoft. Alternativ kann man auch ein Buch zu Microsoft Excel bei Amazon kaufen. Bei den Lesern des VBA-Tutorials sind dabei besonders Einstieg in VBA mit Excel und VBA mit Excel: Das umfassende Handbuch beliebt.