Tutorial: Referenzieren von Zellen mit ActiveCell und Selection

Melden

Dieses Tutorial zeigt dir, wie du in Excel VBA (Visual Basic for Applications) mit der aktiven Zelle (ActiveCell) und einer getroffenen Auswahl (Selection) arbeitest.


In VBA gibt es oft Situationen, in denen du nicht eine feste Zelle (wie Range("A1")) bearbeiten willst, sondern die Zelle, die der Benutzer gerade angeklickt hat. Hierfür nutzt man ActiveCell und Selection.

1. Was ist der Unterschied?

Bevor wir in den Code springen, ist die Unterscheidung wichtig:

  • ActiveCell: Bezieht sich immer auf genau eine Zelle. Selbst wenn du einen großen Bereich markiert hast, ist nur eine Zelle die "aktive" (meist diejenige, in der du als Erstes geklickt hast oder die weiß bleibt).
  • Selection: Bezieht sich auf alles, was markiert ist. Das können eine Zelle, mehrere Zellen, ein ganzer Spaltenbereich oder sogar ein Objekt (wie ein Diagramm oder eine Form) sein.

2. Arbeiten mit ActiveCell

Die ActiveCell ist nützlich, um Daten an der aktuellen Cursorposition einzutragen oder auszulesen.

Wert in die aktive Zelle schreiben

Sub ActiveCellBeispiel()
    ' Schreibt Text in die aktive Zelle
    ActiveCell.Value = "Ich bin hier aktiv!"

    ' Formatiert die aktive Zelle fett
    ActiveCell.Font.Bold = True
End Sub

Informationen über die aktive Zelle abrufen

Sub WoBinIch()
    MsgBox "Die aktive Zelle ist: " & ActiveCell.Address
    MsgBox "Zeile: " & ActiveCell.Row
    MsgBox "Spalte: " & ActiveCell.Column
End Sub

3. Arbeiten mit Selection

Selection wird meistens verwendet, um Formatierungen auf einen ganzen Bereich anzuwenden, den der Benutzer markiert hat.

Den gesamten markierten Bereich formatieren

Sub FormatierungAnwenden()
    ' Prüfen, ob die Auswahl überhaupt Zellen sind (und kein Bild o.ä.)
    If TypeName(Selection) = "Range" Then
        Selection.Interior.Color = vbYellow
        Selection.Borders.LineStyle = xlContinuous
    End If
End Sub

Durch eine Auswahl iterieren (Schleife)

Wenn du jede Zelle in einer Auswahl einzeln bearbeiten willst, nutzt du eine For Each-Schleife:

Sub SelectionSchleife()
    Dim zelle As Range

    ' Gehe jede Zelle in der Auswahl durch
    For Each zelle In Selection
        ' Wenn der Wert in der Zelle kleiner als 0 ist, mache ihn rot
        If IsNumeric(zelle.Value) And zelle.Value < 0 Then
            zelle.Font.Color = vbRed
        End If
    Next zelle
End Sub

4. Wichtige Tipps & Fallstricke

A. Fehlerprüfung (TypeName)

Da Selection auch ein Diagramm oder eine Form sein kann, stürzt dein Makro ab, wenn du versuchst, Selection.Value zu ändern, während ein Bild ausgewählt ist. Nutze daher immer:

If TypeName(Selection) = "Range" Then
    ' Dein Code für Zellen
End If

B. ActiveCell innerhalb einer Selection

Die ActiveCell ist immer ein Teil der Selection. Wenn du einen Bereich von A1 bis B10 markierst, ist die Selection der ganze Block, aber die ActiveCell ist nur eine einzelne Zelle darin.

C. Geschwindigkeit (Best Practice)

In der professionellen VBA-Programmierung versucht man, .Select und Selection zu vermeiden, wenn man sie nicht unbedingt braucht. Es ist schneller, Zellen direkt anzusprechen:

  • Statt: Range("A1").Select -> Selection.Value = 10
  • Besser: Range("A1").Value = 10

Nutze ActiveCell und Selection also primär dann, wenn das Makro interaktiv auf die Benutzereingabe reagieren soll.


5. Zusammenfassung der Befehle

Befehl Beschreibung
ActiveCell.Value Inhalt der einen aktiven Zelle.
ActiveCell.Offset(1, 0) Referenziert die Zelle direkt unter der aktiven Zelle.
Selection.Count Gibt an, wie viele Zellen markiert sind.
Selection.ClearContents Löscht die Inhalte aller markierten Zellen.
Selection.Address Gibt den Bereich der Auswahl als String zurück (z.B. "$A$1:$C$10").

Übung für dich:

Schreibe ein Makro, das prüft, wie viele Zellen der Benutzer markiert hat. Wenn mehr als 10 Zellen markiert sind, soll eine Warnung per MsgBox erscheinen.

Lösungshilfe:

Sub CheckSelectionSize()
    If TypeName(Selection) = "Range" Then
        If Selection.Count > 10 Then
            MsgBox "Das sind zu viele Zellen!"
        End If
    End If
End Sub
0