Aula Macedonia


Curso de Programación en VBA para Excel


Artículo realizado por
Iñaki Ecenarro.





Capítulo 5. Menús y barras de herramientas.

En esta entrega vamos a tratar sobre la creación de menús y barras de herramientas personalizadas para nuestras hojas. En Visual Basic for Applications, las barras de menú y las barras de herramientas están representadas por el mismo objeto (CommandBar), y su funcionamiento es exactamente igual.


Todos los ejemplos de este capítulo están incluídos en este fichero: Excel5.xls
(90kbs)


Antes de nada, vamos a intentar aclarar la nomenclatura que se utiliza en VBA para hacer referencia a cada una de las partes de un menu.

Menús y submenús

El nombre del menu en sí mismo es CommandBar. Un CommandBar (barra de menú) representa a todo el menú, como por ejemplo el que aparece cuando estás en una hoja de cálculo. Si cambias a una hoja de gráfico verás que el menú cambia: se ha cambiado de barra de menú (CommandBar).

Cada una de las opciones de la barra de menú se llama CommandBarPopUp (menú desplegable según la traducción de Microsoft). Por ejemplo, en el menú de una hoja de cálculo la opción "Archivo" es un menú desplegable o CommandBarPopUp.

Dentro del menú desplegable, cada una de las opciones se llama ControlButton (opción de menú). Por ejemplo, "nuevo" y "Guardar" son opciones del menú desplegable "archivo" de la barra de menú de "Hoja de cálculo" de Excel.

Para tener acceso a las barras de comandos (que pueden ser menús o barras de herramientas) utilizaremos la propiedad CommandBars, que devuelve el conjunto de barras de comandos de la aplicación. Cada una de las barras de comando será por tanto un objeto CommandBar.

Por ejemplo, para ver los nombres de todas las barras de comando que existen escribiremos la siguiente rutina:

Sub ListaBarrasComando()
    Dim h as Object
    Dim dst as Range

    Set dst = Sheets("Hoja1").Range("A1")
    For Each h in CommandBars
	dst.Value = h.Name       
	Set dst = dst.Offset(1, 0)
    Next h
End Sub

De esta forma obtendremos el nombre de todas las barras de comando. Recuerda que puede haber barras de comando que existan pero no estén activas, que no aparezcan en la pantalla.

Como habrás podido deducir, la propiedad Name de un objeto CommandBar nos devuelve el nombre de la barra de comando.

1. Crear una opción de menú.

Lo primero que vamos a hacer es crear una opcion dentro de un menú desplegable. Por ejemplo, vamos a crear una opción llamada "Macedonia" dentro del menú "Edición".

Antes que nada, declaramos las variables que vamos a utilizar:

    Dim cBar As Object
    Dim cBarPopUp As Object
    Dim cButton As Object

La primera variable (cBar) la utilizaremos para almacenar el menú de hoja de cálculo entero, la segunda (cBarPopUp) para obtener el menú de "Edición" dentro de cBar, y la tercera para crear nuestra opción (Macedonia) dentro del menú de Edición.

Vamos a obtener el menú de hoja de cálculo. Si te fijas en el resultado de la rutina ListaBarrasComando que hemos creado antes, verás que una de las barras de comando se llama "Worksheet Menu Bar". Esta es la barra de comandos que está presente cuando estás en una hoja de cálculo. Hay otras barras, como por ejemplo "Chart Menu Bar", que es la que aparece cuando estás en una hoja de gráficos.

Para utilizar la barra de comandos "Worksheet Menu Bar" haremos lo siguiente:

    Set cBar = CommandBars("Worksheet Menu Bar")

Con esto hemos conseguido que nuestra variable, cBar, contenga la barra de comandos que nos interesa. Ahora queremos seleccionar una parte de ese barra de comandos: queremos el menú de Edición. Para ello utilizamos el siguiente código:

    Set cBarPopUp = cBar.Controls("Edición")

Hemos utilizado la propiedad "Controls" del objeto CommandBar. Esta propiedad nos permite acceder a todos los submenús de una barra de comandos. El objeto devuelto es del tipo "CommandBarPopup". Reconozco que la terminología es un poco confusa, pero así lo ha hecho Microsoft.

Menús y submenús

Ahora ya tenemos el menú de "Edición" en nuestra variable. Y lo que queremos hacer es añadir una opción dentro de ese menú. Para hacerlo utilizaremos deberemos acceder a la propiedad "Controls" de nuestro menú de Edición. Fíjate que antes hemos accedido a la propiedad Controls del objeto cBar, y ahora vamos a acceder a la propiedad Controls del objeto cBarPopUp. Pues bien, una vez que accedemos a la propiedad "Controls" del menú Edición (cBarPopUp), utilizamos el método Add para añadir una nueva opción del menú:

    Set cButton = cBarPopUp.Controls.Add(msoControlButton)

Almacenamos en nuestra variable cButton el resultado, porque luego queremos hacerle unos cambios.

El tipo de control que queremos añadir puede variar ( msoControlButton, msoControlEdit, msoControlDropdown, msoControlComboBox o msoControlPopup ), pero en nuestro caso queremos una opción de menú, y utilizamos msoControlButton.

Nos queda hacer que nuestra opción de menú (o ControlButton), tenga el texto que nosotros queremos y haga lo que nosotros queremos. Para ello utilizaremos las propiedades del ControlButton:

Como siempre, hay muchas más propiedades, pero creo que hemos visto las más importantes. Vamos a ver nuestra rutina completa:

Sub CrearOpcionMenu()
    Dim cBar As Object
    Dim cBarPopUp As Object
    Dim cButton As Object
   
    BorrarOpcionMenu
    Set cBar = CommandBars("Worksheet Menu Bar")
    Set cBarPopUp = cBar.Controls("Edición")
    Set cButton = cBarPopUp.Controls.Add(msoControlButton)
    With cButton
       .Caption = "&Macedonia"
       .OnAction = "MiMacro"
       .FaceId = 7
       .ShortcutText = "Ctrl+Shift+M"
       .BeginGroup = True
    End With
    Call MsgBox("Se ha creado la opción 'Macedonia' en el menú 'Edición'", vbOKOnly, "Macedonia")
End Sub

Para verla en acción abre el fichero de ejemplo, y utiliza el botón "Crear opción de menú".

Si te fijas en la rutina CrearOpcionMenu, hemos incluido una llamada a la rutina BorrarOpcionMenu. Esta última se encarga de borrar la opción "Macedonia" del menú Edición en caso de que ya exista, y llamándola evitamos que aparezcan dos opciones "Macedonia". La rutina BorrarOpcionMenu es la siguiente:

Sub BorrarOpcionMenu()
    Dim cBar As Object
    Dim cBarPopUp As Object
    Dim cc As Object
    
    Set cBar = CommandBars("Worksheet Menu Bar")
    Set cBarPopUp = cBar.Controls("Edición")
    For Each cc In cBarPopUp.Controls
       If cc.Caption = "&Macedonia" Then cc.Delete
    Next cc
End Sub

Al igual que en la rutina CrearOpcionMenu, primero obtenemos la barra de comandos "Worksheet Menu Bar", despues la barra "Edición", y luego, utilizando la instrucción "For Each", pasamos por todos las opciones de menú, y borramos aquellas cuyo "Caption" sea "&Macedonia" (incluyendo el &). Para borrar la opción de menú utilizamos el método Delete.

2. Crear un menú desplegable.

Ahora vamos a crear un menú desplegable (como el menú Archivo, o Edición, de la hoja de cálculo de Excel). Como siempre, primero declaramos las variables que vamos a utilizar.

    Dim cBar As Object
    Dim cBarPopUp As Object
    Dim cButton As Object

Luego vamos a obtener la barra de comandos de la hoja de cálculo:

    Set cBar = CommandBars("Worksheet Menu Bar")

Para añadir un menú desplegable a dicha barra de comandos vamos a utilizar el método "Add" de la colección "Controls" de la barra de comandos:

    Set cBarPopUp = cBar.Controls.Add(Type:=msoControlPopup, Before:=10)

El tipo de control que queremos añadir es un "msoControlPopup", para indicar que queremos un menú desplegable.

    cBarPopUp.Caption = "&Macedonia"

Ahora tenemos en cBarPopUp un menú desplegable, igual que en el punto anterior teníamos el menú desplegable "Edición". Ahora tenemos que añadir opciones en dicho menú desplagable, igual que hemos hecho antes:

    Set cButton = cBarPopUp.Controls.Add(msoControlButton)
    With cButton
        .Caption = "&Macedonia 1"
        .OnAction = "MiMacro"
    End With

También podemos añadir un submenú dentro de alguna opción de nuestro menú, de una forma muy parecida. La rutina completa para crear un menú desplegable es la siguiente:

Sub CrearMenuDesplegable()
    Dim cBar As Object
    Dim cBarPopUp As Object
    Dim cButton As Object
    Dim i, j As Integer
    
    BorrarMenuDesplegable
    Set cBar = CommandBars("Worksheet Menu Bar")
    Set cBarPopUp = cBar.Controls.Add(Type:=msoControlPopup, _
                    Before:=10)
    cBarPopUp.Caption = "&Macedonia"
    
    For i = 1 To 10
        If i <> 5 Then
            Set cButton = cBarPopUp.Controls.Add(msoControlButton)
            With cButton
                .Caption = "&Macedonia " & i
                .OnAction = "MiMacro"
                If i Mod 3 = 0 Then .BeginGroup = True
            End With
        Else
            Set cButton = cBarPopUp.Controls.Add(msoControlPopup)
            cButton.Caption = "&Macedonia " & i
            For j = 1 To 5
                With cButton.Controls.Add(msoControlButton)
                    .Caption = "Submenú Macedonia " & j
                    .OnAction = "MiMacro"
                    If j Mod 3 = 0 Then .BeginGroup = True
                End With
            Next j
        End If
    Next i
    Call MsgBox("Se ha añadido la opción 'Macedonia' en el menú principal", _
                 vbOKOnly, "Macedonia")
End Sub

Para ver esta rutina en acción utiliza el botón "Crear menú desplegable" del fichero de ejemplo.

3. Crear una barra de menú.

Ahora vamos a crear una barra de menú completa, como la barra de menú "Worksheet Menu Bar". Lo primero, como siempre, es declarar las variables:

    Dim cBar As Object
    Dim cBarPopUp As Object
    Dim cButton As Object

En lugar de obtener la barra de menú "Worksheet Menu Bar" y luego trabajar con ella, ahora lo que vamos a hacer es crear nosotros mismos una barra de menú, utilizando el método "Add" de la colección "CommandBars".

    Set cBar = CommandBars.Add("Barra Macedonia", msoBarTop, True)
Menús y submenús

El primer argumento es el nombre de la barra de comandos que vamos a crear. El segundo argumento es la posición de la nueva barra de comandos, y puede ser uno de los siguientes valores:

El tercer argumento (verdadero o falso) indica si queremos que la nueva barra de menú reemplace a la barra de menús activa o no.

Una vez que tenemos nuestra barra de menú utilizamos el código que hemos aprendido antes para crear los menús desplegables y sus opciones. La siguiente rutina crea una barra de menú y varios menús desplegables y opciones:

Private Const NOMBREMENU = "Menú Macedonia"

Sub CrearBarraMenu()
    Dim cBar As Object
    Dim cBarPopUp As Object
    Dim cButton As Object
    Dim i, j As Integer
    
    BorrarBarraMenu
    Set cBar = CommandBars.Add(NOMBREMENU, msoBarTop, True)
    
    For j = 1 To 5
        Set cBarPopUp = cBar.Controls.Add(Type:=msoControlPopup)
        cBarPopUp.Caption = "&Macedonia " & j
        For i = 1 To j + 2
            Set cButton = cBarPopUp.Controls.Add(msoControlButton)
            With cButton
                .Caption = "&Macedonia " & i
                .OnAction = "MiMacro"
                If i Mod 3 = 0 Then .BeginGroup = True
            End With
        Next i
    Next j
    Call MsgBox("Se ha creado la barra de menú 'Macedonia'.", vbOKOnly, "Macedonia")
End Sub

Hemos utilizado la variable "NOMBREMENU" para dar el nombre a la barra de menú. Cuando se usa una cadena en más de un sitio del código es aconsejable sustituir la cadena por una variable, para evitar errores al escribir la cadena en varios sitios.

Con la rutina anterior hemos creado la barra de menú, pero todavía no la podemos ver, porque hay que activarla, usando:

    CommandBars(NOMBREMENU).Visible = True

Como al crear la barra hemos indicado (con el tercer argumento) que esta barra tiene que sustituir a la que esta activa, la barra activa desaparece y la nuestra aparece. Para volver a desactivar nuestra barra, utilizaremos:

    CommandBars(NOMBREMENU).Visible = False

Si queremos borrar la barra de menu que hemos creado utilizaremos el metodo Delete:

    CommandBars(NOMBREMENU).Delete

En el fichero excel5.xls tienes unos botones que sirven para crear, activar, desactivar y borrar una barra de menú.

4. Crear una barra de herramientas:

Como hemos visto al principio, en VBA las barras de menú y las barras de herramientas están representadas por el mismo objeto (CommandBar), y su funcionamiento es prácticamente igual.

Crear una barra de herramientas es exactamente igual que crear una barra de menú:

   Set cBar = CommandBars.Add(NOMBREBARRA, msoBarFloating, False)

En este caso hemos creado una barra "flotante", pero podíamos haber utilizado cualquiera de los otros parámetros que hemos visto antes.

Ahora vamos a crear un botón de la barra de herramientas. La única diferencia entre crear un botón y crear un menú desplegable es el tipo de control, el parámetro del método Add. En este caso utilizaremos "msoControlButton":

    Set cButton = cBar.Controls.Add(msoControlButton)
    With cButton
        .Caption = "&Macedonia " & i
        .OnAction = "MiMacro"
        .FaceId = Int(Rnd * 1000)
    End With

El código utilizado para crear, activar, desactivar y borrar una barra de herramientas es el mismo que para una barra de menús. De hecho no hay ninguna diferencia entre ellas, en Excel las dos son una barra de comandos (CommandBar). Además, también podemos mezclar botones y menús dentro de una barra de comandos: sólo hay que crear la barra y luego añadir controles tipo "msoControlPopup" para los menús y controles "msoControlButton" para los botones.

Bueno, aquí termina la quinta entrega del curso de VBA para Excel. Si tienes cualquier duda o comentario no dudes en escribirme.




Recuerda que los ejemplos de este capítulo están incluídos en este fichero: Excel5.xls
(90kbs)




ÚLTIMA REVISIÓN EN ABRIL DE 1999


Aula Macedonia
Curso de programación en VBA para Excel


AULA MACEDONIA
X
MACEDONIA Magazine