TL;DR —
Worksheet_BeforeDoubleClickist ein Ereignis, das Excel in dem Augenblick auslöst, in dem Sie eine Zelle doppelklicken — bevor die Zelle in den Bearbeitungsmodus fällt. Es reicht Ihnen zwei Dinge:Target(die angeklickte Zelle) undCancel. Setzen SieCancel = True, und Excels Standardreaktion — der Wechsel in den Bearbeitungsmodus — wird unterdrückt, sodass Ihre Aktion das Einzige ist, was geschieht. Das verwandelt einen Doppelklick in eine Schaltfläche aus einer einzigen Geste: ein Häkchen umschalten, eine Zeile als erledigt markieren, zum Detail springen. Der Code liegt im eigenen Modul des Arbeitsblatts, und fast immer wollen Sie ihn mitIntersectauf eine einzige Spalte eingrenzen.
' Liegt im Modul des Blatts (Doppelklick auf Sheet1 unter Microsoft Excel Objekte).
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' Nur innerhalb von Spalte B handeln; jede andere Zelle bleibt wie gewohnt bearbeitbar.
If Intersect(Target, Me.Columns("B")) Is Nothing Then Exit Sub
Cancel = True ' <-- den Bearbeitungsmodus unterdrücken
Target.Value = IIf(Target.Value = "x", "", "x") ' Doppelklick schaltet eine Markierung um
End Sub
Die meisten Makros warten auf eine Schaltfläche. Worksheet_BeforeDoubleClick wartet auf
eine Geste — einen Doppelklick auf eine Zelle — und, was entscheidend ist, es läuft
bevor Excel das tut, was ein Doppelklick normalerweise bewirkt (die Zelle in den
Bearbeitungsmodus versetzen). Dieses „bevor“ ist der ganze Sinn: Sie dürfen die Geste
abfangen, entscheiden, was sie auf Ihrem Blatt bedeuten soll, und die Standardaktion
abbrechen. Es ist das Ereignis hinter Klick-zum-Abhaken-Aufgabenlisten, Drill-downs von
einer Übersicht zu ihren Quellzeilen und Aufklappen/Zuklappen-Schaltern — und es ist das
Ereignis, das die Leute verdrahten, ohne die eine Zeile, die es sich richtig anfühlen
lässt.
Was Sie lernen
- Das mentale Modell — ein Doppelklick ist eine Geste, die Sie kapern können,
Cancelunterdrückt seine Standardaktion - Die wichtigste Regel — vergessen Sie
Cancel = True, und die Zelle wechselt trotzdem in den Bearbeitungsmodus - Wie Sie das Ereignis mit
Intersectauf eine einzige Spalte eingrenzen, damit der Rest des Blatts bearbeitbar bleibt - Die Rückschreib-Falle — das Umschalten einer Zelle löst
Worksheet_Changeaus, also sichern Sie es ab - Blattebene gegenüber Arbeitsmappenebene — und wo der Code liegen muss
Das mentale Modell: eine Geste, die Sie kapern können, kein Klick, den Sie beobachten
Ein Doppelklick bedeutet für Excel bereits etwas: „diese Zelle in den Bearbeitungsmodus
versetzen.“ Wenn Sie Worksheet_BeforeDoubleClick schreiben, ruft Excel zuerst Ihren Code
auf und wartet — es hat den Bearbeitungsmodus noch nicht betreten. Sie erhalten Target,
genau die doppelt angeklickte Zelle, und Cancel, einen Boolean, der per Referenz
übergeben wird. Lassen Sie Cancel unangetastet, wechselt Excel, nachdem Ihr Code gelaufen
ist, in den Bearbeitungsmodus. Setzen Sie Cancel = True, tut es das nicht — die
Standardbedeutung des Doppelklicks wird verworfen und durch das ersetzt, was Ihr Handler
getan hat.
Der Handler heißt also nicht „sag mir Bescheid, wenn eine Zelle doppelt angeklickt
wird.“ Er heißt „lass mich neu definieren, was ein Doppelklick hier bewirkt.“ Diese
Umdeutung macht das Ereignis mächtig: Ein Doppelklick wird zu einem winzigen, mausnativen
Befehl — keine Schaltfläche, kein Menüband, nur zeigen und doppelklicken. Und wie jedes
Ereignis dieser Familie liegt es an einem bestimmten Ort. Dieses gehört in das eigene
Codemodul des Arbeitsblatts (doppelklicken Sie im Projekt-Explorer unter „Microsoft
Excel Objekte“ auf das Blatt) — nicht in ein gewöhnliches Module und nicht in
ThisWorkbook.
Die wichtigste Regel: ohne Cancel = True wird die Zelle trotzdem bearbeitet
Hier ist der Fehler, der ein Klick-zum-Umschalten-Blatt kaputt wirken lässt. Sie schreiben das Umschalten, vergessen aber die eine Zeile:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Target.Value = IIf(Target.Value = "x", "", "x") ' schaltet um ... dann bearbeitet Excel die Zelle
End Sub
Die Markierung schaltet um — und dann fällt die Zelle in den Bearbeitungsmodus,
blinkender Cursor inklusive, weil nichts Cancel gesetzt hat. Der Benutzer hat doppelt
geklickt, um eine Aufgabe als erledigt zu markieren, und landet bei einer Zelle im
Bearbeitungsmodus, die er nun mit Escape wieder verlassen muss. Ihre Aktion lief, aber
Excels Standardaktion lief ebenfalls, direkt obendrauf. Die Regel: Wenn Ihr Handler die
Bedeutung des Doppelklicks ersetzt, setzen Sie Cancel = True, damit die Standardaktion
nicht unter Ihnen feuert.
Cancel = True ' zuerst den Bearbeitungsmodus unterdrücken
Target.Value = IIf(Target.Value = "x", "", "x")
Dieses eine Flag ist der Unterschied zwischen „einem eleganten Ein-Klick-Umschalter“ und „einem Umschalter, der die Zelle obendrein ärgerlicherweise zum Bearbeiten öffnet.“ Setzen Sie es immer dann, wenn der Doppelklick Ihr Befehl ist und keine echte Bearbeitung.
Die Regel, die das Blatt benutzbar hält: grenzen Sie es mit Intersect ein
Ein nicht eingegrenzter Handler ist schlimmer als gar kein Handler. Läuft Ihr Code bei
jedem Doppelklick und setzt Cancel = True, haben Sie soeben das
Bearbeiten-per-Doppelklick für das gesamte Blatt abgeschaltet — der Benutzer kann nie
wieder eine Zelle doppelklicken, um sie zu bearbeiten. Das ist eine feindselige
Nebenwirkung, um die niemand gebeten hat.
Die Lösung besteht darin, nur innerhalb des Bereichs zu handeln, der anklickbar sein soll, und überall sonst auszusteigen:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' Wächter: nichts tun, es sei denn, der Klick liegt in der Spalte Done (B2:B100).
If Intersect(Target, Me.Range("B2:B100")) Is Nothing Then Exit Sub
Cancel = True
Target.Value = IIf(Target.Value = "x", "", "x")
End Sub
Intersect(Target, Me.Range("B2:B100")) liefert Nothing, wenn die doppelt angeklickte
Zelle außerhalb Ihres Zielbereichs liegt, sodass Exit Sub den Rest des Blatts normal
weiterarbeiten lässt — doppelklicken Sie irgendwo sonst, und es wird wie gewohnt
bearbeitet. Das ist derselbe Intersect-Wächter, der einen
Worksheet_Change-Handler davon abhält, bei jeder
Bearbeitung zu feuern, und er ist es, der eine gezielte Funktion von einer blattweiten
Übernahme trennt.
Die Falle, die sich später rächt: Ihr Schreiben löst ein weiteres Ereignis aus
In dem Moment, in dem Ihr Handler in eine Zelle schreibt — und das Umschalten einer
Markierung tut genau das —, löst er Worksheet_Change aus, weil Sie den Wert einer Zelle
geändert haben. Meistens ist das harmlos. Doch wenn dasselbe Blatt einen
Worksheet_Change-Handler hat, der ebenfalls schreibt (ein Zeitstempel, ein Protokoll,
eine neu berechnete Summe), können sich die beiden verketten, und im schlimmsten Fall
läuft das Schreiben erneut in Ihre eigene Logik hinein. Der Schutz ist die goldene Regel
der Ereignisfamilie: Umschließen Sie das Schreiben, damit es die Maschinerie nicht
auslösen kann.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Me.Range("B2:B100")) Is Nothing Then Exit Sub
Cancel = True
Application.EnableEvents = False ' mein Schreiben löst Worksheet_Change nicht aus
Target.Value = IIf(Target.Value = "x", "", "x")
Application.EnableEvents = True
End Sub
Tut Ihr Handler mehr als ein triviales Schreiben, legen Sie das EnableEvents = True
zusätzlich in einen Fehlerhandler, damit ein Absturz auf halbem Weg Ereignisse nicht für
die gesamte Sitzung abgeschaltet zurücklassen kann — dieselbe Disziplin, die in
Worksheet_Change beschrieben ist.
Die Unterscheidung, die über den Ort des Codes entscheidet: Blatt gegenüber Arbeitsmappe
Worksheet_BeforeDoubleClick ist ein Ereignis je Blatt — es liegt im Modul eines
einzelnen Arbeitsblatts und feuert nur für Doppelklicks auf diesem Blatt. Wollen Sie
dasselbe Verhalten auf jedem Blatt, fügen Sie den Handler nicht in zwölf Blattmodule ein.
Nutzen Sie den Zwilling auf Arbeitsmappenebene, Workbook_SheetBeforeDoubleClick, der in
ThisWorkbook liegt und Ihnen ein zusätzliches erstes Argument reicht, Sh, das Ihnen
verrät, welches Blatt angeklickt wurde:
' In ThisWorkbook - feuert für einen Doppelklick auf JEDEM Blatt.
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name <> "Tasks" Then Exit Sub
If Intersect(Target, Sh.Range("B2:B100")) Is Nothing Then Exit Sub
Cancel = True
Target.Value = IIf(Target.Value = "x", "", "x")
End Sub
Das ist dieselbe Wahl zwischen Blatt und Arbeitsmappe, die Sie bei
Worksheet_Activate gegenüber Workbook_SheetActivate
treffen: ein bestimmtes Blatt → das Modul des Blatts; irgendein Blatt → das
Arbeitsmappenmodul mit dem Argument Sh.
Wie ExcelMaster hilft
Ein guter Doppelklick-Handler besteht aus drei kleinen Entscheidungen, die man leicht auf
subtile Weise falsch trifft: der Intersect-Wächter, der den Rest des Blatts bearbeitbar
hält, das Cancel = True, das die Zelle am Wechsel in den Bearbeitungsmodus hindert, und
das EnableEvents-Tor um jedes Schreiben herum. Verfehlen Sie eine davon, und die Funktion
wirkt kaputt, auf eine Weise, die schwer zu diagnostizieren ist.
ExcelMaster
lässt Sie stattdessen das Verhalten beschreiben. Sagen Sie „ein Doppelklick auf eine Zelle
in Spalte B soll ein Häkchen umschalten und die Zelle nicht zum Bearbeiten öffnen“, und es
schreibt ein Worksheet_BeforeDoubleClick im richtigen Blattmodul, grenzt es mit
Intersect ein, setzt Cancel und sichert das Schreiben ab. Die Arbeitsmappe und der Code
bleiben Ihnen; Sie überspringen das Ausprobieren, welche Zeile was bewirkt.
Häufig gestellte Fragen
Wie führe ich in Excel ein Makro aus, wenn eine Zelle doppelt angeklickt wird?
Legen Sie eine Worksheet_BeforeDoubleClick-Prozedur in das Codemodul des Blatts:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean). Excel
ruft sie jedes Mal auf, wenn eine Zelle auf diesem Blatt doppelt angeklickt wird, und
übergibt Target (die Zelle). Fügen Sie dort Ihre Aktion ein. Für alle Blätter nutzen Sie
Workbook_SheetBeforeDoubleClick in ThisWorkbook.
Wie hindere ich die Zelle daran, beim Doppelklick in den Bearbeitungsmodus zu wechseln?
Setzen Sie Cancel = True innerhalb des Handlers. Excel prüft Cancel, nachdem Ihr Code
gelaufen ist; True unterdrückt die Standardreaktion (den Wechsel in den
Bearbeitungsmodus), sodass nur Ihre Aktion geschieht. Ohne dies schaltet die Zelle um und
öffnet sich zum Bearbeiten.
Wie sorge ich dafür, dass der Doppelklick nur in einer Spalte wirkt?
Sichern Sie mit Intersect ab:
If Intersect(Target, Me.Columns("B")) Is Nothing Then Exit Sub am Anfang des Handlers.
Intersect liefert Nothing, wenn die doppelt angeklickte Zelle außerhalb Ihres Bereichs
liegt, sodass der Rest des Blatts beim Doppelklick normal bearbeitet wird.
Warum versetzt ein Doppelklick die Zelle in den Bearbeitungsmodus, statt meinen Code auszuführen?
Entweder liegt der Code nicht im eigenen Modul des Blatts, Makros sind deaktiviert, oder
Ihr Handler läuft, setzt aber nie Cancel = True — sodass Excels Standardaktion (der
Bearbeitungsmodus) nach Ihrem Code feuert. Vergewissern Sie sich, dass die Prozedur im
richtigen Arbeitsblattmodul liegt, und fügen Sie Cancel = True hinzu.
Worin unterscheiden sich BeforeDoubleClick und BeforeRightClick?
Worksheet_BeforeDoubleClick fängt einen Doppelklick ab (Standardreaktion: Wechsel in den
Bearbeitungsmodus); Worksheet_BeforeRightClick
fängt einen Rechtsklick ab (Standardreaktion: Anzeige des Kontextmenüs). Beide reichen
Ihnen Target und ein Cancel-Flag, das Sie auf True setzen, um die Standardaktion zu
unterdrücken.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 06.08.2026.
Verwandte Anleitungen: VBA Worksheet_BeforeRightClick · VBA Workbook_BeforePrint · VBA Worksheet_Change · VBA Worksheet_Activate & Deactivate · VBA Range
