Para administrar todos los comandos de menú y barra de herramientas en VBA, debe usar la colección CommandBar. A continuación se explica cómo utilizarlo.
Administrar la colección CommandBar en VBA
La colección Barras de comando de VBA representa todos los menús y barras de herramientas, cada uno de los cuales es un objeto CommandBar.
Para trabajar con una barra, puede utilizar las siguientes sintaxis:
- Barras de comando(n) donde n representa el índice de la barra. Es difícil saber cuál es el índice de una barra específica.
- CommandBars("nombre de la barra") donde "bar name" representa su nombre en inglés. Por ejemplo, para la barra de herramientas Formato, su nombre es Formato.
El siguiente ejemplo le permite ingresar el nombre de las barras de herramientas en su idioma en un libro de trabajo (NombreLocal) y en inglés (Nombre), así como su Índice.
Sub ListeBarre()
Dim cbar As CommandBar
For Each cbar In Application.CommandBars 'pour chaque barre de l'application
ActiveCell = cbar.Index 'index de la barre dans la cellule active
ActiveCell.Offset(0, 1) = cbar.NameLocal 'nom local de la barre dans la cellule située à droite de la cellule active
ActiveCell.Offset(0, 2) = cbar.Name ' nom de la barre dans la cellule située à 2 colonnes à droite de la cellule active
ActiveCell.Offset(1, 0).Select 'sélection de la cellule situé sous la cellule active
Next
End Sub
Mostrar/ocultar un menú
Para mostrarlo puedes hacerlo visible, para ocultarlo puedes hacerlo invisible o inactivo.
' Pour visible le menu
Application.CommandBars("Dessin").Visible = True
' Pour masquer le menu
Application.CommandBars("Dessin").Visible = False
' Pour griser le menu
Application.CommandBars("Dessin").Enabled = False
' Pour rendre actif le menu
Application.CommandBars("Dessin").Enabled = True
Todas las barras mostradas reaparecen solo aquellas que se mostraron como en los siguientes 2 ejemplos
Sub MasqueBarre()
Dim cbar As CommandBar
For Each cbar In Application.CommandBars 'pour chaque barre de l'application
cbar.Enabled = False 'inactivation de la barre
Next
End Sub
Sub AffichBarre()
Dim cbar As CommandBar
For Each cbar In Application.CommandBars 'pour chaque barre de l'application
cbar.Enabled = True 'activation de la barre
Next
End Sub
Agregar o quitar una barra
Para agregar una barra, simplemente use el método Agregar por lo tanto:
Application.CommandBars.Agregue "el nombre de su barra", [posición], [MenuBar], [Temporal]
Los parámetros entre corchetes no son obligatorios; si no se especifican, se aplica el valor predeterminado
- La posición corresponde a la posición de la barra en Excel: msoBarLeft (izquierda), msoBarTop (arriba), msoBarRight (derecha), msoBarBottom (abajo), msoBarFloating (flotante), msoBarPopup (menú contextual). Valor predeterminado: msoBarFloating.
- MenuBar debe ser Verdadero si desea reemplazar la barra de herramientas activa. Valor predeterminado: Falso
- Temporal debe ser Verdadero para que la barra sea temporal, en este caso desaparece cuando se cierra Excel. Valor predeterminado: Falso
Para no eliminar una barra de herramientas predefinida, debe verificar si la barra de herramientas es una barra de herramientas personalizada o predefinida; la propiedad incorporada es False en el caso de una barra de herramientas personalizada.
El siguiente ejemplo elimina todas las barras personalizadas que creó en Excel:
Sub SupprBarrePerso()
Dim cbar As CommandBar For Each cbar In Application.CommandBars
If Not cbar.BuiltIn Then cbar.Delete 'si non prédéfinie alors suppression
Next
End Sub
Agregar/eliminar un control
Para agregar un control, primero debes consultar todos los controles en la barra (incluso si está vacía), luego agregar:
Application.CommandBars("Standard").Controls.Add [Type], [Id], [Parameter], [Before], [Temporary]
Los parámetros entre corchetes no son obligatorios; si no se especifican, se aplica el valor predeterminado
- Tipo especifica el tipo de control: msoControlButton (botón), msoControlEdit (cuadro de texto), msoControlDropdown (cuadro de lista desplegable), msoControlComboBox (cuadro combinado) o msoControlPopup (submenú). Valor predeterminado: msoControlButton
- Id es un número entero que representa un control predefinido. Cada botón de las barras de herramientas predefinidas tiene su propia ID. Por defecto, es un botón vacío.
- Parámetro, puedes almacenar los datos que quieras en este parámetro (para poder volver a leerlos más tarde).
- Antes de la posición del nuevo control, luego se colocará delante del control cuya posición sea el número indicado. Predeterminado: al final de la barra de comandos
- Temporal debe ser Verdadero para que el control sea temporal, en cuyo caso desaparece cuando se cierra Excel. Valor predeterminado: Falso.
Ejemplo de creación de una barra de herramientas y adición de los botones de cortar, copiar y pegar:
Sub NouvBarre()
Dim MaBarre As CommandBar
Dim NouvBtn As CommandBarButton
'ajoute une barre d'outils
Set MaBarre = CommandBars.Add("BarrePerso")
'ajoute le bouton couper à la barre
Set NouvBtn = MaBarre.Controls.Add(msoControlButton,CommandBars("Standard").Controls("Couper").ID)
'ajoute le bouton couper à la barre
Set NouvBtn = MaBarre.Controls.Add(msoControlButton, Application.CommandBars("Standard").Controls("Copier").ID)
'ajoute le bouton coller à la barre
Set NouvBtn = MaBarre.Controls.Add(msoControlButton, Application.CommandBars("Standard").Controls("Coller").ID)
'affiche la barre
MaBarre.Visible = True
End Sub
Para eliminar un control
CommandBars("BarrePerso").Controls(3).Delete
Un cuadro de texto
Para iniciar un procedimiento que requiere una indicación, se puede utilizar un cuadro de texto como en el siguiente ejemplo, la macro "Ma_macro" se inicia tan pronto como el usuario presiona la tecla Entrada después de escribir tu texto:
Sub AjoutZoneTexte()
Dim MaBarre As CommandBar
Dim MonTxt As CommandBarComboBox ' une zone de texte est de ce type Set MaBarre = CommandBars("BarrePerso")
Set MonTxt = MaBarre.Controls.Add(msoControlEdit) 'ajoute une zone de texte
MonTxt.OnAction = "Ma_macro"
MonTxt.Tag = "txt1"
End SubSub Ma_macro()
Dim MonBtn As CommandBarComboBox, strTxt As String Set MonBtn = CommandBars("BarrePerso").FindControl(, , "txt1")
strTxt = MonBtn.Text
'ici vous mettez vos instructions, exemple :
MsgBox strTxt
End Sub
Un cuadro combinado
Le das una opción al usuario, tan pronto como selecciona una de ellas, se lanza el procedimiento adjunto (aquí Ma_macro).
Sub AjoutZoneTexte()
Dim MaBarre As CommandBar
Dim MonTxt As CommandBarComboBox
Set MaBarre = CommandBars("BarrePerso")
Set MonTxt = MaBarre.Controls.Add(msoControlDropdown) 'ajoute une liste déroulante
With MonTxt
.OnAction = "Ma_macro"
.Tag = "lst1"
.AddItem "Choix 1" 'ajoute une ligne à la liste
.AddItem "Choix 2"
.AddItem "Choix 3"
.AddItem "Choix 4"
End With
End Sub
Sub Ma_macro()
Dim MonBtn As CommandBarComboBox, strTxt As String
Set MonBtn = CommandBars("BarrePerso").FindControl(, , "lst1")
strTxt = MonBtn.Text
'ici vous mettez vos instructions, exemple :
MsgBox strTxt
End Sub
04/05/2024 a las 08:39
¡Hola
muy buen tutorial
Estoy intentando crear una barra de menú personalizada.
aquí está el código
Dim MaBarre como CommandBar
Dim NouvBtn como CommandBarButton
'agregar una barra de herramientas
Establecer MyBar = CommandBars.Add("CustomBar")
'agrega el botón de cortar a la barra
Establecer NewBtn = MyBar.Controls.Add(msoControlButton, CommandBars("Standard").Controls("Cut").ID)
'agrega el botón de cortar a la barra
Establecer NewBtn = MyBar.Controls.Add(msoControlButton, Application.CommandBars("Standard").Controls("Copia").ID)
'agrega el botón pegar a la barra
Establecer NouvBtn = MyBar.Controls.Add(msoControlButton, Application.CommandBars("Standard").Controls("Paste").ID)
'muestra la barra
MiBar.Visible = Verdadero
no se muestra nada
puede ayudarme
Pierre
13/12/2022 a las 19:11
Hola,
Muchas gracias por esta herramienta tan útil.
Sin embargo, ¿puedo preguntar si es posible cambiar la fuente de un msoControlButton?
Le agradezco de antemano su respuesta
meilleures saludos