... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$145,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


Criar Menus de Atalho com Macros ou com o VBA

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:

Usando Access - Menu de Atalho usando MACRO 2007

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):

Usando Access - Menu de Atalho MACRO 2010

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:

Usando Access - propriedade Menu de Atalho

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 Access - Menu de Atalho com Macro

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:

Public Function fncCriarMenuRelatorio()
Dim cb As CommandBar
Dim A As String
On Error Resume Next
'----------------------------------------------
'Função utilizada no relatório rltMenuAtalhoVBA
'----------------------------------------------
A = "AtalhoRelatorio" 'nome do atalho
'-------------------------------------------------------------
'Verifica a existência do Menu de Atalho. Caso exista, deletar
'-------------------------------------------------------------
If Application.CommandBars(A).enabled Then Application.CommandBars(A).Delete
'---------------------------------
'Cria o Menu de Atalho temporário
'----------------------------------
Set cb = fncAddMenu(A, True)
'---------------------------------
'Adiciona os botões ao Menu criado
'----------------------------------
Call fncAddBotao(cb, 4, "&Imprimir", "=fncImprimir()") 'Botão Imprimir
Call fncAddBotao(cb, 201, "&PDF", "=fncGerarPDF()") 'Botão Gerar PDF
Call fncAddBotao(cb, 0, "&Zoom 50", "=fncZoom(50)") 'Botão Zoom 50
Call fncAddBotao(cb, 247, "&Configurar Página", "=fncConfigurarPagina()")

Set cb = Nothing
End Function

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:

Usando Access - Propriedade Menu de Atalho

Observe na imagem abaixo, o Atalho sendo exibido no relatório:

Usando Access - Menu de Atalho com VBA

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.

Public Function fncCriarMenuRelatorio2()
Dim cb As CommandBar
Dim cbp As CommandBarPopup
Dim A As String
On Error Resume Next
'--------------------------------------------------
'Função utilizada no relatório rltSubMenuAtalhoVBA
'--------------------------------------------------
A = "AtalhoRelatorio2" 'nome do atalho
'-------------------------------------------------------------
'Verifica a existência do Menu de Atalho. Caso exista, deletar
'-------------------------------------------------------------
If Application.CommandBars(A).enabled Then Application.CommandBars(A).Delete
'---------------------------------
'Cria o Menu de Atalho temporário
'---------------------------------
Set cb = fncAddMenu(A, True)
'-------------------
'Adiciona os Botões
'--------------------
Call fncAddBotao(cb, 4, "&Imprimir", "=fncImprimir()") 'Botão Imprimir
Call fncAddBotao(cb, 201, "&PDF", "=fncGerarPDF()") 'Botão Gerar PDF
   '----------------------------
   'Cria o Sub Menu de nome Zoom
   '----------------------------
   Set cbp = fncAddSubMenu(cb, "&Zoom")
   '--------------------------------
   'Adiciona os Botões do Sub Menu
   '--------------------------------
   Call fncAddBotaoS(cbp, 0, "&25", "=fncZoom(25)")
   Call fncAddBotaoS(cbp, 0, "&50", "=fncZoom(50)")
   Call fncAddBotaoS(cbp, 0, "&75", "=fncZoom(75)")
'------------------------------
'Adiciona mais um Botão do Menu
'------------------------------
Call fncAddBotao(cb, 247, "&Configurar Página", "=fncConfigurarPagina()")

Set cb = Nothing
Set cbp = Nothing
End Function

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:

Usando Access - Menu de Atalho com Sub Menu

Detalhes sobre a construção dos botões.

Veja o código abaixo, que cria o botão:

Public Function fncAddBotao(menu As CommandBar, faceid As Long, _ 
caption As String, onaction As String, Optional id As Integer = 1) As CommandBarButton
Dim cbb As CommandBarButton
Set cbb = menu.Controls.Add(msoControlButton, id, , , True)
With cbb
  .caption = caption
  .onaction = onaction
  .Style = msoButtonAutomatic
  .faceid = faceid
End With
End Function

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!


 

 


25 comentários

Alessandro Batistuti   23/10/2013 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 !!!

luizzlcs   23/10/2013 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.

Edu Cav   23/10/2013 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....

hugo   23/10/2013 19:48:26

Muito bom mestre Avelino,
Estava á procura de um tutorial como esse, mais uma vez Obrigado!


Renata Tavares da Costa   24/10/2013 08:03:44

Adorei Avelino, muito obrigada, seus documentários tem me ajudado muito.

Avelino Sampaio   24/10/2013 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!

Moacyr Bezerra Santos   24/10/2013 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.

Marcelo David   24/10/2013 23:13:27

Perfeito Avelino, esse recurso é muito rico e pouco usado! Muito obrigado por compartilhar!!

Marcio Melo - RJ   29/10/2013 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...


Marcio Melo - RJ   29/10/2013 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!

Avelino Sampaio   29/10/2013 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/2013 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...

Marcio Melo - RJ   29/10/2013 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...

Will   28/02/2014 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

Will   28/02/2014 22:16:13

Quando não se lê fica no achismo!

Eu utilizava a forma utilizada pela macro, tudo certo...

William

Juliana Vegas   03/03/2014 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

Avelino Sampaio   04/03/2014 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   09/03/2014 23:29:25

Obrigada Avelino!

Rosembergue   20/04/2014 10:49:21

Deus abençoe

Marcos   29/05/2014 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?

MARCOS BELGAMAZZI   09/03/2015 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

Bruno Gordino   28/04/2015 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

DAVID BOMFIM   07/10/2016 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?

Avelino Sampaio   08/10/2016 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

PcNet   06/03/2017 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


Envie seu comentário: