Tutorial: Excel-Makros bei Zelländerung automatisch ausführen
Hier ist ein ausführliches Tutorial, wie du Makros in Excel automatisch startest, wenn sich Zellwerte ändern.
In Excel gibt es Situationen, in denen ein Makro nicht erst durch das Klicken eines Buttons, sondern automatisch starten soll – zum Beispiel, wenn ein Wert in eine Zelle eingegeben oder ein Eintrag in einer Dropdown-Liste (Datenüberprüfung) ausgewählt wird.
Dies erreichen wir mit dem sogenannten Worksheet_Change Ereignis.
Schritt 1: Den VBA-Editor öffnen
Der Code für Zelländerungen gehört nicht in ein Standard-Modul, sondern direkt in das Codefenster des jeweiligen Tabellenblatts.
- Öffne deine Excel-Datei.
- Mache einen Rechtsklick unten auf den Reiter des Tabellenblatts (z. B. "Tabelle1").
- Wähle Code anzeigen.
- Ein Fenster (VBA-Editor) öffnet sich. Das große weiße Feld ist der Bereich für deinen Code.
Schritt 2: Grundstruktur des Codes
Kopiere diese Grundstruktur in das Fenster. Sie stellt sicher, dass das Makro nur reagiert, wenn eine bestimmte Zelle geändert wird:
Private Sub Worksheet_Change(ByVal Target As Range)
' "Target" ist die Zelle, die gerade geändert wurde
' Hier prüfen wir, ob die Änderung in unserer Ziel-Zelle passiert ist
If Not Intersect(Target, Range("A1")) Is Nothing Then
' HIER DEIN CODE ODER MAKRONAME
MsgBox "Die Zelle A1 wurde geändert!"
End If
End Sub
Szenario 1: Änderung einer einzelnen Zelle (z. B. Drop-down)
Wenn du eine Drop-down-Liste in Zelle B5 hast und bei jeder Auswahl ein Makro starten möchtest, sieht der Code so aus:
Private Sub Worksheet_Change(ByVal Target As Range)
' Prüfen, ob Zelle B5 geändert wurde
If Target.Address = "$B$5" Then
Call MeinMakroName ' Ersetze dies durch den Namen deines Makros
End If
End Sub
Szenario 2: Änderung innerhalb eines Bereichs (Range)
Möchtest du reagieren, wenn irgendeine Zelle im Bereich A1 bis C10 geändert wird?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Bereich As Range
Set Bereich = Range("A1:C10")
' Prüfen, ob die geänderte Zelle (Target) im Bereich liegt
If Not Intersect(Target, Bereich) Is Nothing Then
MsgBox "Änderung im Bereich A1:C10 erkannt!"
End If
End Sub
Szenario 3: Reagieren auf einen spezifischen Wert
Du möchtest, dass das Makro nur startet, wenn in der Zelle D1 das Wort "Start" ausgewählt oder eingegeben wurde:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D1")) Is Nothing Then
If Target.Value = "Start" Then
MsgBox "Das Makro wird jetzt ausgeführt, weil 'Start' eingegeben wurde."
End If
End If
End Sub
Wichtiger Hinweis: Endlosschleifen vermeiden!
Wenn dein Makro selbst Werte in die Tabelle schreibt, würde das Worksheet_Change Ereignis erneut ausgelöst werden – es entsteht eine Endlosschleife. Um das zu verhindern, musst du die Ereignisse kurzzeitig ausschalten:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
' Ereignisse deaktivieren
Application.EnableEvents = False
' Dein Code (der z.B. Zellen verändert)
Target.Offset(0, 1).Value = "Geändert am " & Now
' Ereignisse unbedingt wieder aktivieren!
Application.EnableEvents = True
End If
End Sub
Zusammenfassung: Worauf musst du achten?
- Speicherformat: Deine Excel-Datei muss als Excel Arbeitsmappe mit Makros (.xlsm) gespeichert werden.
- Target: Das Objekt
Targetrepräsentiert die Zelle, die die Änderung ausgelöst hat. Du kannst mitTarget.ValueoderTarget.Addressarbeiten. - Formeln: Das
Worksheet_ChangeEreignis reagiert nicht auf Änderungen durch Formeln. Wenn sich ein Wert in A1 ändert, weil dort=B1+C1steht, wird das Ereignis nicht ausgelöst. (Dafür bräuchte man dasWorksheet_CalculateEreignis). - Platzierung: Der Code muss zwingend im Modul des jeweiligen Tabellenblatts stehen (z.B. "Tabelle1"), nicht in "Modul1" oder "DieseArbeitsmappe".
Viel Erfolg beim Automatisieren deiner Excel-Tabellen!