Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
Excel5.xls
Todos los ejemplos de este capítulo están incluídos en este fichero:
(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.
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
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 "Work sheet 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ú".
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.
Excel5.xls
Recuerda que los ejemplos de este capítulo están incluídos en este fichero:
(90kbs)
ÚLTIMA REVISIÓN EN ABRIL DE 1999