Outro tipo de menu interessante é o menu de atalho. Este menu é acessado quando clicamos com o botão direito do mouse sobre a planilha ou qualquer outro local de nossa área de trabalho como mostra figura abaixo:

Figura 7‑1
Nesta parte estaremos vendo exatamente este tipo de menu.
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.
A lógica para criação deste tipo de menu é a mesma que a anterior.
O que precisamos definir claramente é o evento BeforeRightClick na planilha onde ele ocorrerá. Além disso iremos definir a criação do atalho assim que a planilha abrir e a destruição do menu quando a planilha fechar. Esta é uma boa prática que estaremos desenvolvendo agora, pois não é uma boa idéia deixar barras de comando ou menus sem suas referências.
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 menu.
O menu que estaremos criando conterá as seguintes opções:
- Negrito (transforma a seleção em negrito)
- Itálico (transforma a seleção em itálico)
- Sublinhado (transforma a seleção em sublinhado)
- Sobre (mostra informações sobre este aplicativo)
- Ajuda (mostra a ajuda para do Excel XP)
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:
|
'constante do nome do menu
Public Const BARRA As String = "mnuAtalho" |
 
|
Sub mnuAtalho()
Dim cmdBar As CommandBar
Dim mnu As CommandBarButton
delAtalho 'Apaga a barra de comando anterior caso ela exista
Set cmdBar = CommandBars.Add _
(Name:=BARRA, Position:=msoBarPopup, Temporary:=True)
Set mnu = cmdBar.Controls.Add(Type:=msoControlButton)
With mnu
.Caption = "Negrito"
.OnAction = "negrito"
.FaceId = 113
End With
Set mnu = cmdBar.Controls.Add(Type:=msoControlButton)
With mnu
.Caption = "Itálico"
.OnAction = "itálico"
.FaceId = 114
End With
Set mnu = cmdBar.Controls.Add(Type:=msoControlButton)
With mnu
.Caption = "Sublinhado"
.OnAction = "sublinhado"
.FaceId = 115
End With
Set mnu = cmdBar.Controls.Add(Type:=msoControlButton)
With mnu
.Caption = "&Sobre..."
.OnAction = "sobre"
.FaceId = 326
.BeginGroup = True
End With
Set mnu = cmdBar.Controls.Add(Type:=msoControlButton)
With mnu
.Caption = "&Ajuda"
.OnAction = "ajuda"
.FaceId = 984
.BeginGroup = True
End With
End Sub |
Uma vez compilado, o menu terá o seguinte formato:

Figura 0‑21
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.
No mesmo módulo acrescente o código para deleção do menu:

|
Sub delAtalho()
'Apaga a barra de comando anterior caso ela exista
On Error Resume Next
CommandBars(BARRA).Delete
End Sub |
Crie um módulo chamado modOnAction onde entraremos os seguintes códigos:

|
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.msofficegurus.com" & vbCr & vbCr
msg = msg & "Para falar com o autor escreva " _
& "para: rm@msofficegurus.com"
MsgBox msg, vbInformation, "Sobre este módulo..."
End Sub
|

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

|
Private Sub Worksheet_BeforeRightClick(ByVal Target As _
Excel.Range, Cancel As Boolean)
If Union(Target.Range("A1"), Range("A1:O32")).Address = _
Range("A1:O32").Address Then
CommandBars(BARRA).ShowPopup
Cancel = True 'Cancela o Popup padrão do Excel
End If
End Sub |
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.
Ao clicar e executar o menu:

Figura 0‑22
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 é 29. 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 |
No código anterior, chamamos a sub-rotina delAtalho. Diferentemente dos exemplos anteriores não iremos utilizar o método Delete, mas o método Reset:

|
Sub delAtalho()
On Error Resume Next
CommandBars(29).Reset
End Sub |
Após a compilação do menu e o clique “direito” sobre qualquer área da planilha:

Figura 0‑23
Não é necessária a criação de dois módulos para fazer isso.Os módulos criados aqui são para melhor organização do material.
No Excel 2002, o índice é 28. Você pode utilizar o nome da barra de comando. Neste caso, use o nome “Cell” |