🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Worksheet_BeforeDoubleClick en Excel — convierte un doble clic en una acción (y suprime el modo edición)

|

VBA Worksheet_BeforeDoubleClick en Excel — convierte un doble clic en una acción (y suprime el modo edición)

TL;DRWorksheet_BeforeDoubleClick es 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) y Cancel. Pon Cancel = True y 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 con Intersect.

' 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, Cancel suprime su comportamiento por defecto
  • La regla que más importa — olvida Cancel = True y la celda entra igualmente en modo edición
  • Cómo acotar el evento a una sola columna con Intersect para 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