Menus e barras de comando são objetos e como tais possuem métodos e propriedades. Para se criar este tipo de objeto precisamos colocar o código em um módulo. Para inserir um módulo de programação precisamos estar na área de edição de código conhecida como VBE (Visual Basic Editor). Para acessar esta área pressione Alt+F11. Quando o VBE for aberto clique em Inserir --> Modulo para inserir um módulo VBA.
No módulo, precisamos definir a sub-rotina que conterá o código que criará nossos menus. A figura abaixo mostra a abertura e fechamento de uma sub-rotina:

Figura 0‑2
Qualquer coisa escrita em visual basic em Sub-End Sub será executada pelo programa.
Como foi dito, menus e barras de comando são objetos. Quando criamos nossos códigos é boa prática definir a dimensão (Dim) destes objetos ou variáveis. Por exemplo:

|
Sub criandoMenus()
Dim cmdBar As Object
Dim mnu As Object
End Sub |
Quando criamos estes objetos, precisamos dar um “set” para que o programa reconheça o tipo de objeto. Por exemplo, se pergunte: o que é “Object”? “Object” apenas não diz nada sobre o que o objeto é ou faz. O Exemplo abaixo mostra como instruir o programa a reconhecer o objeto:

|
Sub criandoMenus()
Dim cmdBar As Object
Dim mnu As Object
Set cmdBar = CommandBars.Add(Name:="Criando Menus")
End Sub |
Neste exemplo, estamos instruindo o VBA a acrescentar um objeto chamado cmdBar à coleção de barras de comando do aplicativo. O nome desta nova barra de comando é “Criando Menus”. Ao rodarmos o código acima, podemos verificar que o objeto é realmente adicionado à coleção de barras de comando indo até Ferramentas --> Personalizar. A figura abaixo mostra esta nova barra na coleção:

Figura 0‑3
Para que esta barra de comando fique visível, precisamos selecioná-las na caixa de barras de comando. Uma alternativa é incluir no código uma linha que faça isso:

|
Sub criandoMenus()
Dim cmdBar As Object
Dim mnu As Object
Set cmdBar = CommandBars.Add(Name:="Criando Menus")
cmdBar.Visible = True
End Sub |
Ao executarmos o código, a barra é apresentada na tela:

Figura 0‑4
Porém, como vimos anteriormente, a barra de comando pode estar em qualquer posição em nossa área de trabalho. O VBA nos permite posicionar a barra nas “cinco” cantos da área de trabalho. Estas posições são:
- msoBarFloating (barra flutuante na tela)
- msoBarTop (barra é colocada no topo)
- msoBarLeft (barra é colocada no canto esquerdo)
- msoBarRight (barra é colocada no canto direito)
- msoBarBottom (barra é colocada na parte inferior)
Para posicionar a nossa barra de comando utilizando Position:=nomeDaPosição (conforme a lista anterior). O código revisto fica:

|
Sub criandoMenus()
Dim cmdBar As Object
Dim mnu As Object
Set cmdBar = CommandBars.Add(Name:="Criando Menus", _
Position:=msoBarFloating)
cmdBar.Visible = True
End Sub |
A barra de comando é o objeto que recebe os menus (msoControlPopUp) e botões (como os botões que possuem ícones de salvar, abrir, etc.)
O objeto mnu criado anteriormente não diz nada sobre o objeto e precisamos defini-lo como fizemos com o cmdBar. A lógica de inserção é a mesma que a anterior, isto é, como inserimos a barra de comando a coleção de barras de comando do Excel, agora, vamos adicionar um menu a esta barra de comando:

|
Sub criandoMenus()
Dim cmdBar As Object
Dim mnu As Object
Set cmdBar = CommandBars.Add(Name:="Criando Menus", _
Position:=msoBarFloating)
Set mnu = cmdBar.Controls.Add(Type:=msoControlPopUp)
With mnu
.Caption = "meu menu"
.Width = 200
End With
cmdBar.Visible = True
End Sub |
Com isso criamos nossa barra de comando contendo um menu:

Figura 0‑5
O bloco With-End With nos permite definir as propriedades e métodos do objeto mnu sem precisar repetir o seu nome (mnu) para cada propriedade ou método que definimos.
Por analogia, podemos criar outros menus, precisando apenas defini-los no código. Para cada mnu que entrará no código. Por exemplo:

|
Sub criandoMenus()
'... Código anterior suprimido para este exemplo
Set mnu = cmdBar.Controls.Add(Type:=msoControlPopUp)
With mnu
.Caption = "meu menu"
End With
Set mnu = cmdBar.Controls.Add(Type:=msoControlPopUp)
With mnu
.Caption = "Seu menu"
End With
End Sub |

Figura 0‑6
Porém, o controle msoControlPopUp apenas abre o “popup”. Ele é incapaz de executar instruções. Para se executar instruções precisamos adicionar o controle msoControlButton. Este controle pode ser inserido na barra ao no menu.

|
Sub criandoMenus()
'... Código anterior suprimido para este exemplo
Set mnu = cmdBar.Controls.Add(Type:=msoControlButton)
mnu.FaceId = 326
Set mnu = cmdBar.Controls.Add(Type:=msoControlPopUp)
mnu.Caption = "meu menu"
Set mnu = mnu.Controls.Add(Type:=msoControlButton)
mnu.FaceId = 926
Set mnu = cmdBar.Controls.Add(Type:=msoControlPopUp)
mnu.Caption = "Seu menu"
End Sub |
Ao executarmos o código obtemos o seguinte resultado:

Figura 2‑6
Observe que não é preciso definir um objeto para o botão. Podemos utilizar o objeto mnu para fazer isso (poderíamos até usar o cmdBar).
Os leitores acostumados com VBA devem ter notado que ao inserir o ponto (.) após o nome do objeto a caixa contendo a lista de propriedades e métodos não é exibida. Mas quando tentamos forçar a exibição da caixa o VBE não aceita. Este tipo de problema diz respeito ao objeto em si.
Lembra quando perguntamos que objeto era esse? Pois bem, quando definimos a dimensão do objeto como sendo “Object” ele pode ser qualquer coisa. Em outras palavras, a caixa de propriedades e métodos não fica disponível porque o VBA não reconhece o objeto. A solução para o nosso problema é bem simples: basta dimensionar o objeto corretamente.
Quando criamos nossa barra de comando, nós utilizamos os seguintes objetos:
- CommandBar (para o cmdbar)
- CommandBarPopup (para o msoControlPopUp)
- CommandBarButton (para o msoControlButton)
Embora tenhamos utilizados estes objetos, nós não os dimensionamos explicitamente como sendo este objeto. Quando dimensionamos o objeto é importante dimensioná-lo com a classe correta. Embora isso não afete o resultado, ele certamente afeta o desempenho e a nossa produtividade. Nos exemplos anteriores fica difícil saber qual propriedade ou método a ser utilizado. A menos que você os conheça o seu trabalho será muito menos produtivo.
Embora seja possível, esta prática não é aconselhável. Mais adiante veremos o porquê.
|