Excel: Zellen und Bereiche per VBA

Im Artikel “Excel: Workbooks und Worksheets per VBA” haben wir uns angesehen, wie wir Arbeitsmappen und Arbeitsblätter mit VBA nutzen können. Im vorliegenden Artikel gehen wir einen Schritt weiter und nehmen uns die offensichtlichen Elemente eines Arbeitsblatts vor – die Zellen. Nicht weniger spannend sind allerdings die Bereiche, unter VBA “Range” genannt. Wie wir diese referenzieren, auslesen und bearbeiten können, zeigen wir auf den folgenden Seiten.

Worksheet referenzieren

Im oben genannten Artikel Excel: Workbooks und Worksheets per VBA (www.access-im-unternehmen.de/326) zeigen wir, wie Du Workbook– und Worksheet-Elemente referenzieren kannst. Im aktuellen Artikel verwenden wir oft das aktuelle Worksheet-Element als Basis für den Zugriff auf verschiedene Eigenschaften wie Range oder Cells.

Dieses können wir mit ActiveSheet referenzieren, allerdings bietet ActiveSheet kein IntelliSense an. Das liegt daran, dass ActiveSheet nicht nur ein Worksheet-Objekt, sondern auch ein Chart-Objekt zurückliefern könnte.

Um diese Einschränkung zu umgehen, referenzieren wir das Worksheet-Objekt jeweils mit folgenden Anweisungen:

Dim wks As Worksheet
Set wks = ActiveSheet

wks ist nun explizit als Worksheet-Objekt deklariert und liefert folglich dessen Elemente per IntelliSense. Wir werden die Deklaration und Zuweisung des aktuellen Worksheets nicht in jedem Beispiel explizit ausführen, sondern nach dem ersten Beispiel einfach mit wks arbeiten.

Gleichwohl sei erwähnt, dass Du innerhalb des VBA-Projekts einer Excel-Arbeitsmappe auch direkt die Range– oder die Cells-Eigenschaft nutzen kannst. Im Direktfenster erhältst Du also beispielsweise mit folgendem Ausdruck den Inhalt der Zelle mit der Adresse A1:

  Range("A1")

Da ich allerdings davon ausgehe, dass Du auch von anderen Anwendungen wie Access, Word oder Outlook oder auch von COM-Add-Ins auf die Inhalte von Excel-Arbeitsmappen zugreifen willst, verwenden wir immer die explizite Angabe der Objekte.

Einzelne Zelle über die A1-Notation per Range referenzieren

Im Excel-Arbeitsblatt erhalten wir schon Hinweise darauf, wie ein Weg zum Referenzieren einer Zelle aussehen könnte (siehe Bild 1).

Die Bezeichnung der aktuellen Zelle, hier A1

Bild 1: Die Bezeichnung der aktuellen Zelle, hier A1

Damit sind die Spalten- und Zeilenüberschriften gemeint, die aus Buchstaben und Zahlen bestehen. Die Spaltenköpfe enthalten zunächst die Buchstaben von A bis Z, dann geht es mit AA bis ZZ weiter und dann mit AAA bis XFD, was der Spalte 16.384 entspricht. Die Zeilenköpfe enthalten die Zahlen von 1 bis 1.048.576.

Eine Zelle hat eine Benennung, die aus dem Buchstaben der Spalte und der Zahl der Zeile besteht. Die Zeile oben links heißt also A1, während die Zeile ganz unten rechts XFD1048576 heißt (ich hoffe, Elon Musk liest das nicht, sonst benennt er sein nächstes Kind nach dieser Zelle).

Diese Bezeichnung ist auch gleichzeitig der erste Weg, mit dem wir auf eine Zelle zugreifen können. Um beispielsweise über den Ausdruck A1 auf eine Zelle zugreifen zu können, verwenden wir die Range-Eigenschaft des Worksheet-Objekts:

Public Sub ZelleMitRange()
     Dim wks As Worksheet
     Set wks = ActiveSheet
     Debug.Print wks.Range("A1")
End Sub

Dies gibt den Inhalt der Zelle im Direktbereich aus.

Einzelne Zelle über die R1C1-Notation per Cells referenzieren

Wenn Du den numerischen Index der Zeile und Spalte der Zelle kennst, die Du referenzieren möchtest, kannst Du auch die Cells-Eigenschaft nutzen.

