terça-feira, 2 de setembro de 2014

Excel VBA: Customizando o menu de contexto das células

Menu de contexto é o menu acessado quando clicamos no botão secundário do mouse, mais conhecido como "botão da direita", sobre um objeto qualquer nos aplicativos. Por exemplo, quando clicamos com o botão da direita sobre uma célula qualquer, ao lado o Excel nos apresenta um menu com as opções mais comuns aplicáveis às células.

Aprenderemos neste artigo como criar esse tipo de menu, em um exemplo que poderá, para melhor entendimento, ser baixado clicando aqui.

Simulamos neste artigo uma rotina empresarial de aprovação de solicitações de adiantamento para viagens. Todas as macros utilizadas para a confecção disso estão salvas no arquivo e funcionando perfeitamente, e vocês poderão adaptar facilmente às suas necessidades.


Quando clicamos com o botão da direita sobre uma célula qualquer, ao lado o Excel nos apresenta um menu com as opções mais comuns aplicáveis às células, abaixo ilustrado:


Entendendo nosso modelo

Nosso modelo, ilustrado abaixo, possui 10 linhas (da linha 8 até a linha 17) onde teremos solicitações de adiantamentos.


Quando clicarmos com o botão da direita sobre qualquer uma das solicitações, o menu de contexto deverá ser apresentado, porém, com três novas opções:

  • APROVAR SOLICITAÇÃO
  • REPROVAR SOLICITAÇÃO
  • MARCAR COMO PENDÊNCIA.


Quando clicarmos em APROVAR SOLICITAÇÃO, escreveremos na coluna STATUS da solicitação a palavra "Aprovada".


Quando clicarmos em REPROVAR SOLICITAÇÃO, escreveremos na coluna STATUS da solicitação a palavra "Reprovada".

Quando clicarmos em MARCAR COMO PENDÊNCIA, escreveremos na coluna STATUS da solicitação a palavra "Pendente".

As formatações que vemos sendo alteradas neste artigo estão sendo aplicadas pela "Formatação Condicional".

CRIANDO AS ROTINAS VBA

Rotinas que deverão ser colocadas em um MODULO STANDARD, no VBA



Sub AddToCellMenu()
    Dim ContextMenu As CommandBar
    'DELETAR INTENS ANTERIORMENTE ADICIONADOS (SE HOUVER)
        Call DeleteFromCellMenu
    'TRABALHAREMOS NO CONTEXTO DAS CÉLULAS
        Set ContextMenu = Application.CommandBars("Cell")
    'ADICIONAR MENU APROVAR
        With ContextMenu.Controls.Add(Type:=msoControlButton, before:=1)
            .OnAction = "Aprovar" '<- NOME DA MACRO QUE SERÁ EXECUTADA
            .FaceId = 1087 '  <-SÍMBOLO DE VISTO
            .Caption = "Aprovar solicitação"
            .Tag = "Menu_celula_Excelline"
        End With
    'ADICIONAR MENU REPROVAR
        With ContextMenu.Controls.Add(Type:=msoControlButton, before:=2)
            .OnAction = "Reprovar" '<- NOME DA MACRO QUE SERÁ EXECUTADA
            .FaceId = 1088 '  <-SÍMBOLO DE REPROVAÇÃO
            .Caption = "Reprovar solicitação"
            .Tag = "Menu_celula_Excelline"
        End With
    'ADICIONAR MENU PENDÊNCIA
        With ContextMenu.Controls.Add(Type:=msoControlButton, before:=3)
            .OnAction = "Pendencia" '<- NOME DA MACRO QUE SERÁ EXECUTADA
            .FaceId = 1089 '  <-SÍMBOLO DE PENDÊNCIA
            .Caption = "Marcar como Pendência"
            .Tag = "Menu_celula_Excelline"
        End With
End Sub

Sub DeleteFromCellMenu()  'DELETAR TODOS OS MENUS CRIADOS POR NÓS COM A TAG : "Menu_celula_Excelline"
    Dim ContextMenu As CommandBar
    Dim ctrl As CommandBarControl
    Set ContextMenu = Application.CommandBars("Cell")
        For Each ctrl In ContextMenu.Controls
            If ctrl.Tag = "Menu_celula_Excelline" Then
                ctrl.Delete
            End If
        Next ctrl
    On Error GoTo 0
End Sub

'NOTEM ABAIXO QUE ESTAMOS LIMITANDO A FAIXA DE LINHAS DE 8 ATÉ 17,
'E A FAIXA DE COLUNAS DA 2(B) ATÉ 6(F), PARA QUE TRABALHEMOS
'EXCLUSIVAMENTE NA REGIÃO ONDE TEMOS SOLICITAÇÕES

Sub Aprovar()
    For Each celula In Selection
        If celula.Row >= 8 And celula.Row <= 17 And celula.Column >= 2 And celula.Column <= 6 Then
            Cells(celula.Row, 6).Value = "Aprovada"
        End If
    Next
End Sub

Sub Reprovar()
    For Each celula In Selection
        If celula.Row >= 8 And celula.Row <= 17 And celula.Column >= 2 And celula.Column <= 6 Then
            Cells(celula.Row, 6).Value = "Reprovada"
        End If
    Next
End Sub

Sub Pendencia()
    For Each celula In Selection
        If celula.Row >= 8 And celula.Row <= 17 And celula.Column >= 2 And celula.Column <= 6 Then
            Cells(celula.Row, 6).Value = "Pendente"
        End If
    Next
End Sub

Rotinas que deverão ser colocadas no contexto PASTA DE TRABALHO, no VBA




'SEMPRE QUE A PASTA DE TRABALHO FOR ATIVADA, INSERIR OS NOVOS MENUS
Private Sub Workbook_Activate()
    Call AddToCellMenu
End Sub
'SEMPRE QUE SAIRMOS DA PASTA DE TRABALHO, EXCLUIR OS MENUS INSERIDOS NA ROTINA ACIMA
Private Sub Workbook_Deactivate()
    Call DeleteFromCellMenu
End Sub

Utilizando nosso menu de contexto

Agora devemos salvar nosso arquivo no formato XLSM (formato que aceita macros), em seguida fechar o arquivo e voltar a abri-lo.

Pronto! Agora basta clicarmos sobre a nossa solicitação de adiantamento e escolher uma doas nossas novas três opções e ver funcionando.



Dica: Qualquer um dos nossos novos comandos (Aprovar, Reprovar ou Pendência) atuará em uma um maissolicitações simultaneamente, depende da quantidade que selecionarmos. No exemplo abaixo, solicitamos "Marcar como Pendência" com um range selecionado.



Para sabermos quais os tipos de símbolos podem ser utilizados nos nossos menus de contexto, temos uma tabela completa de símbolos CLICANDO AQUI.


Espero que consigam utilizar estas dicas no seu dia-a-dia.



Se você desejar, clique aqui  para baixar o arquivo modelo pronto.


Leiam também outros artigos em NOSSO BLOG.


Estamos aqui, à disposição, aceitando sugestões para novos artigos.

Aproveitem e conheçam o site da nossa empresa: www.excelline.net.

Se você quiser saber mais sobre VBA, recomentamos o seguinte livro:


Contem conosco!



Curta a nossa página
Setembro/2014

GILBERTO GOMES
ExcelLine - Office World
Google+  +gilberto gomes




Related Posts Plugin for WordPress, Blogger...

Compartilhe