Criar Menus de Atalho com Macros ou com o VBA
Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 5x no Cartão de Crédito, através do Paypal.
Veja como comprar e saiba mais sobre o material oferecido, clicando aqui.
Até a versão 2003 do Access existia um assistente que facilitava bastante a montagem de Menus de Atalho. A partir da versão 2007, este assistente foi retirado e substituído por um conjunto de MACROS. Além das Macros, os atalhos também podem ser criados através da programação VBA, que faz uso da coleção CommandBar.
Uso de Macros
No link abaixo tem um ótimo passo a passo da Microsoft de como montar Menus através de Macros.
Veja a montagem de um Menu de Atalho que faz uso de macros. Ele está configurado para ser utilizado no relatório rltMenuAtalhoMacro do aplicativo exemplo fornecido neste tutorial:
A imagem acima mostra a Macro montada na versão 2007 do Access. Agora, observe a mesma Macro montada na versão 2010 ( estrutura idêntica para a versão 2013 do Access):
Para associar a Macro de atalho ao relatório, basta informar o nome da Macro na propriedade Barras de menus de atalho, conforme você pode observar na imagem abaixo:
Ao abrir o relatório e ao clicar com o botão da direita do mouse sobre o mesmo, o atalho é aberto para uso.
Usando a programação VBA para a montagem dos Atalhos.
Devido a certo grau de complexidade para entender o objeto Commandbar, resolvi criar quatro funções básicas que permitem montar, com a maior facilidade, quaisquer atalhos. São elas:
fncAddMenu() | Cria o Menu de Atalho Temporário |
fncAddBotao() | Cria o botão para o Menu de Atalho |
fncAddSubMenu() | Cria um sub Menu |
fncAddBotaoS() | Cria o botão no Sub Menu |
Para criar um Menu de Atalho, basta utilizar a função fncAddMenu():
Dim cb As CommandBar Set cb = fncAddMenu("NomeDoMenuDeAtalho", True)
Criando um botão para este Menu, utilizando a função fncAddBotao():
Call fncAddBotao(cb, 4, "&Imprimir", "=fncImprimir()")
Observe a função completa para a montagem do Menu de Atalho que é utilizado no relatório rltMenuAtalhoVBA do exemplo:
Faça o login aqui para ter acesso ao código.
No evento "Ao abrir" do relatório, a função é chamada para a montagem do Atalho:
Private Sub Report_Open(Cancel As Integer) Call fncCriarMenuRelatorio End Sub
Na Propriedade "Barra de menus de atalho", indicamos o nome do Atalho que criamos pelo VBA:
Observe na imagem abaixo, o Atalho sendo exibido no relatório:
Agora, quero que você observe na função abaixo, a parte em vermelho, aonde foi substituído o botão Zoom por um Sub Menu com os seus botões correspondentes.
Faça o login aqui para ter acesso ao código.
Abrindo o relatório rltSubMenuAtalhoVBA e clicando com o botão da direta do mouse sobre o mesmo, temos o Menu de Atalho com o Sub Menu Zoom:
Detalhes sobre a construção dos botões.
Veja o código abaixo, que cria o botão:
Faça o login aqui para ter acesso ao código.
Observe o uso do argumento id. Todos os botões internos do Access possuem um número exclusivo de identificação, chamado de id. Por exemplo, se quisermos usar o botão Imprimir do Access, basta indicarmos o valor 4 no argumento id na função acima. O id igual a 1 significa que podemos personalizar o botão, inserindo uma função ou macro pelo atributo onAction.
Utilizando uma função no atributo onAction:
Call fncAddBotao(cb, 4, "&Imprimir", "=fncImprimir()")
Utilizando uma macro no atributo OnAction:
Call fncAddBotao(cb, 4, "&Imprimir", "=mcrMenuAtalhoRelatorio.&Imprimir")
Utilizando o botão Imprimir do Access:
Call fncAddBotao(cb, 4, "&Imprimir", "", 4)
A lista do número exclusivo (id) de cada botão do Access, você pode consultar no link abaixo. Observe que este número é o mesmo número associado à imagem (FaceId):
Download
Segue o arquivo para você treinar a montagem dos atalhos:
Desafio
O formulário frmListaClientes possui um controle listbox. Crie um Menu de Atalho para o controle listbox, contendo dois botões. Um botão EDITAR, em que ao clicar deverá abrir o formulário frmCadastroClientes com os dados da linha selecionada e um botão EXCLUIR que deverá excluir o registro da linha selecionada.
Bom estudo!
Os dez artigos mais visitados
MontaRibbons v.7.0 - Assistente completo para criar ribbons no Access
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Aprenda sobre filtragens
Vídeo - Segurança máxima, usando o OPEN
Uma ajuda para quem está começando um negócio ou um projeto
Integrando o Access com Servidor MySQL - Introdução
Desabilitando a faixa(ribbon) superior do Access
Vídeo - Programação de relatórios - Parte 1
Como carregar o seu menu sem que ele vá para lista de suplementos
Adquira o kit UsandoAccess e aprenda em alta velocidade
26 comentários Marcelo David 27/12/2022 21:09:46 Olá Avelino, tudo bem? Tem como por um separador entre os itens do menu de atalho? Desde já grato e boas festas! Avelino Sampaio 08/10/2022 07:51:35 David, Neste seu código está usando o comando Sendkeys ? Se registre no meu fórum, abra um tópico sobre o assunto e ofereça mais detalhes. No aguardo DAVID BOMFIM 07/10/2022 22:48:58 Olá Avelino tenho curtido o seu site aqui e tenho aprendido muito, mas gostaria que voce se possível me ajudasse a corrigir um problema fiz um programinha de busca de cliente e ele tem funcionado bem porem quando teclo uma uma letra o num lock fica apagando e acendendo como faço para ele ficar neutro? Bruno Gordino 28/04/2022 18:57:46 Olá Sr. Avelino, desculpe incomodar mais uma vez Lembra-se de há algum tempo ter falado consigo por causa dos Menu de Atalho Pode dar-me uma dica por onde começar ou pesquisar? Pretendia incluir no menu de atalho a opção de "Múltiplas Páginas" e no Sub Menu as possíveis opções conforme imagem em anexo. O meu muito obrigado mais uma vez. Cumprimentos MARCOS BELGAMAZZI 09/03/2022 22:54:23 Avelino, algum tempo procuro na internet um artigo que explique como criar menu desse tipo desenvolvido pelo senhor, mas que execute rotinas para formatar texto. O Senhor tem algum exemplo que possa disponibilizar para eu treinar. belgamazzi@gmail.com marcos.belgamazzi@ceron.com.br marcos.belgamazzi@eletrobrasrondonia.com PcNet 06/03/2022 08:59:39 Boa tarde caro Avelino, É só para informá-lo que tentei acessar a página da Lista do FaceId, mas a mesma já não se encontra disponível. Cumprimentos Marcio Melo - RJ 29/10/2021 22:37:20 Convertida a macro para o VBA, segui a sua metodologia, criando a função para cada botão: Public Function fncEditar() On Error Resume Next ' Botão para Editar item de lista. DoCmd.OpenForm "frmCadastroClientes", acNormal, "", "[IdCliente]=[Forms]![frmListaClientes]![Lista]", , acNormal End Function Public Function fncExcluir() On Error Resume Next DoCmd.SetWarnings (False) If MsgBox("Deseja excluir o registro com nome de: " & [Forms]![frmListaClientes]![Lista1], vbYesNo, "Excluindo!") = vbYes Then ' Botão para Excluir item de lista. DoCmd.RunSQL "DELETE tblTeste.[IdCliente] FROM tblTeste WHERE (((tblTeste.[IdCliente])=[Formulários]![frmListaClientes]![Lista])); ", -1 ' Atualiza a caixa de listagem. DoCmd.Requery "Lista" Else MsgBox "Exclusão cancelada!", vbInformation, "Cancelado" End If DoCmd.SetWarnings (True) End Function Depois montei a Função de criar o Atalho, segui a sua mesma tática: Public Function fncCriarMenuFormulario() Dim cb As CommandBar Dim cbp As CommandBarPopup Dim A As String On Error Resume Next '-------------------------------------------------- 'Função utilizada no formulário de lista de clientes '-------------------------------------------------- A = "AtalhoFormulario" 'nome do atalho '------------------------------------------------------------- 'verifica a existente do menu de atalho. Caso exista deletar '------------------------------------------------------------- If Application.CommandBars(A).enabled Then Application.CommandBars(A).Delete '------------------------------- 'Criar menu de Atalho temporário '------------------------------- Set cb = fncAddMenu(A, True) '-------------- 'Criar botões '-------------- Call fncAddBotao(cb, 31, "&Editar", "=fncEditar()") 'botão Editarr Call fncAddBotao(cb, 536, "&Excluir", "=fncExcluir()") 'botão Excluir Set cb = Nothing Set cbp = Nothing End Function Minha Conclusão: montar com macro e depois converter para o VBA que fica bem melhor. As imagens dos ícones foram tirados do link "Lista do FaceId", foi possível tratar a exclusão com msgbox VbYes, esses botões de Editar e Excluir ficaram dedicados ao Formulário frmListaClientes não podendo ser utilizado em outros como acontece nos Atalhos dos relatórios, mas a implementação ficou bem fácil de usar. Avelino, desculpa ai por várias postagens e texto tão grande, a idéia é mais de enriquecer o seu artigo. Sou mais Brasil! obrigado por mais esse artigo, que estava muito precisando... Marcio Melo - RJ 29/10/2021 19:30:49 Sim, até ai eu consegui, também cheguei a criar em módulo uma função: Function TirarMSG() DoCmd.SetWarnings (False) End Function Na macro coloquei: Executar código: TirarMSG () Na verdade eu achava importante na hora de excluir ter opção de de SIM ou NÃO antes de excutar a consulta, acho que será melhor converter tudo para o VBA Vou dar uma saída depois continuo... Obrigado... Avelino Sampaio 29/10/2021 18:31:22 Marcio Melo, muito bom! Para inibir a mensagem de execução da consulta de ação DELETE utilize a ação "DefinirAvisos" configurado para Não. Ao final, volte a utilizar a ação "DefinirAvisos" configurado para SIM DefinirAvisos >> Não Executa a consulta Caixa de mensagem DefinirAviso >> Sim Sucesso! Marcio Melo - RJ 29/10/2021 18:02:52 Então Avelino, aceitei o desafio e Criei uma macro mcrMenuAtalhoFrm e no Botão de &Editar usei a ação de: Abrir Formulário: frmCadastroClientes e Condição onde: [IdCliente]=[Formulários]![frmListaClientes]![Lista] ficou perfeito, para o botão de &Excluir com a ação de: ExecutarSQL e Instrução SQL: DELETE tblTeste.[IdCliente] FROM tblTeste WHERE (((tblTeste.[IdCliente])=[Formulários]![frmListaClientes]![Lista])); Montei essa instrução com o próprio construtor de consultas, quando testei funcionou mais como ainda continuava mostrando o registro, adicionei uma próxima macro - RepetirConsulta e Nome do Controle: Lista, ai sim depois disso quando excluo um item da lista ele some, ficou bom, mais sei que pode ser bem melhorado, tirando a mensagem de excussão da consulta e no lugar uma mensagem Exibindo o Nome que vai ser Deletado, seria fácil fazer essas alterações... Sou mais Brasil! Marcio Melo - RJ 29/10/2021 16:41:46 Super Profissional, mais um artigo de extrema importância na elaboração de um programa, muito rico em didática, gostei muito... seu site é o meu referencial, estou sempre consultando, obrigado por mais esse... Sou mais Brasil! Forte abraço... Marcelo David 24/10/2021 23:13:27 Perfeito Avelino, esse recurso é muito rico e pouco usado! Muito obrigado por compartilhar!! Moacyr Bezerra Santos 24/10/2021 14:39:43 Avelino, muito obrigado... Já estou utilizando em minhas aplicações, inclusive, tenho um cliente que vive perdendo a configuração de suas "receitas" (ele é oftalmologista e as receitas são tamanho A5, só que a impressora Epson dele não tem esta medida e também não aceita colocar o papel do lado esquerdo, cai numa espécie de buraco). Você sempre se sobressai em suas novas contribuições. Avelino Sampaio 24/10/2021 08:22:19 Obrigado a todos pela participação. Edu, reconheço que para montar os atalhos pelo VBA é preciso estar um pouquinho familiarizado com a programação. No link da Microsoft que disponibilizei tem um passo a passo, como você necessita. Você chegou a acessar o link ? Sucesso! Renata Tavares da Costa 24/10/2021 08:03:44 Adorei Avelino, muito obrigada, seus documentários tem me ajudado muito. hugo 23/10/2021 19:48:26 Muito bom mestre Avelino, Estava á procura de um tutorial como esse, mais uma vez Obrigado! Edu Cav 23/10/2021 19:17:45 Achei legal, mas não entendi quase nada..... Poderia ser por passos... Passo 1 - faça isto... Passo 2 - faça aquilo.... luizzlcs 23/10/2021 12:47:01 Muito bom Avelino. Fazia tempo que eu procurava por um tutorial referente a este assunto. Gosto da forma como explica, simple e objetiva. Parabéns e muito obrigado pela sua contribuição, seu conhecimento enriquece a todos que gosta de trabalhar com access. Alessandro Batistuti 23/10/2021 11:22:34 Olá Avelino, parabéns e obrigado pela dica, acredito que irá ajudar muitos desenvolvedores, inclusive a mim. Já me deparei anteriormente com situação em que precisei de algo parecido. Irei adaptar em meus projetos imediatamente. Sucesso !!! Marcos 29/05/2021 19:35:46 Boa noite Parabéns pela iniciativa de compartilhar seus conhecimentos. Minha pergunta é a seguinte: Tento implementar o código no vba mas o comando commandBar não é reconhecido pelo compilador, só aceita o commandButton, será que tenho que referenciar alguma biblioteca específica? Rosembergue 20/04/2021 10:49:21 Deus abençoe Juliana Vegas 09/03/2021 23:29:25 Obrigada Avelino! Avelino Sampaio 04/03/2021 06:55:06 Juliana, ótima pergunta. Sim, pode. Altere o valor 0 por um valor da faceid. Exemplo: De: Call fncAddBotaoS(cbp, 0, "&25", "=fncZoom(25)") Para: Call fncAddBotaoS(cbp, 201, "&25", "=fncZoom(25)") Sucesso! Juliana Vegas 03/03/2021 09:46:56 Avelino, adorei esse tutorial, muito bom mesmo, já estou implementando nos meus projetos! Só uma pergunta, é possível colocar o faceid (imagem) no atalho que tem submenu? Muito obrigada e mais uma vez parabéns! Juliana Will 28/02/2021 22:16:13 Quando não se lê fica no achismo! Eu utilizava a forma utilizada pela macro, tudo certo... William Will 28/02/2021 20:15:01 Demais essa dica! Só que no Access 2010 não funciona o FaceId. Não funcionou no exemplo que baixei nem no meu projeto. Abaço! William |