AS EMPRESAS ESTÃO "DESESPERADAS" POR ESTE TIPO DE PROFISSIONAL... - VOCÊ É UM DELES?

MEGA FORMAÇÃO EM INFRAESTRUTURA DE TI - O Conhecimento que Vira Dinheiro - CLIQUE AQUI

Você está em: PrincipalArtigosSérie "Como Fazer": Menus no Excel › Lições : 09
Quer receber novidades e e-books gratuitos?
« Anterior Δ Página principal ¤ Índice Próxima »
Criando menus, barras de comando e botões personalizados no Excel usando VBA
Autor: Robert Friedrick Martim
Lição 008 - Menus "dropdown"

Os menus tipo dropdown (também chamados de combobox) são os menus que contém uma lista que quando clicada disponibiliza os itens da lista para o usuário. A figura abaixo mostra o exemplo clássico do Excel:

Figure 8‑1

Através desta lista podemos selecionar a visualização de nossa área de trabalho, isto é, podemos ampliar ou reduzir o tamanho da área de trabalho conforme necessário.

O exemplo que estaremos olhando é retirado de uma de minhas respostas no fórum sobre este assunto. Contudo, a resposta no fórum utiliza apenas uma das possibilidades. Aqui estaremos vendo como construir este tipo de combobox de uma forma diferente.

A nossa combobox conterá uma lista de todas as planilhas disponíveis na pasta de trabalho e quando um item da lista é selecionado a planilha em questão é selecionada. Este método pode ser interessante se possuímos um número elevado de planilhas ou se desejamos esconder as guias das planilhas, por exemplo.

O menu que construiremos é mostrado na figura abaixo:

Figure 8‑2

Primeiramente, vamos definir o nome da barra de comando como sendo uma Public Const (constante pública). No topo do módulo devemos entrar a seguinte linha:

Public Const CMDBARNOME As String = "Menu combobox"

O nome da constante pode ser qualquer coisa que o leitor desejar. Agora, a constante CMDBARNOME pode ser acessada de qualquer sub-rotina que escrevemos sem a necessidade de redimensioná-la. O próximo passo é a construção do menu:

Sub wsMenus()

   Dim cmdBar          As CommandBar

   Dim btnDropDown     As Object

 

   Dim ws              As Worksheet

   Dim wb              As Workbook

   Dim wsNome          As String

 

   Set wb = ActiveWorkbook

   

   On Error Resume Next

   CommandBars(CMDBARNOME).Delete

 

  Set cmdBar = CommandBars.Add(Name:=CMDBARNOME, _

   Position:=msoBarFloating)

 

   Set btnDropDown = cmdBar.Controls.Add(msoControlComboBox)

     btnDropDown.Width = 200

   For Each ws In wb.Sheets

     wsNome = ws.Name

     btnDropDown.AddItem wsNome

   Next

  

   btnDropDown.ListIndex = 1

   btnDropDown.OnAction = "wsAcessar"

   cmdBar.Visible = True

  End Sub


Como o controle btnDropDown não esta disponível nos objeto Commandbar, o definimos como sendo um Object apenas. O método para se adicionar um item ao btnDropDown é o mesmo que utilizamos para adicionar um item a uma listbox ou combobox em um formulário. Desta forma, se houver alguma dúvida sobre os métodos e propriedades disponíveis em um msoControlComboBox podemos procurar nas propriedades e métodos de um combobox para formulário, pois ambos são quase idênticos.

O ListIndex da combobox é colocado para 1, pois queremos que o primeiro item da lista seja selecionado. Se pularmos esta linha, o primeiro item da lista aparece em branco como mostram as figuras abaixo:

Figura 0‑24

Figura 0‑25

Este é apenas um detalhe e fica a critério do leitor definir em qual modo se pretende apresentar a barra de comando.

Com a barra de comando e o btnDropDown prontos, precisamos definir a macro que executa o OnAction. Em nosso código chamamos esta macro de “wsAcessar”. Quando um dos itens da lista é selecionado esta sub-rotina é executada.

Sub wsAcessar()

   Dim wsÍndice As Integer

 

    wsÍndice= CommandBars(CMDBARNOME).Controls(1).ListIndex

    ThisWorkbook.Sheets(wsÍndice).Activate

End Sub

