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

VBA Worksheet_BeforeRightClick en Excel — reemplaza el menú del clic derecho (y por qué desactivarlo no es seguridad)

|

VBA Worksheet_BeforeRightClick en Excel — reemplaza el menú del clic derecho (y por qué desactivarlo no es seguridad)

TL;DRWorksheet_BeforeRightClick es un evento que Excel dispara en el instante en que haces clic derecho en una celda — antes de que aparezca el menú contextual. Te entrega Target (la celda) y Cancel. Pon Cancel = True y el menú de clic derecho integrado de Excel queda suprimido, así que puedes poner tu menú — o una acción directa — en su lugar. La trampa que casi todo el mundo pisa es el alcance: un Cancel = True incondicional desactiva Copiar, Pegar e Insertar en toda la hoja, así que protégelo con Intersect. Y ten esto claro de entrada — desactivar el clic derecho es una decisión de UX, no de seguridad.

' Vive en el módulo de la hoja (haz doble clic en "Sheet1" bajo Objetos de Microsoft Excel).
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    ' Secuestra solo los clics derechos dentro de la columna Status; deja en paz el resto de la hoja.
    If Intersect(Target, Me.Range("C2:C100")) Is Nothing Then Exit Sub

    Cancel = True                       ' <-- suprime el menú contextual integrado
    Target.Value = Date                 ' en su lugar, el clic derecho sella la fecha de hoy
End Sub

La mayoría de las macros esperan a un botón. Worksheet_BeforeRightClick espera a un gesto — un clic derecho en una celda — y se ejecuta antes de que Excel haga lo que un clic derecho hace normalmente: mostrar el menú contextual. Ese «antes» es la oportunidad que necesitas. Puedes suprimir el menú por defecto y sustituirlo por el tuyo, convertir un clic derecho en un comando de un solo gesto, o añadir un par de elementos personalizados a lo que Excel ya ofrece. Es también el evento al que la gente recurre para «blindar» una hoja — y ahí es donde vive la lección más importante.

Lo que aprenderás

  • El modelo mental — un clic derecho es una petición de menú, y a ti te toca responderla
  • La regla que más importa — Cancel = True es lo que de verdad suprime el menú integrado
  • Por qué acotar con Intersect no es opcional — la versión sin acotar lisia la hoja
  • El juicio a tomar — desactivar el clic derecho es UX, nunca protección
  • Nivel de hoja frente a nivel de libro, y dónde tiene que vivir el código

El modelo mental: una petición de menú que te toca responder

Un clic derecho ya significa algo para Excel: «muéstrame el menú contextual de esta celda». Cuando escribes Worksheet_BeforeRightClick, Excel llama primero a tu código y espera — el menú todavía no ha aparecido. Recibes Target, la celda en la que se hizo clic derecho, y Cancel, un Boolean pasado por referencia. Deja Cancel en paz y Excel muestra su menú normal después de que tu código se ejecute. Pon Cancel = True y no lo hace — has respondido tú mismo la petición, y ahora el clic derecho significa lo que tu manejador decidió que significara.

Eso replantea el evento. No es «avísame al hacer clic derecho». Es «déjame decidir qué ofrece aquí un clic derecho». Puedes ejecutar una acción directamente (sellar una fecha, marcar una fila, abrir un formulario de detalle), o desplegar tu propio menú construido con CommandBars. En cualquier caso, el menú integrado solo desaparece cuando lo dices, con Cancel = True. Y como todo evento de esta familia, este vive en el módulo de código de la propia hoja — no en un Module estándar, y no en ThisWorkbook.

La regla que más importa: Cancel = True suprime el menú integrado

Este es el error. Quieres que un clic derecho ejecute tu propio comando, así que escribes la acción y paras:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Target.Value = Date        ' sella la fecha... y el menú de Excel aparece igualmente
End Sub

La fecha aterriza — y luego el menú contextual completo aparece de todos modos, porque nada tocó Cancel. El usuario tiene ahora tanto tu acción como el menú de Cortar/Copiar/Pegar de Excel encima. La regla: Cancel = True es la línea que reemplaza el menú. Ponlo siempre que tu manejador deba ser la respuesta del clic derecho:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True              ' el menú integrado no se muestra nunca
    Target.Value = Date        ' tu comando es toda la interacción
End Sub

Si en cambio quieres añadir un elemento en lugar de reemplazar el menú, deja Cancel en paz y agrega tu control a Application.CommandBars("Cell") — Excel muestra su menú con tu elemento extra. Suprime (con Cancel = True) cuando reemplazas; extiende la CommandBar Cell cuando añades.

La regla que mantiene la hoja usable: acótalo con Intersect

Este evento castiga un manejador sin acotar más duro que ningún otro. Si tu código se ejecuta en cada clic derecho y pone Cancel = True, has eliminado todo el menú de clic derecho de la hoja entera — sin Copiar, sin Pegar, sin Insertar, sin Filtrar, sin Formato de celdas, en ningún sitio. No personalizaste la hoja; la rompiste.

Acota a las celdas que se supone que tienen comportamiento personalizado, y deja que toda otra celda conserve su menú normal:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    ' Comportamiento personalizado solo en la columna Status; menú normal en todo lo demás.
    If Intersect(Target, Me.Range("C2:C100")) Is Nothing Then Exit Sub

    Cancel = True
    Target.Value = Date
