Como Fazer Menus Excel
Como Fazer Menus Excel
Como Fazer Menus Excel
O autor descreve, de forma detalhada, como criar os diversos tipos de menus e barras de comandos
disponíveis no Excel. Crie atalhos no teclado para acessar menu personalizado, FaceIDs personalizadas
para os aplicativos, menus de atalho com o botão direito do mouse e muito mais. Uma referência que
não pode faltar aos usuários que desejam criar aplicações profissionais com o Excel, definindo seus
próprios menus e barras de comandos, personalizadas. O módulo é acompanhado por 10 pastas de
trabalho desenvolvidas com vários exemplos práticos, os quais ajudarão você a entender e a
acompanhar os exemplos propostos no curso.
APENAS: R$ 10,00
O autor descreve, de forma detalhada, como manipular caixas de manipulação e caixas de listagem.
Neste curso o amigo leitor aprenderá, em detalhes, como:
APENAS: R$ 10,00
Fórmulas no Excel:
Manipulando Datas e Horas
Este módulo trata sobre a manipulação de datas e horas no Excel. Você irá entender exatamente como
o Excel armazena valores de datas e horas, aprenderá a criar fórmulas e usar funções para cálculos
com datas e horas. Além do arquivo .PDF, você também receberá 13 planilhas, com os exemplos
utilizados no curso.
APENAS: R$ 10,00
BRINDE: Na compra do CD-04 você ganha um vídeo curso com 22 minutos de duração, o qual mostra,
passo a passo, como criar um controle do tipo calendário(Calendar Control) no VBA.
Fórmulas no Excel:
Fazendo Milagres com Fórmulas Matriciais
O autor descreve, de forma detalhada, como funcionam e como manipular fórmulas matriciais no Excel.
Este módulo trata sobre a manipulação e construção de fórmulas matriciais, do ponto de vista prático.
Os exemplos visam desenvolver a compreensão do leitor sobre como tais funções funcionam como elas
podem ser aplicadas na resolução de problemas práticos. Uma referência que não pode faltar ao leitor
que deseja entender como funcionam os cálculos e manipulações complexas de dados no Excel. O
módulo é acompanhado por 9 pastas de trabalho (em um total de 22 planilhas), as quais
apresentam inúmeros exemplos práticos.
Além disso, o leitor poderá adquirir um curso em vídeo, com mais de 2 horas de duração, o qual
fornece uma série de outros exemplos.
APENAS: R$ 10,00
Fórmulas no Excel:
Fazendo Milagres com Fórmulas Matriciais (Vídeo Curso)
Este novo curso introduz a interatividade do vídeo para ensinar sobre fórmulas e funções matriciais no
Excel e VBA. Você aprenderá através das explicações e visualização como as fórmulas são entradas e
manipuladas. Aprenda através de aulas em vídeo, interativas, de fácil acompanhamento.
Este vídeo é a companhia perfeita para quem já comprou o curso "Fórmulas e Funções Matriciais no
Excel", no formato .PDF. Embora, ambos tratem do mesmo assunto, aspectos diferentes, assim como
exemplos diferentes, são tratados e mostrados
no vídeo. Ou seja, no vídeo você terá diversos exemplos novos, não presentes no curso em .PDF.
Combinando o material escrito no curso .PDF com o vídeo o aluno terá uma referência completa sobre
fórmulas matriciais no Excel... Além disso, o leitor descobrirá que nem sempre o Ajuda do Excel é de
"grande ajuda". Principalmente, quando ele informa a maneira incorreta para se manipular matrizes
constantes.
IMPORTANTE: Este curso está disponível somente para envio em CD, pelos Correios. Devido ao
tamanho dos arquivos de vídeo - quase 400 MB, fica inviável disponibilizá-los via download ou via e-
mail.
Para você que gosta de cursos interativos, com vídeo e som, esta sem dúvidas é uma excelente opção.
Este é apenas o primeiro de uma série de cursos que serão disponibilizados no formato de vídeo-aulas.
APENAS: R$ 10,00
Fórmulas no Excel:
Funções de Procura e Referência
Uma referência completa que não pode faltar a todos os usuários que têm a necessidade de trabalhar
com fórmulas e funções de pesquisa no Excel.
Neste novo curso o autor descreve, de forma detalhada, como funcionam e como utilizar as funções e
fórmulas para pesquisa e validação de dados no Excel. Este módulo trata sobre a manipulação e criação
de fórmulas de procura e referência do ponto de vista prático. CHEGA DE DÚVIDAS SOBRE COMO
USAR AS FUNÇÕES PROCV E PROCH, DENTRE OUTRAS.
APENAS: R$ 10,00
O autor descreve de forma detalhada, como manipular o registro do Excel. Este módulo mostra como
modificar a Registry do Excel (Windows) de forma a personalizar dezenas de aspectos do Excel, tais
como: número de ações que podem ser desfeitas, modelos de gráfico padrão, gerenciamento de
abertura de arquivos, segurança de macros, segurança de Internet, etc.
O autor utiliza uma linguagem extremamente didática, de fácil compreensão. O curso é todo
baseado em exemplos práticos, detalhadamente explicados.
Você não vai acreditar nas configurações que podem ser feitas no Excel usando a Registry do
Windows.
APENAS: R$ 10,00
Então, sem dúvidas, este curso foi feito sob encomenda para você. Chega de dúvidas, é hora
de dominar os MENUS e BARRAS DE FERRAMENTAS no Word.
O autor descreve, de forma detalhada, como manipular barras de comandos, menus e botões de
comandos no Word. Este curso trata sobre a manipulação destas ferramentas no Word e como elas
podem ser utilizadas para personalizar o desenvolvimento de aplicativos no Word. Este curso segue a
linha do curso equivalente no Excel: Criando Menus Personalizados no Excel, porém, a abordagem,
conteúdo e exemplos são totalmente diferentes, tornando o curso no Word e no Excel complementares,
quando o assunto é desenvolvimento no Office. Se você já possui o curso sobre menus no Excel, este
curso de menus no Word é o complemento ideal para uma referência ainda mais completa sobre como
manipular estes objetos entre os aplicativos Office.
APENAS: R$ 10,00
O autor descreve, de forma detalhada, como criar os diversos tipos de menus e barras de comandos
disponíveis no Microsoft Access. Este módulo, visa a criação de atalhos no teclado para acessar menu
personalizado, FaceIDs personalizadas para os aplicativos, menus de atalho com o botão direito do
mouse e muito mais. Uma referência que não pode faltar às pessoas que estão sérias quando o assunto
é menu personalizado no MS Access. O módulo é acompanhado por 14 bancos de dados e uma
pasta de trabalho do Excel como recurso externo.
• O que é um menu
• O que é uma barra de comando
• Como menus e barras de comando são criadas no Access
• Como remover os menus personalizados
• Removendo menus manualmente
• Removendo menus via código
• Posicionando os objetos
• Executando ações e atalhos de teclado
• Utilizando os FaceIDs do Office no Access
• Faces personalizadas
• Criando “popups” de atalho
• Adicionando um controle a um menu de atalho popup já existente
• Menus “Combobox”
• Automatizando a criação de menus
• Substituindo menu principal do Access pelo seu menu personalizado
• Listando os menus e sub-menus do Access
• Listando somente as barras de comando/ferramentas em um arquivo texto
• Listando as barras de comando/ferramentas e sub-menus no Access
APENAS: R$ 10,00
Este curso é um curso teórico sobre Matemática Financeira. O curso apresenta desde uma revisão dos
elementos básicos da Matemática, passando pelos elementos básicos da Matemática Financeira, tais
como: juros simples, juros compostos, valor presente, valor futuro, fluxo de caixa, capitalização, etc.
O autor utiliza uma linguagem extremamente didática, de fácil compreensão. O curso é todo
baseado em exemplos práticos, detalhadamente explicados.
• CÁLCULOS DE EMPRÉSTIMOS
• CÁLCULOS DE FINANCIAMENTOS
• CÁLCULOS DE PRESTAÇÕES DO AUTOMÓVEL
• CÁLCULOS DE PRESTAÇÕES DA CASA PRÓPRIA
• CÁLCULOS PARA FUNDOS DE APOSENTADORIA
• CÁLCULOS PARA FINANCIAMENTO DE CARTÃO DE CRÉDITO
• DEZENAS DE OUTROS EXEMPLOS PRÁTICOS
Para cada capítulo, há uma breve introdução aos conceitos teóricos da Matemática Financeira, e logo a
seguir são apresentados exemplos práticos, detalhadamente explicados, resolvidos passo-a-passo. Não
são apresentadas longas discussões teóricas, pois este não é o foco do curso. O foco é apresentar o
conceito e colocá-lo em prática logo em seguida, para que o leitor possa ver como é o funcionamento
dos cálculos.
MESMO QUE VOCÊ NÃO SEJA "MUITO AMIGO DA MATEMÁTICA", COM ESTE CURSO VOCÊ
VERÁ COMO É FÁCIL APRENDER MATEMÁTICA FINANCEIRA.
APENAS: R$ 10,00
Ao adquirir este eBook você tem o direito de lê-lo na tela do seu computador e de imprimir
quantas cópias desejar, desde que sejam para uso pessoal. É vetada a distribuição deste eBook,
mediante cópia ou qualquer outro meio de reprodução, para outras pessoas. Se você recebeu
este eBook através de e-mail ou via FTP de algum site da Internet, ou através de CD de Revista,
saiba que você esta com uma cópia pirata, não autorizada. Se for este o seu caso entre em
contato com o autor através do e-mail rm@faircourt.com ou comunique diretamente ao nosso
site através do e-mail webmaster@juliobattisti.com.br.
Ao regularizar a sua cópia, você estará remunerando, mediante uma pequena quantia, o trabalho
do autor e incentivando que novos trabalhos sejam disponibilizados.
Visite periodicamente o site www.juliobattisti.com.br para ficar por dentro das novidades!
Pré-requisitos
Para completar este curso, você precisa ter um conhecimento mínimo de manipulação das
planilhas do Excel. Porém, o conhecimento básico de VBA será necessário para que o jargão
(embora ele tenha sido reduzido ao máximo) não atrapalhe a compreensão, desenvolvimento e
aprendizado.
Este curso não tem por objetivo ensinar qualquer outra coisa a não ser a criação de menus, barras
de comando e botões personalizados no Excel utilizando VBA (Visual Basic for Application).
Os leitores interessados podem adquirir o curso básico de Excel em 120 lições no seguinte
endereço: www.juliobattisti.com.br/excel120/excel120.asp
Qualquer dúvida referente a este módulo podem ser colocadas diretamente no fórum Excel
avançado no endereço: http://www.juliobattisti.com.br/forum/forum.asp?FORUM_ID=3
Comentários e sugestões para melhora do material podem ser enviados diretamente para o autor
no endereço rm@faircourt.com
ÍNDICE ANALÍTICO
Introdução ........................................................................................................................................ 1
Bem-vindo a série “Como Fazer”. ........................................................................................... 1
Antes de continuar .................................................................................................................. 1
6. Colocando os FaceIDs.......................................................................................................... 19
6.1. FaceID personalizadas................................................................................................. 19
8. Menus “Dropdown”................................................................................................................ 28
Introdução
Nas series que serão escritas estaremos olhando em aspectos distintos do Excel de acordo com a
demanda do fórum Excel Júlio Battisti (http://www.juliobattisti.com.br). A intenção principal é
fornecer ao internauta uma ferramenta que concentre a atenção na solução de um problema
específico.
Nesta primeira série estaremos vendo as diversas possibilidades de se criar barras de comandos
e menus personalizados. Iremos utilizar métodos manuais e dinâmicos para criar nossas barras e
menus. Estaremos olhando os elementos que compõem os menus e barras de comando e como
eles são utilizados na solução de nossos problemas.
Antes de continuar
O trabalho desenvolvido foi testado para compatibilidade com Excel 2002 e 2003. Devido à rápida
mudança em termos de tecnologia de software, atenção sempre será dada às versões mais
recentes do aplicativo Excel.
Sugestões serão sempre bem-vindas e esperamos que o leitor participe pro ativamente no
desenvolvimento do material aqui apresentado.
Finalmente, quando objetos e variáveis são dimensionados nesta apostila é utilizada a convenção
de dimensionamento dos objetos e variáveis. Por exemplo, um botão é dimensionado como Dim
btn.
Figura 1-1
O menu principal está no topo do aplicativo. Do lado esquerdo do aplicativo temos a barra de
formatação, na parte inferior temos a barra de Desenho, no canto direito temos a barra de gráficos
e flutuando na área de trabalho temos a barra padrão.
Como podemos ver, ao criarmos barras de comando podemos fixá-las em qualquer parte da área
de trabalho.
Hoje, não existe uma linha entre “menus” e “barras de comando”, em outras palavras, o “menu”
principal do Excel, na verdade, está dentro de uma barra de comando e pode ser arrastado e
colocado em um local qualquer da área de trabalho. Ele não é fixo com o aplicativo em si. Isto
representa uma flexibilidade enorme em termos de manuseio do objeto em questão.
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 2-1
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
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 2-2
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
Figura 2-3
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:
Sub criandoMenus()
Dim cmdBar As Object
Dim mnu As Object
Set cmdBar = CommandBars.Add(Name:="Criando Menus", _
Position:=msoBarFloating)
cmdBar.Visible = True
End Sub
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
Figura 2-4
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 2-5
Sub criandoMenus()
'... Código anterior suprimido para este exemplo
Set mnu = cmdBar.Controls.Add(Type:=msoControlButton)
mnu.FaceId = 326
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)1.
1
Embora seja possível, esta prática não é aconselhável. Mais adiante veremos o porquê.
Autor: Robert F Martim Criado em: 19/5/2004 11:28:00
Publicado: www.juliobattisti.com.br Última edição: 12/4/2005 20:00:00
Contato: rm@faircourt.com
Série “Como Fazer”: Criando menus, barras de comando e botões personalizados no Excel 7
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.
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.
Figura 3-1
Ao definirmos explicitamente o tipo do objeto estamos deixando o código mais claro para outra
pessoa ler e estamos facilitando o nosso trabalho também. As dimensões são redefinidas abaixo:
Sub criandoMenus()
Dim cmdBar As CommandBar
Dim mnu As CommandBarPopup
Dim btn As CommandBarButton
End Sub
Com dimensões definidas com a classe dos objetos corretamente, as vantagens começa
aparecer. Vamos ver o exemplo do botão (btn):
Figura 3-2
O VBA disponibiliza as propriedades e métodos para o objeto btn porque ele sabe em qual classe
ele deve buscar tais informações. O nosso trabalho fica mais dinâmico e eficiente pois podemos
rapidamente correr a lista e buscar o que procuramos. Antes, precisávamos adivinhar ou saber de
antemão quais eram as propriedades e métodos de cada objeto.
Como os objetos possuem o prefixo CommandBars fica relativamente fácil dimensionar os objetos
corretamente. O código completo comentado e dimensionado corretamente fica:
Sub criandoMenus()
Dim cmdBar As CommandBar
Dim mnu As CommandBarPopup
Dim btn As CommandBarButton
4. Posicionando os objetos
Uma questão que devemos responder é: onde devemos colocar nosso menu? Via de regra, nós
criamos menus para facilitar o trabalho e acesso do usuário a certos comandos, automações ou
funções que criamos. Portanto, não adianta criar um menu do tipo msoControlPopup nos cantos
pois o acesso ao menu ficará “estranho”. Geralmente barras de comando são colocadas no topo
utilizando-se o msoBarTop. Um outro método bastante utilizado é criar um menu personalizado
na barra de comando contendo os menus do Excel.
Nesta parte estaremos fazendo exatamente isso. Estaremos posicionando o nosso menu em
diferentes pontos de nossa área de trabalho.
Sub criandoMenus()
'Somente as partes novas serão repetidas. O resto será suprimido
Set cmdBar = CommandBars.Add(Name:="Criando Menus", _
Position:=msoBarLeft)
'Fixa a barra do lado esquerdo
O código acima introduz mais uma versatilidade das barras de comando. Muitas vezes não
queremos que o usuário fique movimentando as barras de comando, pois isso pode prejudicar o
layout geral do aplicativo que desenvolvemos. A maneira como isso é feita é demonstrada acima.
Neste caso específico, estamos lidando com o posicionamento de nossa barra de comando. E o
posicionamento de nosso menu? Como podemos posicionar o nosso menu no Excel?
Geralmente, quando criamos menus queremos adicioná-los ao menu principal do Excel. Porém, é
importante saber onde ele será posicionado. Por exemplo, se desejamos posicionar nosso menu
antes do menu “Arquivo”, como procedemos? Os menus são indexados o que facilita o nosso
trabalho. Como o menu Arquivo é o primeiro, a sua posição é 1. A numeração continua assim até
o último menu da barra de comando padrão.
Para posicionar nosso menu no topo, modificaremos o nosso código e dimensão dos objetos
ligeiramente:
Sub criandoMenus()
Dim cmdBar As CommandBarPopup
Dim mnu As CommandBarPopup
Dim btn As CommandBarButton
End Sub
Como estamos interessados em adicionar um controle tipo menu ao menu principal do Excel,
precisamos redimensioná-lo para CommandBarPopup. Novamente, precisamos instruir o Excel de
forma que ele saiba o que fazer com os objetos:
Sub criandoMenus()
On Error Resume Next 'Continua a execução mesmo que haja um erro
'Deleta o menu anterior se ele existir
CommandBars(1).Controls("Criando Menus").Delete
O resultado:
Figura 4-1
Além de podemos adicionar os menus em qualquer posição do menu padrão do Excel, podemos
também inserir botões nos próprios menus do Excel.
Por exemplo, vamos supor que desejamos acrescentar um botão no menu Arquivo antes do botão
Novo (o primeiro botão no menu Arquivo). Neste caso, precisamos saber qual o ID do menu em
questão. No caso do menu Arquivo o ID é 30002.2
Sub criandoMenus()
Dim mnu As CommandBarPopup
On Error Resume Next
Set mnu = CommandBars(1).FindControl(ID:=30002)
Set btn = mnu.Controls.Add(Type:=msoControlButton, Before:=1)
With btn
.Caption = "MEU BOTAO"
.FaceId = 984
End With
End Sub
Figura 4-2
Um botão é inserido no menu Arquivo antes do botão Novo. A instrução Before (Antes de) indica
onde o botão será inserido. Não existe a opção After (Depois de), pois por analogia tudo que for
antes não pode ser depois. Em outras palavras, se nosso botão está antes de algum botão ou ele
é o primeiro de tudo ou ele está posicionado depois de algum outro botão e, portanto, antes de
algum outro. Quando não definimos, o Excel sempre joga o botão no final da lista.
2
Uma lista contendo os números de identificação dos itens dos menus pode ser encontrada em: http://www.microsoft.com
Autor: Robert F Martim Criado em: 19/5/2004 11:28:00
Publicado: www.juliobattisti.com.br Última edição: 12/4/2005 20:00:00
Contato: rm@faircourt.com
Série “Como Fazer”: Criando menus, barras de comando e botões personalizados no Excel 13
Com o menu criado, precisamos adicionar eventos aos botões. Observe que somente os botões
recebem eventos. Barras de comando e menus do tipo popup não executam comandos.
• OnAction
• Execute
A diferença entre OnAction e Execute é que OnAction executa um comando que nós mesmos
criamos ao passo que Execute executa um comando interno do Excel como Imprimir, por
exemplo. Porém, o Execute é acionado quando criamos nosso botão, portanto, iremos utilizar o ID
do botão interno para executar o comando.
Sub executandoMenus()
Dim mnu As CommandBarPopup
Dim btn As CommandBarButton
Figura 5-1
Os faceID’s ficam a critério do leitor. Mais adiante veremos como personalizar as carinhas dos
botões de menu.
Observe que no OnAction nós colocamos o nome da macro a ser executada. Porém, no caso do
Execute estaremos utilizando o número referente ao comando que desejamos executar para fazer
o que desejamos. Como o OnAction necessita de uma macro precisamos acrescentá-la ao nosso
projeto. Como exemplo, podemos utilizar a seguinte sub-rotina:
Sub Mensagem()
MsgBox "Esta é uma mensagem de teste gerada em: " & Date
End Sub
Quando clicamos no primeiro botão ele executa o OnAction e a mensagem é passada para o
usuário:
Figura 5-2
Já no segundo botão estamos executando um comando interno do Excel com um ID igual a 901:
Figura 5-3
Uma vez que definimos qual é o ID do comando o método Execute torna-se redundante, pois ao
clicarmos no botão o comando será executado. Porém, há situações onde queremos que o
comando seja executado quando o código é rodado.
Os comandos acima são acessados através de um “clique”, porém, podemos também acrescentar
um combinação de teclas para criar um atalho para o nosso botão.
Atalhos são acessados diretamente do teclado e facilitam a execução de comando, pois não
precisamos recorrer ao mouse toda vez que desejamos executar tal comando.
Sub mnuAtalho()
Dim mnu As CommandBarPopup
Dim btn As CommandBarButton
A compilação acima e composta de duas partes. A primeira monta o menu que desejamos e a
segunda cria o Atalho (Shortcut) que desejamos. É importante lembrar que certos atalhos podem
entrar em conflito com algum atalho do sistema. No caso anterior, se o atalho for definido como
Ctrl+Alt+A ao pressionar esta combinação de teclas obtemos “á” ao invés da execução do
comando.
Observe também que, diferentemente do que foi feito antes, para excluir o menu anterior
chamamos uma sub-rotina diferentes. Esta forma de construção é melhor do que a utilizada
anteriormente, pois possibilita a chamada da exclusão sem construir um novo menu. Nos
exemplos que o leitor encontrará neste módulo a utilização de ambos os métodos é feita
propositalmente para forçar o aprendizado.
Figura 5-4
A criação de atalhos para menu deve ser pensada de antemão para que os atalhos tenham
significado é sejam intuitivos.
6. Colocando os FaceIDs
Nos exemplos anteriores em vários casos foi colocado um FaceID no botão. O único objeto do
menu que pode receber a carinha é o botão.
O Excel possui centenas dessas carinhas que podem ser utilizadas em nossos projetos. A figura
abaixo mostra uma planilha do Excel contendo diversas carinhas e suas respectivas referências
numéricas3:
Figura 6-1
Além das carinhas disponibilizadas com o Excel podemos também utilizar as nossas carinhas
personalizadas. Para utilizar as carinhas disponíveis com o Excel basta seguir os exemplos
anteriores. Porém, para criar as nossas próprias carinhas precisamos desenvolver nosso código
um pouco. A figura abaixo mostra uma barra de comando contendo FaceIDs personalizadas:
Figura 6-2
Para se criar este tipo de temos que passar por dois processos:
1. Copiar a figura
3
Esta planilha pode ser baixada no seguinte endereço: www.j-walk.com/ss/excel/tips/faceidgrid.exe
Autor: Robert F Martim Criado em: 19/5/2004 11:28:00
Publicado: www.juliobattisti.com.br Última edição: 12/4/2005 20:00:00
Contato: rm@faircourt.com
20 Série “Como Fazer”: Criando menus, barras de comando e botões personalizados no Excel
Para iniciar vamos criar várias figuras em uma planilha. As figuras podem ser desenhadas (como
no exemplo abaixo) ou importadas de arquivos qualquer.
Figura 6-3
Acima, temos 7 figuras distintas que utilizaremos para criar a barra de comando personalizada
como mostrado anteriormente. Para o que desejamos fazer, precisamos dar nomes que as
figuras. O ideal é que os nomes sejam em séria. Neste caso específico, os nomes são fig1, fig2,
fig3, fig4, fig5, fig6 e fig7.
Como o processo de copiar envolve a seleção do objeto a ser copiado, precisamos levar isso em
conta no nosso código. Além disso, tendo em vista que copiamos estas figuras para uma planilha
em nossa pasta de trabalho precisamos fazer referência a esta pasta também.
Sendo assim, o código que resolve nosso problema pode ser dado por:
Sub carinhasPersonalizadas()
Dim cmdBar As CommandBar
Dim btn As CommandBarButton
Dim ws As Worksheet
On Error Resume Next
CommandBars("Carinhas personalizadas").Delete
Set ws = ThisWorkbook.Sheets("FaceID")
Set cmdBar = CommandBars.Add(Name:="Carinhas personalizadas", _
Position:=msoBarFloating)
For i = 1 To 7
ws.Shapes("fig" & i).Select
Selection.Copy
Set btn = cmdBar.Controls.Add(Type:=msoControlButton)
With btn
.Caption = "Meu nome é fig" & i
.Width = 30
.PasteFace
End With
Next i
cmdBar.Visible = True
End Sub
O código continuar a se desenvolver como nos exemplos anteriores, isto é, damos um “set” no
cmdBar e nos botões. A única diferença aqui é que ao dar o “set” no Caption do botão fazemos
isso dentro de um loop.
Figura 6-4
Figura 7-1
Assim como os menus anteriores, podemos acrescentar o nosso botão ao menu de atalho.
Contudo, podemos também criar os nossos menus de atalho que respondem quando clicamos em
determinados locais da área de trabalho.
Primeiro, vamos criar o menu. Para isso utilizaremos dois módulo: um que conterá o código para a
criação dos menus e outro que conterá as ações (OnAction) efetuadas pelo menu4.
O código de ser escrito em um módulo para menu somente (neste exemplo, o nome do módulo é
modMenu). O código construído com as opções acima fica:
Figura 7-2
Porém, ainda não estamos prontos para a compilação. Precisamos definir os OnAction para
cada botão em nosso menu e os eventos que irão dispara o menu acima.
Sub delAtalho()
'Apaga a barra de comando anterior caso ela exista
On Error Resume Next
CommandBars(BARRA).Delete
End Sub
Sub negrito()
'Modifica a seleção para negrito
Selection.Font.Bold = True
End Sub
Sub itálico()
'Modifica a seleção para itálico
Selection.Font.Italic = True
End Sub
Sub sublinhado()
'Modifica a seleção para sublinhado
Selection.Font.Underline = True
End Sub
Sub sobre()
msg = "Este exemplo foi criado por Robert F Martim como parte " _
& "do módulo sobre criação "
msg = msg & "de menus de atalho utilizando VBA no " _
& "Excel." & vbCr & vbCr
msg = msg & "Para maiores informações visite: " _
& "www.juliobattisti.com.br" & vbCr & vbCr
msg = msg & "Para falar com o autor escreva " _
& "para: rm@faircourt.com"
Sub ajuda()
'Mostra o Help do Excel XP
'Caso o seu Excel seja o 2000, mude para XLMAIN9
'Se for o 2003, mude para XLMAIN11
Application.Help "XLMAIN10.CHM"
End Sub
Como o menu é disparado quando clicamos com o botão direito do mouse, precisamos criar este
evento. Nesta parte estamos interessados no RightClick na Plan1. Abra o VBE da Plan1 e
entre o seguinte código:
Está é a parte final de nosso código. O código para criação e deleção do menu quando a planilha
é aberta ou fechada encontra-se na planilha que acompanha este tópico e não será repetido
abaixo.
Figura 7-3
A nossa próxima parada é adicionar o nosso botão a um dos menus de atalho padrão do Excel.
Para fazermos isso, precisamos saber o índice ou nome do menu ao qual acrescentaremos. Com
este módulo há um aplicativo que cria uma lista dos nomes destes menus para sua futura
referência.
A barra de comando que nos interessa é a Cell cujo índice é 295. Para adicionar um botão a esta
barra de comando, procedemos da mesma forma quando adicionamos o botão ao menu principal
do Excel:
Sub mnuAtalho()
Dim mnu As CommandBarButton
delAtalho
Set mnu = CommandBars(29).Controls.Add(Type:=msoControlButton, _
before:=1)
With mnu
.Caption = "Sobre..."
.FaceId = 326
.OnAction = "sobre"
End With
End Sub
Sub delAtalho()
On Error Resume Next
CommandBars(29).Reset
End Sub
5
No Excel 2002, o índice é 28. Você pode utilizar o nome da barra de comando. Neste caso, use o nome “Cell”
Autor: Robert F Martim Criado em: 19/5/2004 11:28:00
Publicado: www.juliobattisti.com.br Última edição: 12/4/2005 20:00:00
Contato: rm@faircourt.com
Série “Como Fazer”: Criando menus, barras de comando e botões personalizados no Excel 27
Figura 7-4
8. Menus “Dropdown”
Os menus tipo dropdown (também chamados de combobox) são os menus que contém uma lista
que quando clicada disponibiliza os itens da lista para o usuário. A figura abaixo mostra o exemplo
clássico do Excel:
Figure 8-1
Através desta lista podemos selecionar a visualização de nossa área de trabalho, isto é, podemos
ampliar ou reduzir o tamanho da área de trabalho conforme necessário.
O exemplo que estaremos olhando é retirado de uma de minhas respostas no fórum sobre este
assunto. Contudo, a resposta no fórum utiliza apenas uma das possibilidades. Aqui estaremos
vendo como construir este tipo de combobox de uma forma diferente.
A nossa combobox conterá uma lista de todas as planilhas disponíveis na pasta de trabalho e
quando um item da lista é selecionado a planilha em questão é selecionada. Este método pode
ser interessante se possuímos um número elevado de planilhas ou se desejamos esconder as
guias das planilhas, por exemplo.
Figure 8-2
Primeiramente, vamos definir o nome da barra de comando como sendo uma Public Const
(constante pública). No topo do módulo devemos entrar a seguinte linha:
Autor: Robert F Martim Criado em: 19/5/2004 11:28:00
Publicado: www.juliobattisti.com.br Última edição: 12/4/2005 20:00:00
Contato: rm@faircourt.com
Série “Como Fazer”: Criando menus, barras de comando e botões personalizados no Excel 29
O nome da constante pode ser qualquer coisa que o leitor desejar. Agora, a constante
CMDBARNOME pode ser acessada de qualquer sub-rotina que escrevemos sem a necessidade de
redimensioná-la. O próximo passo é a construção do menu:
Sub wsMenus()
Dim cmdBar As CommandBar
Dim btnDropDown As Object
Dim ws As Worksheet
Dim wb As Workbook
Dim wsNome As String
Set wb = ActiveWorkbook
btnDropDown.ListIndex = 1
btnDropDown.OnAction = "wsAcessar"
cmdBar.Visible = True
End Sub
Como o controle btnDropDown não esta disponível nos objeto Commandbar, o definimos como
sendo um Object apenas. O método para se adicionar um item ao btnDropDown é o mesmo
que utilizamos para adicionar um item a uma listbox ou combobox em um formulário. Desta
forma, se houver alguma dúvida sobre os métodos e propriedades disponíveis em um
msoControlComboBox podemos procurar nas propriedades e métodos de um combobox para
formulário, pois ambos são quase idênticos.
O ListIndex da combobox é colocado para 1, pois queremos que o primeiro item da lista seja
selecionado. Se pularmos esta linha, o primeiro item da lista aparece em branco como mostram as
figuras abaixo:
Figura 8-1
Autor: Robert F Martim Criado em: 19/5/2004 11:28:00
Publicado: www.juliobattisti.com.br Última edição: 12/4/2005 20:00:00
Contato: rm@faircourt.com
30 Série “Como Fazer”: Criando menus, barras de comando e botões personalizados no Excel
Figura 8-2
Este é apenas um detalhe e fica a critério do leitor definir em qual modo se pretende apresentar a
barra de comando.
Com a barra de comando e o btnDropDown prontos, precisamos definir a macro que executa o
OnAction. Em nosso código chamamos esta macro de “wsAcessar”. Quando um dos itens da
lista é selecionado esta sub-rotina é executada.
Sub wsAcessar()
Dim wsÍndice As Integer
wsÍndice= CommandBars(CMDBARNOME).Controls(1).ListIndex
ThisWorkbook.Sheets(wsÍndice).Activate
End Sub
ThisWorkbook.Sheets(CommandBars(CMDBARNOME). _
Controls(1).ListIndex).Activate
Portanto, podemos cortar o dimensionamento de wsÍndice e a linha que o define como sendo
igual ao índice do item selecionado no controle btnDropDown.
Infelizmente, o método anterior deixa várias perguntas no ar: e se uma planilha for removida ou
adicionada? E se uma planilha mudar de posição? Se fizermos isso, veremos que o método
anterior falha em nos fornecer as respostas às questões colocadas. A solução é rever o método
utilizado e procurar uma solução melhor.
Contudo, soluções não são vendidas em latinhas no mercado da esquina e precisamos pensar em
uma maneira mais eficiente e pesquisar uma solução. Em programação uma solução não existe
até que ela seja inventada. O próximo exemplo utiliza uma Class para inventar uma resposta
para nossa questão.
Os eventos são referentes ao aplicativo Excel. Veja que a definição é pública como fizemos com a
constante do nome de nossa barra de comando. Assim como definimos a constante como sendo
um String aqui definimos os eventos sendo capturados como sendo Application.
For i = 1 To btnDropDown.ListCount
If btnDropDown.List(i) = Sh.Name Then _
btnDropDown.ListIndex = i: Exit For
Next
End Sub
Após a definição do objeto btnDropDown, limpamos quaisquer valores que estão presentes no
btnDropDown. Embora neste exemplo isto não seja crítico é boa prática sempre limpar qualquer
lista antes de adicionar uma lista nova.
Com o objeto ws fazemos, agora, um loop em todas as planilhas presentes na pasta ativa.
Utilizamos o método AddItem como fizemos em nosso primeiro exemplo.
Finalmente, checamos o índice do btnDropDown e casamos este valor com o índice e nome da
planilha a qual ele se refere.
Como isso terminamos a captura dos eventos ocorridos nas planilhas. Agora, precisamos capturar
os eventos da pasta de trabalho. Aqui, teremos menos trabalhos pois queremos apenas saber a
pasta atual para que o evento da planilha seja reprocessado. Assim sendo, tudo que desejamos
saber é quando uma pasta nova é ativada para que o evento da planilha seja rodado:
Quando uma pasta de trabalho (workbook) é ativada o evento para a planilha é rodado e definido
como a planilha ativa (ActiveSheet) na pasta de trabalho atual (AtiveWorkbook). Quando o
evento ocorre as planilhas listadas no btnDropDown são as da pasta ativa.
Para terminar precisamos construir nossa barra de comando contendo a combobox. Depois das
várias construções anteriores, não há segredo algum nesta construção, apenas algumas
novidades:
Sub wsMenus()
Dim cmdBar As CommandBar
Dim btnDropDown As Object
With cmdBar
.Visible = True
.Protection = msoBarNoChangeDock + msoBarNoResize
End With
End Sub
Em seguida criamos nosso menu como fizemos anteriormente. Quando definimos as propriedades
do btnDropDown acrescentamos um Tag ao btnDropDown pois é este o valor sendo
procurado na Classe1 através do FindControl.
O código anterior criar o menu e aplica os eventos ao menu. Porém, ainda precisamos definir a
sub-rotina que ativa a planilha selecionada na lista. Esta sub-rotina foi chamada de selPlanilha
na propriedade OnAction:
Sub selPlanilha()
Dim btnDropDown As Object
On Error Resume Next
Set btnDropDown = CommandBars.FindControl _
(Type:=msoControlDropdown, Tag:="Lista")
ActiveWorkbook.Sheets(btnDropDown.Text).Activate
End Sub
Mais uma vez utilizamos a Tag para encontrar o controle btnDropDown. Quando o controle é
encontrado, instruímos o Excel a selecionar a planilha cujo nome é igual ao texto contido no
btnDropDown.
9. Botões Toggle
Botões do tipo toggle são úteis quando desejamos ativar ou desativar algo em nossa pasta.
Vamos supor por exemplo que desejamos esconder as guias das planilhas..
No tópico anterior, tivemos que criar uma classe para lidar com os eventos. Aqui, teremos que
fazer a mesma coisa. O que acontece é que se mudarmos de uma pasta onde as guias estão
escondidas para uma onde elas não estão, sem uma classe para lidar com o evento de mudança
de uma pasta para outra o botão toggle não refletirá a mudança e permanecerá “ticado” ou não. A
figura abaixo mostra um exemplo de botão toggle:
Figura 9-1
Novamente, iremos iniciar pela classe que lidará com os seguintes eventos:
• Ativação da planilha
• Ativação da pasta
• Ativação da janela
Como cada planilha dentro de uma pasta pode ter as guias ativas ou não, precisamos ter certeza
que quando mudamos de planilha o estado do botão toggle também muda. O mesmo vale para a
pasta de trabalho quando uma nova pasta é adicionada, por exemplo.
Autor: Robert F Martim Criado em: 19/5/2004 11:28:00
Publicado: www.juliobattisti.com.br Última edição: 12/4/2005 20:00:00
Contato: rm@faircourt.com
Série “Como Fazer”: Criando menus, barras de comando e botões personalizados no Excel 35
A ativação da janela é um outro evento, pois podemos estar trabalhando em pastas diferentes as
quais acessamos conforme desenvolvemos o trabalho. Os eventos aqui são mais fáceis do que os
do tópico anterior:
Sub wsMenus()
Como pode ser observado a construção do menu é idêntica as anteriores. Precisamos agora
construir a macro “guias” que é chamada quando clicamos no botão:
Sub guias()
If TypeName(ActiveSheet) = "Worksheet" Then
ActiveWindow.DisplayWorkbookTabs = _
Not ActiveWindow.DisplayWorkbookTabs
Call mostrarGuias
End If
End Sub
Esta sub-rotina checa primeiramente se o tipo é uma planilha. Se sim, checamos o estado das
guias. Vamos supor que mostrar a guia (DisplayWorkbookTabs) seja falso (false). No código
acima estamos invertendo este valor, pois após o clique o DisplayWorkbookTabs deve assumir
o valor verdadeiro. Como não sabemos de antemão qual é o estado das guias, utilizamos o
estado atual das guias para definir o novo estado.
A função Not no VBA, assim como na planilha, é utilizada para inverter o valor Boolean de um
expressão. Em outras palavras, se o valor é verdadeiro (true) a função Not retorna falso
(false) e vice-versa. No próxima sub-rotina, isso deve ficar mais claro.
Sub mostrarGuias()
Dim btn As Object
Dim btnDropDown As Object
On Error Resume Next
Set btn = CommandBars.FindControl _
(Type:=msoControlButton, Tag:="ExemploToggle")
Observe como a construção do Not tem um significado literal: If not true (se não for
verdadeiro) Then (então). Em outras palavras, se ActiveWindow.DisplayWorkbookTabs for
falso (false), então o estado do botão toggle é msoButtonUp. Por outro lado, se
ActiveWindow.DisplayWorkbookTabs for verdadeiro (true) o estado do botão é
msoButtonDown. Esta mesma construção poderia ter sido:
Figure 9-1
Muitas vezes, utilizamos um formulário para solicitar a senha e nome de usuário para acesso em
um documento Excel. Ao invés de utilizar tal ferramenta, poderíamos criar o menu como segue:
Figure 10-1
Nele, o usuário digita a senha e o nome para login. Ao clicar OK a autenticação é feita e o usuário
pode ou não acessar o documento.
O problema deste tipo de senha é que o código precisa ser rodado para a construção do menu.
Sem isso, o usuário continua tendo acesso ao documento. Porém, a idéia acima é apenas para
estudo do leitor. O que estarei fazendo é algo diferente, pois o assunto acima já havia discutido no
fórum.
A idéia é criar um código que nos dê informações em um menu popup quando clicamos em uma
célula qualquer. Veja a figura:
Figure 10-2
Quando o usuário clica com o botão direito do mouse sobre uma célula um popup contendo
informações sobre a célula é ativado.
Autor: Robert F Martim Criado em: 19/5/2004 11:28:00
Publicado: www.juliobattisti.com.br Última edição: 12/4/2005 20:00:00
Contato: rm@faircourt.com
Série “Como Fazer”: Criando menus, barras de comando e botões personalizados no Excel 39
A criação de um menu popup já foi discutida anteriormente, porém, aqui, estarei utilizando uma
forma diferente para acessar o menu de atalho. Se você ainda lembra do tópico, o menu de atalho
é chamado através do método Union.
No exemplo que segue, utilizarei uma função para determinar se o menu deve ao não aparecer.
Esta é uma forma de introduzir ao leitor coisas novas que serão úteis no futuro em outros códigos
que você eventualmente criará.
Para iniciar, iremos criar o código que construirá e removerá o popup quando a pasta for aberta e
fechada. Abra o VBE da pasta de trabalho onde você deve inserir os códigos:
O segundo passo requer a criação do código que mostrará o menu quando clicarmos com o botão
direito sobre uma área em uso da planilha. Abra o VBE da planilha onde o seguinte código deve
ser inserido:
Finalmente, estamos prontos para o código que criará o menu. Como o código contém os mesmos
objetos que apresentados anteriormente ele não está comentado:
Sub mnuPopup()
For i = 1 To 4
Set edit = mnu.Controls.Add(Type:=msoControlEdit)
edit.Width = 200
Next i
With mnu
.Width = 200
.Protection = msoBarNoChangeDock + msoBarNoCustomize _
+ msoBarNoResize
End With
End Sub
O menu contém quatro controles Edit. Para adicioná-los utilizo um loop, pois todos são
exatamente iguais.
Com esta parte fora do caminho, precisamos adicionar a rotina “Info” que é chamada quando o
clique direito ocorre. Esta rotina irá adicionar a informações da célula aos controles Edit contidos
no popup:
Sub info()
With CommandBars("POPUP").Controls
On Error Resume Next
' Se a célula nao contém fórmula...
If ActiveCell.Formula = "" Then
' mostre o texto "Esta célula não contém fórmula"
' no controle Edit
.Item(2).Text = "Esta célula não contém fórmula"
Ao clicar com o botão direito sobre uma área qualquer da planilha se a área estiver sendo utilizada
(UsedRange) o menu será mostrado, caso contrário o popup padrão para células é mostrado.
Neste breve tópico mostro as diversas formas de levar isso a cabo. Um exemplo óbvio é o método
utilizado até o momento, isto é, utilizar o método Delete do controle em questão para remover o
menu.
Por exemplo:
Sub delMenu()
On Error Resume Next
CommandBars("MENU").Delete
End Sub
Porém, você terá situações onde deseja remover um controle que foi inserido no menu Ajuda do
Excel. Neste caso, o ideal é fazer uma referência ao ID do controle que contém o controle que
criamos e, então, remover o controle que desejamos. Observe a figura:
Figure 11-1
Sub menu()
Dim mnu As CommandBarPopup
Dim btn As CommandBarButton
With btn
.Caption = "Minha Ajuda"
.FaceId = 984
End With
End Sub
Sub delMenu()
On Error Resume Next
Dim mnu As CommandBarPopup
Dim btn As CommandBarButton
mnu.Controls("Minha Ajuda").Delete
End Sub
O método acima é um tanto quanto laborioso. A grande vantagem que vejo é o fato de você estar
sempre praticando os métodos e fixando o seu conhecimento de VBA. Contudo, nem sempre
podemos nos dar a este luxo e o que queremos é realmente um código limpo e curto.
Sub resetMenu()
Dim mnu As CommandBarPopup
Set mnu = CommandBars(1).FindControl(ID:=30010)
mnu.Reset
End Sub
Porém, se a forma acima ainda não lhe parece prática por ter que declarar e instanciar o objeto,
você pode resolver o problema com uma linha de código apenas:
Sub resetMenu2()
CommandBars(1).Controls(10).Reset
End Sub
O que você notará é que o método Reset é mais versátil do que o Delete, principalmente porque o
método Reset não resulta em erro se o objeto realmente existe e pode ser “resetado”.
Além disso, você não precisa “resetar” exatamente o objeto onde se encontra o seu controle. Se
você “resetar” o objeto pai, todos os controles sob ele serão reiniciados.
Você deve ter notado que na figura acima existe um menu popup do Adobe PDF logo após o
menu Ajuda. Ao utilizar a sub-rotina resetMenu2 estou apenas “resetando” o controle de índice
10 na barra de comando 1.
Sub resetMenu3()
CommandBars(1).Reset
End Sub
Figure 11-2
Uma outra forma de se remover menus no Excel é manualmente. Se você adicionou apenas um
controle e não deseja criar código para removê-lo a melhor forma é utilizar a ferramenta de
personalização de menu.
Se uma barra de comando é um menu, então, precisamos definir o argumento “MenuBar” como
sendo True para que ele possa substituir o menu principal do Excel.
Eu, particularmente, sou contra a remoção total dos menus do Excel por um simples motivo: e se
o usuário precisa de um item do menu para fazer o trabalho? Com a remoção total, ele ficará
preso ao que você disponibilizou o que pode não ser a forma mais eficiente.
A verdade é que a criação de menus na criação deve ser vista como um apêndice ao que já existe
e adicionar ferramentas que não estão disponíveis. Em outras palavras, a idéia de criar os menus
tem o intuito de aumentar a produtividade do usuário e não reduzi-la.
De qualquer modo, este é um assunto importante também e por este motivo resolvi incluí-lo nesta
revisão do curso.
Primeiramente, precisamos definir o que realmente desejamos fazer. Por exemplo, você deseja
remover todos os menus visíveis ou apenas substituir o menu padrão do Excel pelo seu próprio?
Se a resposta é apenas substituir o menu padrão do Excel, então, podemos fazer o seguinte:
Sub substituirMenu()
Dim cmdbar As CommandBar
Dim popup As CommandBarPopup
cmdbar.Visible = True
End Sub
Ao definir o argumento MenuBar como True, nós estamos efetivamente removendo o menu
padrão do Excel pelo nosso. O último passo é simplesmente passar a propriedade Visible da barra
de comando para True.
Ao rodarmos a sub-rotina:
Figure 12-1
Resolvido o primeiro problema. Contudo as outras barras ainda continuam visíveis, então, como
removê-las? Existem várias formas de se fazer isso, porém, mostrarei a que acredito ser a melhor
forma de se resolver o problema.
Contudo, antes de continuar, você precisa saber como restaurar o seu menu original. Há várias
opções, mas a mais rápida é:
Sub resetMenu()
On Error Resume Next
CommandBars("Minha barra").Delete
End Sub
Tudo que precisamos fazer é excluir a barra que criamos sobre a barra padrão do Excel que a
barra padrão volta ao seu estado original.
Voltando a questão da remoção de todos os menus, podemos utilizar a propriedade Enabled para
resolver a questão de forma prática e rápida sem precisar definir exatamente quais menus somem
e quais ficam.
Sub removerMenus()
End Sub
Figure 12-2
Sub restaurarMenus ()
End Sub
Figure 12-3
A principio, estava um pouco relutante de escrever esta parte, afinal, o código para fazer isso já
havia sido apresentado de forma indireta bastando apenas uma adaptação para o desejado.
Contudo, após vez a real dificuldade de visualização da solução do problema, eu acredito que a
decisão seja a mais acertada para que o leitor tenha em mãos um curso que seja realmente
completo.
Primeiramente, precisamos visualizar o problema. O que realmente desejamos fazer? A idéia é ter
um menu que seja modificado quando certa planilha é ativada. E o que é isso exatamente?
Quando ativamos uma planilha nós disparamos um evento no aplicativo Excel, quando o evento é
disparado podemos capturar o evento é utilizá-lo fazer uma outra coisa, como modificar a
estrutura do menu ativo.
É exatamente esta idéia que precisamos colocar em prática. Uma forma simples de fazer isso é
utilizar os eventos da própria planilha, por exemplo:
Quando a planilha que contém o código acima é ativada, a sub-rotina criarMenu é chamada e o
menu construído. Podemos fazer a mesma coisa na planilha seguinte, e na seguinte, e na
seguinte, etc. Porém, teríamos que fazer isso para cada planilha o que pode se tornar uma bola
de neve. Além do que ela não resolve o problema da seleção de uma planilha em uma outra pasta
ativa.
Vamos supor que o código acima se encontra na Plan1 da Pasta1. O que ocorre se você
seleciona a Plan1 da Pasta2? Sem dúvida que não acontecerá o que você espera, ou melhor,
não acontecerá nada.
Figura 13-1
Neste caso, temos um combobox que lista as planilhas disponíveis. O popup que irá mudar é o
popup contas. Quando a planilha de fornecedores for ativada, o menu será modificado para o
menu fornecedores e assim por diante:
Figura 13-2
A complexidade de seu menu deve ser ditada pela sua real necessidade.
Para o momento, estes são os três pontos que precisamos ter em mente. O primeiro, já havia
discutido, o segundo é um extra e o terceiro é apenas para lembrá-lo que o código pode se tornar
muito mais complexo do que o atual.
Então, vamos iniciar pela parte mais simples. Abra a janela de código da pasta de trabalho. Nela
você deverá inserir as seguintes linhas:
O próximo passo é escrever todas as sub-rotinas para criação, remoção e reconstrução do menu.
No mesmo módulo, você deverá adicionar as seguintes sub-rotinas:
Sub wsMenus()
' Dimensiona os objetos
Dim cmdBar As CommandBar
Dim btn As CommandBarButton
Dim btnDropDown As Object
With btn
.Caption = "Ajuda"
.OnAction = "ajuda"
.Style = msoButtonIconAndCaption
.FaceId = 984
End With
With cmdBar
.Visible = True
.Protection = msoBarNoChangeDock + msoBarNoResize
End With
End Sub
Sub wsMenuDel()
On Error Resume Next
Application.CommandBars(CMDBARNOME).Delete
End Sub
Sub selPlanilha()
Dim btnDropDown As Object
On Error Resume Next
Set btnDropDown = CommandBars.FindControl( _
Type:=msoControlDropdown, Tag:="Lista")
ActiveWorkbook.Sheets(btnDropDown.Text).Activate
End Sub
Sub mnuContas()
Dim cmdBar As CommandBar
Dim menu As CommandBarPopup
Dim btn As CommandBarButton
End Sub
Sub mnuFornecedores()
Dim cmdBar As CommandBar
Dim menu As CommandBarPopup
Dim btn As CommandBarButton
End Sub
Sub mnuClientes()
Dim cmdBar As CommandBar
Dim menu As CommandBarPopup
Dim btn As CommandBarButton
End Sub
Sub mnuRemover()
Dim cmdBar As CommandBar
Sub ajuda()
ActiveWorkbook.FollowHyperlink _
"http://www.juliobattisti.com.br", _
NewWindow:=True, AddHistory:=True
End Sub
As três sub-rotinas para reestruturação do menu podem ser colocadas em uma única rotina,
porém, deixarei esta parte como exercício para o leitor. Tudo que o leitor precisa fazer é observar
os pontos em comuns nas sub-rotinas e utilizá-los na construção de uma única sub.
Com as sub-rotinas resolvidas, adicione uma classe ao seu projeto. Lembre-se que nos referimos
à classe como Classe1 quando declaramos os objetos Application e Combobox. Portanto, este
deve ser o nome da classe. Caso queira, utilize um outro nome qualquer, mas não esqueça de
modificar no módulo.
End Sub
Montado o nosso menu, ao rodá-lo dentro da planilha de criação o menu será reajustado de
acordo com a planilha selecionada:
Figure 13-1
Caso você ative (ou crie) uma nova pasta de trabalho, novamente o menu é reajustado e a
combobox travada:
Figure 13-2
Esta parte é dedicada à automação deste processo. Embora os métodos anteriores sejam
considerados “automações”, aqui automação quer dizer separar o código dos itens que compõem
a barra de comando e menus.
Vamos supor que desejamos inserir um menu antes do menu Arquivo no Excel. Este novo menu
conterá 8 diferentes botões e dois popups. O primeiro popup conterá 5 botões e o segundo popup
conterá 6 botões. Coloque agora no contexto dos códigos anteriores.
É desnecessário dizer que o código para a construção de tal menu será enorme. Sem contar que
se houver necessidade de acrescentar ou retirar menus e botões temos que editar diretamente no
código. Você esqueceu um acento e tem que correr para o código. Um menu foi inserido na ordem
errada e lá vamos nós para o código novamente.
Com certeza deve haver uma forma mais fácil para fazer isso, certo? Correto. Contudo, formas
mais fáceis de fazer algo estão sempre evoluindo. Antes viajar de cavalo era eficiente, depois foi
carro e hoje é avião. Em breve será foguetes e quem sabe um dia viajaremos por tele
transportação como no Jornada nas Estrelas.
Os métodos apresentados funcionam assim. Hoje, eles são eficientes. Amanhã alguém inventa
uma idéia melhor. Portanto, ao desenvolver os métodos apresentados pense em como você pode
melhorará-los.
Deixando o papo furado de lado, vamos ao que interessa: como melhorar o procedimento de
criação de menus.
Primeiramente, precisamos estar claros do que desejamos fazer. Por exemplo, queremos
acrescentar um FaceID? Queremos acrescentar um atalho? Qual a ação a ser executada? O que
está sendo adicionado é uma barra de comando, menu ou botão? Em que ordem eles entram?
Onde eles estarão posicionados? Flutuando ou anexado ao menu principal do Excel?
Estas são perguntas que precisamos fazer antes de construirmos qualquer coisa. Observe que
quando perguntamos algo, efetivamente já temos as respostas do que procuramos. Pense nisso.
Você sabe as respostas, porém, não sabe como implementá-las. Esta é a diferença. Portanto, se
há uma pergunta tem que haver uma resposta, caso contrário a pergunta é inválida.
Como isto em mente estamos prontos para iniciar a construção de nossa folha de solução. Aqui,
passarei o meu raciocínio por trás da solução por mim apresentada.
O Excel é uma grande matriz e utilizaremos isso em nosso favor. Por exemplo, imagine a Plan1
como sendo a nossa barra de comando. Tudo que está dentro da Plan1 é, portanto, um item de
nossa barra de comando, por analogia.
Agora imagine a primeira linha com diversos cabeçalhos e embaixo de cada cabeçalho um série
de itens. Se cada cabeçalho é um menu (popup), então, cada item abaixo é um botão deste
popup.
Outra forma de visualizar isso é dizer que cada planilha é um menu (popup) e os itens contidos
dentro de cada planilha representam os botões destes popups. O nome da barra de comando
seria, digamos, o nome da pasta.
Como podemos ver, com um pouco de imaginação estamos contemplando formas diferentes de
solucionar o mesmo problema. Como cada objeto tem suas propriedades, precisamos definir
quais propriedades nos interessam. Para o primeiro exemplo estaremos utilizando as seguintes
propriedades:
• Name/Caption
• BeginGroup
Como a barra de comando é composta por três objetos, estaremos manipulando estes três casos:
Para evitar erro na digitação (o que nos causaria dores de cabeça no código) os três itens acima
serão selecionados a partir de uma lista de validação.
Uma vez construída a sua tabela em uma planilha do Excel, o formato geral deve ter a seguinte
cara:
Figura 14-1
Como cada propriedade está escrita em inglês no VBA, os cabeçalhos também foram inseridos
em inglês para facilitar a referência, leitura e compreensão.
Sub MenusAutomatizados()
Dim ws As Worksheet
Dim linha As Long
Dim cBar As CommandBar
Dim mnu As CommandBarPopup
Dim btn As CommandBarButton
Set ws = ThisWorkbook.Sheets("ItensMenus")
linha = 3
End Sub
A variável ws é importante pois precisamos definir onde estão os itens que fazem parte de nossa
barra de comando. A variável linha é importante, pois efetuaremos um loop na primeira coluna
para varrer todos os itens entrados. Como o primeiro item está na linha número 3 o valor inicial de
nossa linha é definido como sendo 3.
Sub MenusAutomatizados ()
'Aqui entram as linhas apresentadas acima
With ws
Do Until IsEmpty(.Cells(linha, 1))
TIPO = .Cells(linha, 1)
Select Case TIPO
Case "CMDBAR"
'Código de construção da barra entrará aqui
Case "MMENU"
'Código de construção da menu entrará aqui
Case "BOTAO"
'Código de construção do botão entrará aqui
End Select
linha = linha + 1
Loop
End With
End Sub
O que o código acima está fazendo é definir o TIPO conforme o loop ocorre, seleciona o caso do
tipo (ie “CMDBAR”, “MMENU” ou “BOTAO”). As casos estão entre aspas porque são textos
(string). Uma vez decidido qual é o caso contido na ws.cells(linha,1) o caso é executado.
Como os objetos são inseridos em ordem, precisamos definir isso claramente. Como foi dito
anteriormente, se em um planilha temos um coluna com um cabeçalho que representa o menu,
então, tudo abaixo deste cabeçalho representa os botões deste menu.
A estrutura apresentada acima segue esta mesma lógica. Se esta ordem não for seguida, os
botões serão adicionados aos menus errados.
Case "CMDBAR"
Set cBar = CommandBars.Add _
(Name:=.Cells(linha, 2), Position:=msoBarFloating)
Se este foi o caso encontrado durante o loop ele é executado. O nosso próximo caso é o menu
popup (Case "MMENU"). A construção deste caso é:
Case "MMENU"
Set mnu = cBar.Controls.Add(Type:=msoControlPopup)
mnu.Caption = ws.Cells(linha, 2)
Como o rótulo (Caption) encontra-se na segunda coluna, basta definir a linha atual do loop como
sendo o local onde o texto se encontra. O mesmo vale para o BeginGroup.
Case "BOTAO"
Set btn = mnu.Controls.Add(Type:=msoControlButton)
With btn
.Caption = ws.Cells(linha, 2)
.FaceId = ws.Cells(linha, 3)
.OnAction = ws.Cells(linha, 4)
.ShortcutText = ws.Cells(linha, 5)
.BeginGroup = ws.Cells(linha, 6)
End With
Aqui, as propriedades do botão são inseridas conforme a sua respectiva posição na tabela
apresentada acima.
Sub MenusAutomatizados ()
Dim ws As Worksheet
Dim linha As Long
Dim cBar As CommandBar
Dim mnu As CommandBarPopup
Dim btn As CommandBarButton
Set ws = ThisWorkbook.Sheets("ItensMenus")
linha = 3
Como podemos ver, o volume de código é drasticamente reduzido e uma vez que ele esteja
funcionando, precisamos somente nos concentrar na digitação dos itens que compõem nossa
barra de comando.
Após a execução de nosso código, obtemos o seguinte resultado baseado nas informações
digitadas na planilha contendo os itens do menu:
Figura 14-2
Para provar a versatilidade deste métodos, iremos acrescentar mais um caso: “ATALHOS”. Aqui,
estamos interessados em inserir um botão de atalho no menu de atalho para as células (barra de
comando número 29). À nossa lista anterior vamos acrescentar a palavra “ATALHO” conforme a
figura abaixo:
Figura 14-3
Assim sendo, temos mais um caso (Case) a ser avaliado no código anterior. Conforme o loop
ocorre o novo caso sendo avaliado é:
Case "ATALHO"
Set btn = CommandBars(.Cells(linha, 7)).Controls.Add
With btn
.Caption = ws.Cells(linha, 2)
.FaceId = ws.Cells(linha, 3)
.OnAction = ws.Cells(linha, 4)
.BeginGroup = ws.Cells(linha, 6)
End With
Basta inserir o código acima no código final anterior e temos mais caso que é devidamente tratado
pelo VBA.
Figura 14-4
O método utilizado acima é o mesmo método utilizado pelo Excel para listar todos os menus e
comandos disponíveis. Se você pretende criar menus mais complexos, estude a maneira como o
Excel lista as barras de comandos. Utilize a pasta de trabalho Listar Menus para fazer isso.
Terminamos aqui a nossa jornada no mundo dos menus em Excel. Qualquer dúvida ou sugestão,
não hesite em contatar o autor no e-mail abaixo.
O autor pode ser encontrado diariamente no fórum Júlio Battisti no endereço abaixo respondendo
perguntas sobre diversos aspectos do Excel.
EXPERIÊNCIA PROFISSIONAL
OUTRAS ESPECIALIZAÇÕES
OUTRAS ATIVIDADES
Fornece suporte pro bono em TI à entidade de caridade Nigeriana NIDOE (Nigerians in Diaspora
Organisation Europe) desde 2001. Participou ativamente na organização da conferência sobre
Boa Governança e Responsabilidade Fiscal promovida pelo ONG em Abuja, Nigéria, em
Novembro 2003. Foi um dos principais colaboradores na elaboração do relatório final sobre a
conferência entregue a presidência da República Nigeriana em maio de 2004.
Autor do livro Access e VBA na Modelagem Financeira: Uma abordagem prática (no
prelo). Editora Axcel Books, 2005.
Colaborador ativo do fórum Access Avançado do site www.juliobattisti.com.br, onde divide seu
conhecimento e experiência com outros membros do espaço.