Quando criamos código em VBA necessitamos de o executar e isso pode ser feito de diversas formas:
- Através de Eventos
- Através de funções personalizadas (UDF)
- Através de um objecto que irá chamar o nosso código (quer esteja na worksheet ou na ribbon)
- Através de teclas de atalho (shortcuts)
A possibilidade de utilizar determinadas teclas para chamar o código que criamos é muito prático e muito útil. Neste pequeno artigo iremos ver algumas formas e exemplos de como associar teclas de atalho a procedimentos e ver as principais diferenças entre os dois métodos disponíveis.
A maneira mais simples e mais usada pela maioria dos utilizadores, é seleccionando o separador Developer e escolhendo a opção Macros (ou pressionando as teclas Alt+F8)
Na janela com as macros disponíveis, seleccionamos a macro pretendida e escolhemos a opção Options.
Irá abrir então uma nova janela onde podemos indicar que tecla de atalho iremos associar à macro seleccionada.
Neste exemplo, visível na imagem anterior, para chamar a Macro1, a combinação definida é Ctrl+a. Podemos indicar diversas letras (apenas letras) e se indicarmos uma letra em minúscula a combinação associada será Ctrl+a (por exemplo) e se indicarmos a letra em maiúscula a combinação associada será Ctrl+Shift+a.
Alguns exemplos:
a = Ctrl + a
u = Ctrl + u
A = Ctrl + Shift + a
U = Ctrl + Shift + u
Muito simples e muito prático!
No entanto isto limita-nos à utilização de determinadas combinações de teclas o que poderá ser, em alguns casos, um problema. Além disso não permite a atribuição dinâmica e a utilização de teclas especiais. Mas isto pode ser resolvido utilizando VBA.
Para atribuir uma tecla de atalho a uma macro, utilizamos o método Application.OnKey()
Application.OnKey “combinação”, “procedimento a associar”
Exemplo:
Application.OnKey "^a", "Macro1"
Neste caso é associada a combinação Ctrl+a à Macro1.
Mas vejamos a tabela de códigos de teclas especiais, que além das letras e números podem ser utilizados:
Tecla | Código |
BACKSPACE | {BACKSPACE} ou {BS} |
BREAK | {BREAK} |
CAPS LOCK | {CAPSLOCK} |
CLEAR | {CLEAR} |
DELETE ou DEL | {DELETE} ou {DEL} |
DOWN ARROW | {DOWN} |
END | {END} |
ENTER (teclado numérico) | {ENTER} |
ENTER | ~ (tilde) |
ESC | {ESCAPE} ou {ESC} |
HELP | {HELP} |
HOME | {HOME} |
INS | {INSERT} |
LEFT ARROW | {LEFT} |
NUM LOCK | {NUMLOCK} |
PAGE DOWN | {PGDN} |
PAGE UP | {PGUP} |
RETURN | {RETURN} |
RIGHT ARROW | {RIGHT} |
SCROLL LOCK | {SCROLLLOCK} |
TAB | {TAB} |
UP ARROW | {UP} |
F1 a F15 | {F1} até {F15} |
E as teclas que são usadas para combinar:
Tecla | Código |
SHIFT | + (adicção) |
CTRL | ^ (acento circunflexo) |
ALT | % (percentagem) |
Assim, com a lista de códigos, podemos combinar e associar conjuntos de teclas a macros que tenhamos criado/gravado. Podemos utilizar o evento Workbook_Open(), que é executado quando o ficheiro de Excel é aberto, e definir no arranque as associações que queremos. Por exemplo:
Private Sub Workbook_Open()
Application.OnKey "+^{UP}", "MostraResultado"
Application.OnKey "%{INSERT}", "CopiaDados"
End Sub
Neste caso, a combinação Shift+Ctrl+Seta Cima chama o procedimento MostraResultado e a combinação Alt+Insert chama o procedimento CopiaDados.
No entanto estas atribuições funcionam se os procedimentos estiverem definidos num módulo, pois se estiverem definidos no Workbook ou em determinado Worksheet não irá funcionar. Nestes casos é necessário definir o caminho para eles, como é possível ver no exemplo seguinte:
Private Sub Workbook_Open()
Application.OnKey "+^{UP}", "ThisWorkbook.MostraResultado"
Application.OnKey "%{INSERT}", "Sheet1.CopiaDados"
End Sub
Aqui estamos a indicar que o procedimento MostraResultado está criado em ThisWorkbook e o procedimento CopiaDados está criado no código da Sheet1.
Mas atenção que determinadas combinações, especialmente usando a tecla Alt mais uma letra ou número, não funcionam, pois são usadas como teclas de atalho do próprio Excel. É importante testar sempre!
Muito importante também verificar se não estamos a utilizar uma combinação do próprio sistema operativo. Por exemplo, a combinação Ctrl+C (“^c”) serve para copiar informação(copy), assim como o Ctrl+V (“^v”) serve para colar informação (paste). Se atribuirmos estas combinações a diferentes procedimentos, é sobreposto o funcionamento normal (neste caso o copy/paste) e passará a chamar os procedimentos que definimos. Isto pode ser desagradável para muitos utilizadores.
Um exemplo muito simples para que testem rapidamente e entendam o problema de algumas associações. Coloquem o seguinte código num módulo e executem o procedimento AssociaTeclas.
Sub AssociaTeclas()
Application.OnKey "~", "Opps"
End Sub
Sub Opps()
MsgBox "Opps !!!"
End Sub
Mas podemos também desabilitar as associações que definidas. Para tal, basta não definir o segundo argumento do método OnKey() que é opcional.
Sub DesabilitaTeclas()
Application.OnKey "~"
Application.OnKey "^v"
Application.OnKey "^v"
Application.OnKey "%{INSERT}"
Application.OnKey "+^{UP}"
End Sub
Após executar o procedimento DesabilitaTeclas as associações definidas deixariam de funcionar e, neste caso, o Enter voltaria a funcionar como antes, assim como o Ctrl+c e o Ctrl+v.
Neste pequeno artigo vimos como é simples atribuir teclas de atalho para chamar procedimentos, utilizando as opções já disponíveis e através de código, e alguns dos problemas que as associações podem causar.
É sem dúvida uma forma muito prática de chamar código VBA.
9 comentários:
Prezado Jorge, parabéns pelo trabalho. Se puderes, me ajude a "bloquear" a tecla DEL. Estou introduzindo o código abaixo em uma macro do excel, mas não funciona:
Application.OnKey "{DEL}", "Msg . . ."
com Shift antes funciona:
Application.OnKey "+{DEL}", "Msg . . .", mas como não é comum se apertar primeiro Shift antes do DEL, gostaria de executar direto ao acionar a tecla DEL.
Muito Grato. Ricardo Souza
Olá Ricardo,
Existem teclas e combinações de teclas que não podem ser utilizadas pois são usadas pelo sistema.
Mas qual é o objectivo de desabilitar a tecla DEL? Pode haver outra solução.
Cumprimentos,
Jorge Paulino
'Códigos que fazem as setas movimentarem a tela ao invés da celula selecionada. Não sei se essa função já existe no excel. Eu nunca procurei saber. Apenas uma idéia que me surgiu após ler as dicas da página.
'Colocar essa Macro em "EstaPasta_de_trabalho"
Private Sub Workbook_Open()
Application.OnKey "+^{UP}", "UP"
Application.OnKey "+^{DOWN}", "DOWN"
Application.OnKey "+^{RIGHT}", "RIGHT"
Application.OnKey "+^{LEFT}", "LEFT"
End Sub
'Colocar todas essas em qualquer módulo
Sub DOWN()
ActiveWindow.SmallScroll DOWN:=1
End Sub
Sub UP()
ActiveWindow.SmallScroll UP:=1
End Sub
Sub RIGHT()
ActiveWindow.SmallScroll ToRight:=1
End Sub
Sub LEFT()
ActiveWindow.SmallScroll ToLeft:=1
End Sub
quero algo mais simples, mas n estou conseguindo:
Quero fazer uma célula+uma passagem de linha+outra célula via fórmula excel, sem ambiente de macro:
a1&...&b1, alguém sabe como posso fazer?
Olá!
Qual a linha de código para quando clicar em <'Fechar visualização de impressão'> da planilha, a aplicação fique invisível e mostre apenas o formulário?
O que preciso é bem simples, mas, como sou um apagado em VBA, recorro ao fórum.
SITUAÇÃO: Excel 2007
ARQUIVO: Estudo _1_com_macros.xlsm
PLANILHA: GERADOR DE APOSTAS
OBJETIVO: construir macro que entra em ação automaticamente quando a célula I5 exibe o algarismo 2 em função da fórmula contida nela.
EXPLICANDO MELHOR: a célula I5 contém uma fórmula que, dependendo de operações que acontecem em determinado momento, pode exibir 0 (zero), 1 ou 2. Quando exibir o 2, a macro "Transfeiri_TOTAL" deve entrar em ação automaticamente.
Grato a que puder ajudar-me.
Here is a good site that talks more about Excel Programming - Excel Vba Examples - Excel Advanced Templates
Ola
Alguém pode ajudar-me. Quero digitar um determinado numero numa célula, ele vai buscar numa relação o numero e vai marcar o valor correspondente com Ctrl + C.
Olá, teria a possibilidade de desativar
o comando de busca CTRL + L apenas de uma planilha do excel
deixando as outras com possibilidades de executar está função.
artigos muito bom, obrigado pela atenção
At. Luciano
Enviar um comentário