Sei sulla pagina 1di 7

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.

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.

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  "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ú".

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.

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 

Potrebbero piacerti anche