A dimensão wsÍndice refere-se ao índice do item na btnDropDown. Contudo, como este é o índice referente à planilha, também, podemos utilizar valor para ativar a planilha selecionada na lista. Outro ponto a ser observado é que podemos dispensar o wsÍndice e  escrever somente uma linha de código nesta sub-rotina:

ThisWorkbook.Sheets(CommandBars(CMDBARNOME). _

Controls(1).ListIndex).Activate

Portanto, podemos cortar o dimensionamento de wsÍndice e a linha que o define como sendo igual ao índice do item selecionado no controle btnDropDown.

Infelizmente, o método anterior deixa várias perguntas no ar: e se uma planilha for removida ou adicionada? E se uma planilha mudar de posição? Se fizermos isso, veremos que o método anterior falha em nos fornecer as respostas às questões colocadas. A solução é rever o método utilizado e procurar uma solução melhor.

Contudo, soluções não são vendidas em latinhas no mercado da esquina e precisamos pensar em uma maneira mais eficiente e pesquisar uma solução. Em programação uma solução não existe até que ela seja inventada. O próximo exemplo utiliza uma Class para inventar uma resposta para nossa questão.

Primeiro, vamos definir o problema. Como a Class manipula os eventos e as propriedades, estamos interessados em uma classe que:

  • Reconheça quando uma planilha e adicionada ou removida da pasta atual
  • Reconheça quando mudamos uma planilha de posição
  • Reconheça a pasta de trabalho atual e atualize a btnDropDown

A primeira parte requer a definição do evento que desejamos capturar:

Public WithEvents appXL As Application

Os eventos são referentes ao aplicativo Excel. Veja que a definição é pública como fizemos com a constante do nome de nossa barra de comando. Assim como definimos a constante como sendo um String aqui definimos os eventos sendo capturados como sendo Application.

A seguir, escrevemos o código que manipulará o evento dentro da classe. Primeiramente, capturaremos os eventos que ocorrem na pasta ativa e dizem respeito às planilhas desta pasta:

Private Sub appXL_SheetActivate(ByVal Sh As Object)

   Dim btnDropDown     As Object

   Dim ws              As Worksheet

   Dim i               As Long

 

Set btnDropDown = CommandBars(CMDBARNOME).FindControl _

(Type:=msoControlDropdown, Tag:="Lista")

   btnDropDown.Clear

   For Each ws In Sh.Parent.Sheets

    btnDropDown.AddItem ws.Name

   Next

 

   For i = 1 To btnDropDown.ListCount

   If btnDropDown.List(i) = Sh.Name Then _

       btnDropDown.ListIndex = i: Exit For

   Next

End Sub


A declaração das variáveis segue os exemplos anteriores. Em seguida, definimos o btnDropDown através do método FindControl o qual é aplicado em nossa barra de comando. A busca é feita através do Tag que utilizaremos na sub-rotina que desenvolveremos. O FindControl também pode ser utilizado com o número do índice do controle, porém, quando o desenvolvimento não é de larga escala é mais fácil visualizar o que estamos fazendo através de Tags.

Após a definição do objeto btnDropDown, limpamos quaisquer valores que estão presentes no btnDropDown. Embora neste exemplo isto não seja crítico é boa prática sempre limpar qualquer lista antes de adicionar uma lista nova.

Com o objeto ws fazemos, agora, um loop em todas as planilhas presentes na pasta ativa. Utilizamos o método AddItem como fizemos em nosso primeiro exemplo.

Finalmente, checamos o índice do btnDropDown e casamos este valor com o índice e nome da planilha a qual ele se refere.

Como isso terminamos a captura dos eventos ocorridos nas planilhas. Agora, precisamos capturar os eventos da pasta de trabalho. Aqui, teremos menos trabalhos pois queremos apenas saber a pasta atual para que o evento da planilha seja reprocessado. Assim sendo, tudo que desejamos saber é quando uma pasta nova é ativada para que o evento da planilha seja rodado:

Private Sub appXL_WorkbookActivate(ByVal Wb As Workbook)

   appXL_SheetActivate Wb.ActiveSheet

End Sub

Quando uma pasta de trabalho (workbook) é ativada o evento para a planilha é rodado e definido como a planilha ativa (ActiveSheet) na pasta de trabalho atual (AtiveWorkbook). Quando o evento ocorre as planilhas listadas no btnDropDown são as da pasta ativa.

