sábado, 16 de enero de 2016

Cómo personalizar el menú del botón derecho de Excel con VBA


Todos conocemos (y además usamos con mayor o menor frecuencia) el menú contextual que obtenemos al hacer clic en una celda de Excel. En la versión 2016, tiene el siguiente aspecto:



En este post, vamos a plantearnos modificar este menú contextual cuando trabajamos con una hoja de cálculo determinada. Concretamente queremos que, dentro de esa hoja, al hacer clic con el botón derecho en las celdas A1 y C1, el menú contextual lo veamos personalizado con unos comandos que nosotros decidiremos y que, evidentemente, ejecutarán las acciones que nosotros queramos.

Para ello, no tenemos más remedio que escribir algo de código Visual Basic for Applications. Así pues, lo primero que debemos hacer es presionar la combinación de teclas ALT+F11 para que se ejecute el editor de VBA.

Escribimos el código que permite que, al hacer clic con el botón derecho del ratón, el menú contextual esté personalizado

Una vez dentro del editor de VBA, nos fijaremos en la parte superior izquierda del editor, en el panel "Explorador de proyectos". Ahí podremos ver los archivos (proyectos para VBA) de Excel que están abiertos y debemos identificar el nuestro y expandir el árbol de objetos si es que no lo está.



Como vemos arriba, dentro de "Microsoft Excel Objetos" vemos la Hoja1 que será nuestra hoja objetivo a la hora de personalizar el menú contextual del botón derecho. Debemos hacer doble clic en nuestra hoja objetivo y veremos como a la derecha tenemos una ventana en blanco. En ella debemos realizar dos selecciones en la parte superior:

 

Podemos borrar todo lo que vemos en la parte inferior de la imagen anterior:

Private Sub WorkSheet_SelectionChange(ByVal Target As Range)

End Sub

... y para que nuestro código se ejecute al de hacer clic con el botón derecho del ratón, entre la línea que comienza por Private Sub WorkSheet_BeforeRightClick (ByVal Target.... y la línea End Sub escribimos el siguiente código:


Dim NuevoComando As CommandBarButton

'LIMPIAMOS TODOS LOS COMANDOS Y REESTABLECEMOS ORIGINALES DE EXCEL

For Each AntiguoComando In CommandBars("cell").Controls
AntiguoComando.Delete
Next

CommandBars("Cell").Reset

'AÑADIMOS NUESTRO PRIMER COMANDO

If Not Intersect(Target, Range("A1")) Is Nothing Then
     Set NuevoComando = CommandBars("cell").Controls.Add
     With NuevoComando
         .Caption = "
EJECUTAR MIMACRO1"
         .OnAction = "MiMacro1"
         .BeginGroup = True
     End With
End If

'AÑADIMOS NUESTRO SEGUNDO COMANDO

If Not Intersect(Target, Range("C1")) Is Nothing Then
     Set NuevoComando = CommandBars("cell").Controls.Add
     With NuevoComando
         .Caption = "EJECUTAR MIMACRO
2"
         .OnAction = "MiMacro2"
         .BeginGroup = True
     End With
End If


Lo que hemos hecho hasta ahora es:

1) Activar la ventana de código y seleccionar el evento "BeforeRightClick" para escribir dentro de los protocolos de entrada y de salida que aparecen automáticamente (Sub.... y End Sub).

2) En el código que escribimos:
  • Escribir el código que declara una variable objeto (NuevoComando) que representará el nuevo comando que se añade posteriormente
  • Escribir la parte de código que limpia todos los comandos que pudiera haber anteriormente y volver a poner los comandos que por defecto muestra Excel al hacer clic con el botón derecho
  • Escribir la parte de código que agrega nuestro primer comando. Este código se inserta dentro de una estructura If... End If que condiciona la agregación del comando al hecho de hacer clic en el "Target" que hemos definido (A1)
  • Escribir la parte de código que agrega nuestro segundo comando. Este código se inserta dentro de una estructura If... End If que condiciona la agregación del comando al hecho de hacer clic en el "Target" que hemos definido (C1)

A estas alturas, lo que ocurre es que, si dejáramos esto así, al salir de nuestra hoja o al salir de Excel, esta configuración del menú del botón derecho del ratón permanecería para siempre en nuestro Excel... y eso no es, muy probablemente, lo que queremos. Así pues, debemos volver a seleccionar en la parte superior lo siguiente (teniendo el cursor en la línea siguiente a la última del código que hay hasta el momento. Es decir, después de "End Sub"):

 