Diese erwartet als Parameter die Angabe des Zeilenindexes und des Spaltenindexes in der R1C1-Notation.

Das R und das C in dieser Bezeichnung stehen für die englischen Begriffe für Zeile und Spalte, also Row und Cell. Der folgende Ausdruck liefert folglich den Inhalt der Zelle in der ersten Zeile und der ersten Spalte:

Debug.Print wks.Cells(1, 1)

Für eine andere Zeile, zum Beispiel die zweite, änderst Du den Wert des ersten Parameters. So erhältst Du den Inhalt der Zelle A2:

Debug.Print wks.Cells(2, 1)

Aktuelle Zelle referenzieren

Um die aktuelle Zelle zu referenzieren, benötigen wir gar kein Worksheet-Objekt – dieses wird explizit ermittelt. Um den Inhalt der aktuellen Zelle auszugeben, nutzen wir die folgende Anweisung:

Debug.Print ActiveCell

Mehrere Zellen mit Range referenzieren

Während beiden zuvor beschriebenen Beispiele sich jeweils auf das Referenzieren einer einzelnen Zelle beschränkten, können wir mit der Range-Eigenschaft auch mehr als eine Zelle gleichzeitig referenzieren.

Hier können wir die A1-Notation verwenden, über einen kleinen Umweg aber auch die R1C1-Notation. Angenommen, wir wollen einen Bereich mit allen Zellen des Worksheets aus Bild 2 referenzieren.

Beispielzellen

Bild 2: Beispielzellen

Mehrere Zellen mit der A1-Notation

Wenn wir die Range-Eigenschaft mit der A1-Notation nutzen, lautet die Referenz wie folgt:

Set rng = wks.Range("A1:D4")

Dass wir wirklich den gewünschten Bereich referenzieren, können wir zum Beispiel durch die Ausgabe der Anzahl der Zeilen und Spalten erreichen:

Debug.Print "Zeilen: " & rng.Rows.Count
Debug.Print "Spalten: " & rng.Columns.Count

Die Ausgabe lautet:

Zeilen: 4
Spalten: 4

Wir geben also die linke obere und die rechte untere Zelle des Bereichs in einer Zeichenkette durch einen Doppelpunkt getrennt an.

Mehrere Zellen mit der R1C1-Notation

Wir können die Range-Eigenschaft mit der Cells-Eigenschaft in der Form kombinieren, dass wir die linke, obere und die rechte, untere zu referenzierende Zelle jeweils mit der Cells-Eigenschaft referenzieren und diese per Komma getrennt der Range-Eigenschaft übergeben.

Für den gleichen Bereich wie im vorherigen Beispiel lautet der Ausdruck dann:

Set rng = wks.Range(Cells(1, 1), Cells(4, 4))

Komplette Spalte mit Range referenzieren

Wenn Du eine komplette Spalte, zum Beispiel die Spalte A, mit einem Range-Elemente referenzieren möchtest, gibst Du den Bereich ohne Angabe von Zeilen an:

Set rng = wks.Range("A:A")

Für mehrere zusammenhängende Spalten, zum Beispiel Spalte A bis Spalte C:

Set rng = wks.Range("A:C")

Komplette Zeile mit Range referenzieren

Für das Referenzieren einer kompletten Zeile, beispielsweise der ersten Zeile, mit dem Range-Element nutzt Du den folgenden Ausdruck:

Set rng = Range("1:1")

Für mehrere zusammenhängende Zeilen verwendest Du analog zu den Spalten den folgenden Ausdruck für die ersten drei Zeilen:

Set rng = Range("1:3")

Nicht zusammenhängende Zellen referenzieren

Wenn Du einzelne Zellen oder Bereiche von Zellen referenzieren möchtest, die nicht unbedingt zusammenhängen, dann gibst Du diese für die Range-Methode durch Kommata voneinander getrennt an.

Für einzelne Zellen sieht das so aus:

Dim rng As Range
Set rng = wks.Range("A1, B2, C3, D4")
Debug.Print rng.Cells.Count ''gibt 4 aus

Auf die gleiche Weise kannst Du auch nicht unbedingt zusammenhängende Bereiche referenzieren, hier für die Bereiche A1 bis A4 und C1 bis C4:

Dim rng As Range
Set rng = wks.Range("A1:A4, C1:C4")
Debug.Print rng.Cells.Count ''gibt 8 aus

Wert aus einer Zelle lesen

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Visual Basic Entwickler:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar