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.

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.

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:
- Caption: es el texto que queremos que aparezca en la opción de menú. En nuestro caso, "&Macedonia". El carácter "&" se utiliza para indicar que la letra que le sigue (la "M" en este caso) queremos que apareza subrayada y funcione como tecla rápida una vez que esté abierto el menú.
- OnAction: es el nombre de la rutina que queremos que se ejecute cuando el usuario seleccione esa opción. En este caso vamos a darle el valor "MiMacro", que será una pequeña rutina que simplemente avisará de que hemos seleccionado esa opción.
- ShortcutText: el texto que aparece en la opción del menú, a la derecha. Normalmente se suele poner la tecla rápida para esa opción de menú. Cuidado, porque esta opción sólo sirve para escribir el texto, pero no hace que la tecla rápida funcione, eso tendrás que hacerlo tú por otro lado.
- FaceID: es el número de la imagen que queremos que se asigne a nuestra opción de menú. La imagen aparece en la parte izquierda de la opción. Excel tiene un montón de imágenes para nuestras opciones, y se pueden seleccionar cambiando el ID. Para ver todas las imágenes disponibles y saber qué ID corresponde a cada imagen, lo mejor es hacer una pequeña rutina que muestre todas las imágenes. (eso te queda como ejercicio; si tienes alguna duda escríbeme).
- BeginGroup: true o false, indica si queremos que antes de nuestra opción se ponga un "separador", una línea que separe un poco nuestra opción de la anterior.
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)

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:
- msoBarLeft, msoBarRight, msoBarTop, msoBarBottom: izquierda, derecha, arriba o abajo.
- msoBarFloating: queremos que la nueva barra de menú sea flotante.
- msoBarPopUp: la nueva barra de menús será contextual, como las que salen cuando pulsamos el botón derecho.
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