TL;DR —
Worksheet_BeforeDoubleClickes un evento que Excel dispara en el instante en que haces doble clic en una celda — antes de que la celda caiga en modo edición. Te entrega dos cosas:Target(la celda en la que hiciste clic) yCancel. PonCancel = Truey la reacción por defecto de Excel — entrar en modo edición — queda suprimida, así que tu acción es lo único que ocurre. Eso convierte un doble clic en un botón de un solo gesto: alternar una marca, dar una fila por hecha, saltar al detalle. El código vive en el módulo de la propia hoja, y casi siempre querrás acotarlo a una sola columna conIntersect.
' Vive en el módulo de la hoja (haz doble clic en "Sheet1" bajo Objetos de Microsoft Excel).
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' Actúa solo dentro de la columna B; deja toda otra celda editable como siempre.
If Intersect(Target, Me.Columns("B")) Is Nothing Then Exit Sub
Cancel = True ' <-- suprime el modo edición
Target.Value = IIf(Target.Value = "x", "", "x") ' el doble clic alterna una marca
End Sub
La mayoría de las macros esperan a un botón. Worksheet_BeforeDoubleClick espera a un
gesto — un doble clic en una celda — y, algo crucial, se ejecuta antes de que Excel
haga lo que un doble clic hace normalmente (poner la celda en modo edición). Ese «antes» es
la clave: puedes interceptar el gesto, decidir qué debe significar en tu hoja y cancelar
el comportamiento por defecto. Es el evento detrás de las listas de tareas que se marcan con
un clic, de los saltos al detalle desde un resumen a sus filas de origen y de los
interruptores de expandir/contraer — y es el evento que la gente conecta sin la única línea
que hace que se sienta bien.
Lo que aprenderás
- El modelo mental — un doble clic es un gesto que puedes secuestrar,
Cancelsuprime su comportamiento por defecto - La regla que más importa — olvida
Cancel = Truey la celda entra igualmente en modo edición - Cómo acotar el evento a una sola columna con
Intersectpara que el resto de la hoja siga siendo editable - La trampa de la reescritura — alternar una celda dispara
Worksheet_Change, así que protégelo - Nivel de hoja frente a nivel de libro, y dónde tiene que vivir el código
El modelo mental: un gesto que puedes secuestrar, no un clic que observas
Un doble clic ya significa algo para Excel: «pon esta celda en modo edición». Cuando
escribes Worksheet_BeforeDoubleClick, Excel llama primero a tu código y espera — todavía
no ha entrado en modo edición. Recibes Target, la celda exacta en la que se hizo doble
clic, y Cancel, un Boolean pasado por referencia. Deja Cancel en paz y, después de que
tu código se ejecute, Excel sigue adelante y entra en modo edición. Pon Cancel = True y
no lo hace — el significado por defecto del doble clic se descarta y se reemplaza por lo que
haya hecho tu manejador.
Así que el manejador no es «avísame cuando se haga doble clic en una celda». Es «déjame
redefinir lo que un doble clic hace aquí». Ese cambio de enfoque es lo que hace poderoso al
evento: un doble clic se convierte en un pequeño comando nativo del ratón — sin botón, sin
cinta, solo apuntar y hacer doble clic. Y como todo evento de esta familia, vive en un lugar
concreto. Este va en el módulo de código de la propia hoja (haz doble clic en la hoja
bajo «Objetos de Microsoft Excel» en el Explorador de proyectos) — no en un Module
estándar, y no en ThisWorkbook.
La regla que más importa: sin Cancel = True, la celda se edita igualmente
Este es el bug que hace que una hoja de marcar-con-clic se sienta rota. Escribes la alternancia pero olvidas la única línea:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Target.Value = IIf(Target.Value = "x", "", "x") ' alterna... y luego Excel edita la celda
End Sub
La marca se alterna — y luego la celda cae en modo edición, con cursor parpadeante y todo,
porque nada tocó Cancel. El usuario hizo doble clic para dar una tarea por hecha y acabó
con una celda en edición de la que ahora tiene que salir pulsando Escape. Tu acción se
ejecutó, pero la de Excel por defecto también, justo encima. La regla: cuando tu manejador
reemplaza el significado del doble clic, pon Cancel = True para que el comportamiento por
defecto no se dispare debajo de ti.
Cancel = True ' suprime primero el modo edición
Target.Value = IIf(Target.Value = "x", "", "x")
Ese único indicador es la diferencia entre «una alternancia elegante de un clic» y «una alternancia que además abre la celda para editar de forma molesta». Ponlo siempre que el doble clic sea tu comando, no una edición de verdad.
La regla que mantiene la hoja usable: acótalo con Intersect
Un manejador sin acotar es peor que ningún manejador. Si tu código se ejecuta en cada
doble clic y pone Cancel = True, acabas de desactivar la edición por doble clic para la
hoja entera — el usuario ya no puede hacer doble clic en ninguna celda para editarla. Es un
efecto secundario hostil que nadie pidió.
El arreglo es actuar solo dentro del rango que se supone que es clicable, y salir en todo lo demás:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' Protección: no hagas nada salvo que el clic esté en la columna "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")) devuelve Nothing cuando la celda del doble clic
está fuera de tu rango objetivo, así que Exit Sub deja el resto de la hoja comportándose
con normalidad — haz doble clic en cualquier otro sitio y se edita como siempre. Es la misma
protección con Intersect que evita que un manejador de
Worksheet_Change se dispare en cada edición, y es lo que
separa una función acotada de una toma de control de toda la hoja.
La trampa que acaba mordiéndote: tu escritura dispara otro evento
En el momento en que tu manejador escribe en una celda — y alternar una marca hace justo eso
— dispara Worksheet_Change, porque cambiaste el valor de una celda. La mayoría de las veces
es inofensivo. Pero si esa misma hoja tiene un manejador de Worksheet_Change que también
escribe (una marca de tiempo, un registro, un total recalculado), los dos pueden encadenarse,
y en el peor caso la escritura vuelve a entrar en tu propia lógica. La protección es la regla
de oro de la familia de eventos: envuelve la escritura para que no pueda disparar la
maquinaria.
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 ' mi escritura no disparará Worksheet_Change
Target.Value = IIf(Target.Value = "x", "", "x")
Application.EnableEvents = True
End Sub
Si tu manejador hace algo más que una escritura trivial, pon también el EnableEvents = True
en un manejador de errores, para que un fallo a mitad de camino no pueda dejar los eventos
apagados durante toda la sesión — la misma disciplina descrita en
Worksheet_Change.
La distinción que decide dónde va el código: hoja frente a libro
Worksheet_BeforeDoubleClick es un evento por hoja — vive en el módulo de una hoja y
solo se dispara ante los dobles clics en esa hoja. Si quieres el mismo comportamiento en
todas las hojas, no pegues el manejador en doce módulos de hoja. Usa el gemelo a nivel de
libro, Workbook_SheetBeforeDoubleClick, que vive en ThisWorkbook y te entrega un primer
argumento extra, Sh, que te dice en qué hoja se hizo clic:
' En ThisWorkbook - se dispara ante un doble clic en CUALQUIER hoja.
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
Es la misma elección de hoja frente a libro que haces con
Worksheet_Activate frente a Workbook_SheetActivate: una
sola hoja → el módulo de la hoja; cualquier hoja → el módulo del libro con el argumento Sh.
Cómo ayuda ExcelMaster
Un buen manejador de doble clic son tres pequeñas decisiones fáciles de equivocar por poco: la
protección con Intersect que mantiene editable el resto de la hoja, el Cancel = True que
impide que la celda entre en modo edición, y la barrera de EnableEvents alrededor de
cualquier escritura. Falla una y la función se siente rota de una manera difícil de
diagnosticar.
ExcelMaster
te deja describir el comportamiento en su lugar. Di «hacer doble clic en una celda de la
columna B debería alternar una marca y no abrir la celda para editarla», y escribe un
Worksheet_BeforeDoubleClick en el módulo de hoja correcto, lo acota con Intersect, pone
Cancel y protege la escritura. Te quedas con el libro y el código; te ahorras el ensayo y
error de aprender qué línea hace qué.
Preguntas frecuentes
¿Cómo ejecuto una macro cuando se hace doble clic en una celda en Excel?
Pon un procedimiento Worksheet_BeforeDoubleClick en el módulo de código de la hoja:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean). Excel lo
llama cada vez que se hace doble clic en una celda de esa hoja y pasa Target (la celda).
Añade ahí tu acción. Para todas las hojas, usa Workbook_SheetBeforeDoubleClick en
ThisWorkbook.
¿Cómo impido que la celda entre en modo edición al hacer doble clic?
Pon Cancel = True dentro del manejador. Excel comprueba Cancel después de que se ejecute
tu código; True suprime la reacción por defecto (entrar en modo edición), así que solo
ocurre tu acción. Sin él, la celda se alterna y se abre para editar.
¿Cómo hago que el doble clic solo funcione en una columna?
Protégelo con Intersect:
If Intersect(Target, Me.Columns("B")) Is Nothing Then Exit Sub al principio del manejador.
Intersect devuelve Nothing cuando la celda del doble clic está fuera de tu rango, así que
el resto de la hoja sigue editándose con normalidad al hacer doble clic.
¿Por qué al hacer doble clic en una celda entra en modo edición en lugar de ejecutar mi código?
O bien el código no está en el módulo de la propia hoja, o las macros están desactivadas, o
tu manejador se ejecuta pero nunca pone Cancel = True — así que el comportamiento por
defecto de Excel (el modo edición) se dispara después de tu código. Confirma que el
procedimiento está en el módulo de hoja correcto y añade Cancel = True.
¿Cuál es la diferencia entre BeforeDoubleClick y BeforeRightClick?
Worksheet_BeforeDoubleClick intercepta un doble clic (reacción por defecto: entrar en modo
edición); Worksheet_BeforeRightClick intercepta un
clic derecho (reacción por defecto: mostrar el menú contextual). Ambos te entregan Target y
un indicador Cancel que pones en True para suprimir el comportamiento por defecto.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 06/08/2026.
Guías relacionadas: VBA Worksheet_BeforeRightClick · VBA Workbook_BeforePrint · VBA Worksheet_Change · VBA Worksheet_Activate y Deactivate · VBA Range