Para terminar precisamos construir nossa barra de comando contendo a combobox. Depois das várias construções anteriores, não há segredo algum nesta construção, apenas algumas novidades:

Public Const CMDBARNOME As String = "Menu combobox"

'Dimensiona o objeto contendo os eventos como sendo a classe onde

'onde eventos foram definidos

Dim appExcel As New Classe1

 

Sub wsMenus()

Dim cmdBar          As CommandBar

Dim btnDropDown     As Object

 

Set cmdBar = CommandBars.Add(CMDBARNOME, msoBarFloating)

    cmdBar.Width = 150

Set btnDropDown = cmdBar.Controls.Add(Type:=msoControlDropdown)

    With btnDropDown

        .Tag = "Lista"

        .OnAction = "selPlanilha"

        .Width = 150

    End With

 

'Define os eventos do aplicativo que serão monitorados

Set appExcel.appXL = Application

 

   With cmdBar

    .Visible = True

    .Protection = msoBarNoChangeDock + msoBarNoResize

   End With

End Sub

Primeiramente, precisamos acessar as informações contidas na Classe1. Para fazer isso dimensionamos um objeto (neste caso appExcel) como uma nova classe que é referida como a classe por nós criada.

Em seguida criamos nosso menu como fizemos anteriormente. Quando definimos as propriedades do btnDropDown acrescentamos um Tag ao btnDropDown pois é este o valor sendo procurado na Classe1 através do FindControl.

Finalmente, definimos a propriedade appXL da dimensão appExcel como sendo o aplicativo (Application). O restando do código já foi discutido, sendo desnecessário explicar novamente.

O código anterior criar o menu e aplica os eventos ao menu. Porém, ainda precisamos definir a sub-rotina que ativa a planilha selecionada na lista. Esta sub-rotina foi chamada de selPlanilha na propriedade OnAction:

Sub selPlanilha()

   Dim btnDropDown As Object

   On Error Resume Next

   Set btnDropDown = CommandBars.FindControl _

    (Type:=msoControlDropdown, Tag:="Lista")

    ActiveWorkbook.Sheets(btnDropDown.Text).Activate

End Sub

Mais uma vez utilizamos a Tag para encontrar o controle btnDropDown. Quando o controle é encontrado, instruímos o Excel a selecionar a planilha cujo nome é igual ao texto contido no btnDropDown.

Terminamos aqui a solução de nosso problema.

« Anterior Δ Página principal ¤ Índice Próxima »
Quer receber novidades e e-books gratuitos?

MEGA FORMAÇÃO EM INFRAESTRUTURA DE TI

(Online, Vitalício, Prático e Atualizado)!

  • Chega de ser Ignorado pelo Mercado!

  • A vida não vai Melhorar Sozinha!

  • Quem domina infraestrutura, domina o Mercado.

  • Com esta Formação você vai Dominar o Conhecimento e torne-se o Profissional que as Empresas estão Buscando, "desesperadamente", mas não estão encontrando.

NÃO PROCURE VAGAS, SEJA PROCURADO!

 

Curso Completo de Excel - Curso Online com Certificado - 925 Vídeo Aulas - 22 Cursos - 120:42 horas

 

Para Todos os Detalhes, Acesse:

Curso Completo de Excel - Curso Online com Certificado - 925 Vídeo Aulas - 22 Cursos - 120:42 horas

 

https://juliobattisti.com.br/curso-infra-ti.asp

 

Contato: Telefone: (51) 3717-3796 | E-mail: webmaster@juliobattisti.com.br | Whatsapp: (51) 99627-3434

Júlio Battisti Livros e Cursos Ltda | CNPJ: 08.916.484/0001-25 | Rua Vereador Ivo Cláudio Weigel, 537 - Universitário, Santa Cruz do Sul/RS, CEP: 96816-208

Todos os direitos reservados, Júlio Battisti 2001-2026 ®

LIVRO: MACROS E PROGRAMAÇÃO VBA NO EXCEL 2016 - CURSO COMPLETO E PRÁTICO

DOMINE A PROGRAMAÇÃO VBA NO EXCEL - 878 PÁGINAS - CLIQUE AQUI