End Sub

Intersect(Target, Me.Range("C2:C100")) devuelve Nothing fuera de tu rango objetivo, así que Exit Sub devuelve el control a Excel y el menú integrado aparece como siempre. Es la misma protección con Intersect que mantiene acotado un manejador de Worksheet_Change — aquí es la diferencia entre una hoja útil y una inservible.

El juicio a tomar: desactivar el clic derecho es UX, no seguridad

La gente encuentra este evento buscando «cómo desactivo el clic derecho para proteger mi hoja». Así que dilo sin rodeos: un bloqueo de clic derecho con Cancel = True no protege nada. Solo detiene una vía de entrada — el menú del ratón. Todo lo demás sigue funcionando: Ctrl+C y Ctrl+V, la cinta, el Cuadro de nombres, otra macro y — la que zanja la discusión — abrir el archivo con las macros desactivadas, lo que apaga todo tu evento. Si tu modelo de amenaza es un usuario decidido o un actor malicioso, BeforeRightClick ni lo roza.

Para lo que el evento sirve es para dar forma a la interacción: ocultar un menú irrelevante en una zona de entrada de datos, reemplazarlo por dos comandos que de verdad encajan con la tarea, o sellar un valor con un gesto. Úsalo para hacer fácil lo correcto, no para hacer imposible lo incorrecto. Si necesitas protección de verdad, eso es la protección de hoja, la protección de la estructura del libro y no fiarte de un evento del lado del cliente — una herramienta completamente distinta.

La distinción que decide dónde va el código: hoja frente a libro

Worksheet_BeforeRightClick es un evento por hoja — vive en el módulo de una hoja y solo se dispara en esa hoja. Para aplicar el mismo comportamiento en todas partes, usa el gemelo a nivel de libro Workbook_SheetBeforeRightClick en ThisWorkbook, que añade un primer argumento, Sh, para la hoja implicada:

' En ThisWorkbook - se dispara ante un clic derecho en CUALQUIER hoja.
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    If Sh.Name <> "Log" Then Exit Sub
    If Intersect(Target, Sh.Range("C2:C100")) Is Nothing Then Exit Sub
    Cancel = True
    Target.Value = Date
End Sub

La misma elección 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. Y hace pareja de forma natural con su hermano de gestos Worksheet_BeforeDoubleClick, que intercepta un doble clic con la misma forma de Target más Cancel.

Cómo ayuda ExcelMaster

Un manejador de clic derecho son tres decisiones fáciles de equivocar: la protección con Intersect que mantiene vivos Copiar y Pegar fuera de tu rango objetivo, el Cancel = True que de verdad suprime el menú, y el juicio honesto sobre qué protege y qué no un bloqueo.

ExcelMaster te deja describir el comportamiento en su lugar. Di «hacer clic derecho en una celda de la columna Status debería sellar la fecha de hoy y no mostrar el menú normal, pero dejar en paz el resto de la hoja», y escribe un Worksheet_BeforeRightClick en el módulo correcto, lo acota con Intersect y pone Cancel. Te quedas con el libro y el código; te ahorras el ensayo y error — y se te dice, no se te vende, lo que protege.

Preguntas frecuentes

¿Cómo ejecuto una macro al hacer clic derecho en Excel?

Pon un procedimiento Worksheet_BeforeRightClick en el módulo de código de la hoja: Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean). Excel lo llama cuando se hace clic derecho en una celda de esa hoja y pasa Target. Añade tu acción y pon Cancel = True si quieres reemplazar el menú integrado.

¿Cómo desactivo el menú del clic derecho en VBA?

Pon Cancel = True dentro de Worksheet_BeforeRightClick. Eso suprime el menú contextual. Acótalo con Intersect a menos que de verdad quieras que desaparezca en toda la hoja — un bloqueo incondicional elimina Copiar, Pegar e Insertar en todas partes. Ten en cuenta que solo bloquea el menú del ratón; no es un control de seguridad.

¿Desactivar el clic derecho protege mis datos?

No. Solo elimina una vía de entrada. Ctrl+C/Ctrl+V, la cinta, otras macros y abrir el archivo con las macros desactivadas se lo saltan todos. Usa BeforeRightClick para agilizar la interacción, y usa la protección de hoja/libro para una protección de verdad.

¿Cómo añado un elemento personalizado al menú del clic derecho en lugar de reemplazarlo?

Deja Cancel sin tocar y agrega un control a Application.CommandBars("Cell") — Excel muestra su menú normal con tu elemento extra. Pon Cancel = True solo cuando quieras reemplazar el menú en lugar de extenderlo.

¿Dónde va el código de Worksheet_BeforeRightClick?

En el módulo de código de la hoja concreta — haz doble clic en la hoja bajo «Objetos de Microsoft Excel» en el Explorador de proyectos. Para un clic derecho en cualquier hoja, usa Workbook_SheetBeforeRightClick en ThisWorkbook en su lugar. No se dispara desde un Module estándar, y las macros deben estar habilitadas.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 06/08/2026.

Guías relacionadas: VBA Worksheet_BeforeDoubleClick · VBA Workbook_BeforePrint · VBA Worksheet_Change · VBA Worksheet_Activate y Deactivate · VBA Range