TL;DR —
Worksheet_BeforeRightClickes un evento que Excel dispara en el instante en que haces clic derecho en una celda — antes de que aparezca el menú contextual. Te entregaTarget(la celda) yCancel. PonCancel = Truey 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: unCancel = Trueincondicional desactiva Copiar, Pegar e Insertar en toda la hoja, así que protégelo conIntersect. 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 = Truees lo que de verdad suprime el menú integrado - Por qué acotar con
Intersectno 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 tú 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 sí 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
