miércoles, 10 de julio de 2019

VBA: Menú Contextual personalizado

Hoy profundizaremos en un tema que ya tocamos tiempo atrás: los menús personalizados
Puedes revisar esta lectura.

La idea es crear nuestro propio menú contextual personalizado.

VBA: Menú Contextual personalizado



Para ello, insertamos en la ventana de código de un módulo estándar el siguiente código:

'En primer lugar ejecutar la macro 'Crear_Men_Contextual'
'a continuación podremos lanzar la macro siguiente:
Sub Mostrar__MenuContextualPersonalizado()
'Mostrar el menú creado
Application.CommandBars("MiMenu").ShowPopup
End Sub

Sub Eliminar_MenuContextualPersonalizado()
'eliminar el menú creado
Application.CommandBars("MiMenu").Delete
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sub Crear_Menu_Contextual()
Dim miMenu As CommandBar
Dim submenu As CommandBarPopup
Dim opcion1 As CommandBarButton, opcion2 As CommandBarButton
Dim opcion3_1 As CommandBarButton, opcion3_2 As CommandBarButton, opcion3_3 As CommandBarButton

'creamos el menú
Set miMenu = Application.CommandBars.Add(Name:="MiMenu", Position:=msoBarPopup, MenuBar:=False, Temporary:=True)
'añadimos elementos al menú contextual...
With miMenu
    'un primer elemento
    Set opcion1 = .Controls.Add(Type:=msoControlButton) 'tipo botón
    With opcion1
        .Caption = "Primer elemento"    'el texto que aparece visible
        .FaceId = 71            ' el icono asociado
        .OnAction = "Macro1"    'la acción o macro a realizar
    End With
    'un segundo elemento
    Set opcion2 = .Controls.Add(Type:=msoControlButton) 'tipo botón
    With opcion2
        .Caption = "Segundo elemento"   'el texto que aparece visible
        .FaceId = 72            ' el icono asociado
        .OnAction = "Macro2"    'la acción o macro a realizar
    End With
    'un submenú dependiente con desplegable de opciones
    Set submenu = .Controls.Add(Type:=msoControlPopup)
    With submenu
        .Caption = "Submenú"    'el texto que aparece visible...
        'un elemento dentro del submenú
        Set opcion3_1 = .Controls.Add(Type:=msoControlButton)   'tipo botón
        With opcion3_1
            .Caption = "Punto tres-uno"    'el texto que aparece visible
            .FaceId = 73            ' el icono asociado
            .OnAction = "Macro31"    'la acción o macro a realizar
        End With
        'otro elemento dentro del submenú
        Set opcion3_2 = .Controls.Add(Type:=msoControlButton)   'tipo botón
        With opcion3_2
            .Caption = "Punto tres-dos"      'el texto que aparece visible
            .FaceId = 74            ' el icono asociado
            .OnAction = "Macro32"    'la acción o macro a realizar
        End With
        'tercer elemento dentro del submenú
        Set opcion3_3 = .Controls.Add(Type:=msoControlButton)   'tipo botón
        With opcion3_3
            .Caption = "Punto tres-tres"      'el texto que aparece visible
            .FaceId = 75            ' el icono asociado
            .OnAction = "Macro33"    'la acción o macro a realizar
        End With
    End With
End With
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Macro1()
MsgBox "Aprendiendo Excel...." & vbCrLf & "Primera acción principal"
End Sub
Sub Macro2()
MsgBox "Aprendiendo Excel...." & vbCrLf & "Segunda acción principal"
End Sub
Sub Macro31()
MsgBox "Aprendiendo Excel...." & vbCrLf & "Primera acción del submenú"
End Sub
Sub Macro32()
MsgBox "Aprendiendo Excel...." & vbCrLf & "Segunda acción del submenú"
End Sub
Sub Macro33()
MsgBox "Aprendiendo Excel...." & vbCrLf & "Tercera acción del submenú"
End Sub



Para personalizar los iconos mostrados lee la entrada siguiente.


Con el código generado el primer paso será ejecutar la macro: Crear_Menu_Contextual
Después podremos asociar un método abreviado a la macro Mostrar__MenuContextualPersonalizado (ver aquí).
El menú se hará visible donde tengamos el cursor activo.


El resultado es el esperado... al presionar nuestra combinación de teclas de acceso rápido abriremos nuestro menú contextual con las opciones definidas...

2 comentarios:

  1. Hola,
    He probado copiando su código pero me muestra un error '5' en tiempo de ejecución: "Argumento o llamada a procedimiento no válida", en la línea 6 del procedimiento "Sub Crear_Menu_Contextual()":

    Set MiMenu = Application.CommandBars.Add(Name:="MiMenu", Position:=msoBarPopup, MenuBar:=False, Temporary:=True)

    Tras revisar todo el código no alcanzo a detectar donde pueda producirse este error.
    Trabajo con Excel 2013 sobre el sistema Windows 10.
    Les quedaré agradecido si pudieran aclararlo,
    Saludos,

    ResponderEliminar
    Respuestas
    1. Hola,
      he replicado el proceso en W10 con Office 2013 (como indicas) y no me salta ningún error...¿¿??
      Revisa bien el código por si se hubiera perdido alguna cosa al copiar y pegar
      Saludos

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.