En medio de las instrucciones que aparecen automáticamente (y que podemos ver en la imagen anterior, debemos escribir:

CommandBars("Cell").Reset

Application.CommandBars("Cell").Enabled = True

Escribimos el código de las macros que se ejecutarán al seleccionar los comandos personalizados de nuestro menú contextual

De nuevo en el explorador de proyectos debemos asegurarnos de que hay un módulo disponible para poder escribir el código de nuestras macros a ejecutar.

En la imagen siguiente vemos que ya está el Módulo 1:



Pero si no tuviéramos ningún módulo, lo podríamos añadir desde el menú "Insertar" / Módulo:



Cuando ya lo tengamos, hacemos doble clic sobre él y a la derecha aparecerá una ventana para escribir código, donde tendremos que escribir lo siguiente:

Sub MiMacro1()
     MsgBox "Se ha ejecutado mi macro 1"
End Sub

Sub MiMacro2()
    MsgBox "Se ha ejecutado mi macro 2"
End Sub

(Veremos que aparece una línea divisoria automáticamente)


Este código corresponde a dos macros de prueba que muestran un cuadro de mensaje para comprobar que se han ejecutado. Evidentemente, el usuario sustiruirá estas macros por las que realmente necesite ejecutar.

Ahora, ya estamos en disposición de comprobar el correcto funcionamiento de todo lo realizado, desde Excel. Es decir, haciendo clic con el botón derecho en cualquiera de las celdas que definimos al principio (A1 y C1):





Otras opciones

VER SOLO NUESTROS COMANDOS, NO LOS DE EXCEL

En al caso de que no deseemos que aparezcan los comandos propios de Excel y tan solo queremos ver nuestro comando, tenemos que quitar del código escrito dentro del evento "BeforeRightClick" la línea:

CommandBars("Cell").Reset

¡¡¡Insistimos!!! hay que eliminar la línea que hemos escrito dentro del evento  "BeforeRightClick"  ... ¡¡NO eliminar esa misma línea que también escribimos dentro del evento "Worksheet_Deactivate"!!

El resultado de eliminar esa línea es el siguiente:

 

Donde vemos que en el menú contextual aparece solo el comando que activa nuestra macro.

CON UN CLIC EN CUALQUIER CELDA, VER TODOS NUESTROS COMANDOS A LA VEZ SIEMPRE PARA PODER ELEGIR LA ACCIÓN:

En este caso, sea la celda que sea, al hacer clic con el botón derecho, veremos todos los comandos a la vez para poder elegir el que necesitemos. Para conseguirlo, debemos eliminar en el código las estructuras condicionales que comienzan por If y terminan por End If: 
 
 

 Siendo el resultado el siguiente:


 
 
Para finalizar, no hay que olvidar que el archivo debe ser guardado como... "Libro de Excel habilitado para macros (*.xlsm).  En el archivo que es posible descargar a continuación, podemos ver (incluso copiar) todo el código necesario, además de comprobar su funcionamiento:


https://www.dropbox.com/s/zaqyqqhptls1690/Personalizar%20bot%C3%B3n%20derecho.xlsm?dl=0

El espacio de Mac

En cuanto a Excel 2011 para Mac, no hay diferencias en el código a escribir. Tan solo podemos remarcar las diferencias que hay a la hora de activar el editor de VBA. Concretamente, debemos activar la ficha Programador (Menú Excel / Preferencias / Cinta... y activar la casilla "Programador".


Después de aceptar, veremos la nueva pestaña en la cinta y activándola podremos acceder al editor de VBA:



José Manuel Pomares Medrano









8 comentarios:

  1. Excelente, me ha sido de gran ayuda, gracias

    ResponderEliminar
  2. Realmente genial.
    Muchas gracias por la ayuda.

    ResponderEliminar
  3. Hola, muchas gracias por la información, me ha resultado muy útil.
    Tengo una pregunta, si queremos aplicar lo mismo pero en una celda de una tabla, ¿cómo se haría?
    ¡Gracias!

    ResponderEliminar
  4. Chingon la neta, pero para las imagenes por que ocupo usar los segmentadores pero no quiero que que usen el contextual

    ResponderEliminar
  5. Excelente explicacion felicitaciones Maestro me funciono de maravilla una pregunta se puede quitar ciertos comandos del menu contextual de excel de excel y dejar los nuevos creados por uno

    ResponderEliminar
  6. Excelente explicación. Justo lo que buscaba y más.

    ResponderEliminar
  7. Estoy listo para aplicar todo lo que he aprendido en mi curso https://1cursos.com/f-tecnico-en-administracion-de-sistemas-informaticos administración de sistemas informáticos el mundo laboral!

    ResponderEliminar