Neste artigo, o leitor aprenderá como utilizar o VBA para implementar barras de ferramentas personalizadas no Microsoft Office incluindo controles do tipo ComboBox. Criar barras de ferramentas personalizadas não é uma tarefa difícil, mas muitas vezes esquecemos, ou deixamos de lado, esse poderoso recurso do Office que pode facilitar, e muito, as tarefas do usuário final. Nas próximas linhas, apresentarei um cenário no qual fui inserido recentemente e que levou-me a buscar a solução na coleção CommandBars do Microsoft Office.
CENÁRIO ATUAL
Alguns dias atrás, fui procurado por um gerente da empresa acompanhado de outro funcionário que estava trabalhando na organização de arquivos de usuários que encontravam-se espalhados numa unidade de rede com 0,5 TB, isso mesmo, meio terabite. Imagine a quantidade de pastas e arquivos espalhados nessa unidade. O funcionário responsável pela organização dos dados havia trabalhado duramente para criar uma estrutura de pastas onde os arquivos seriam depositados. Contudo, havia algo que o preocupava, facilitar ao máximo a tarefa de salvar documentos nesta estrutura para o usuário final para que não houvesse resistência à adoção da nova solução. Essa preocupação procedia, pois para acomodar de maneira organizada todos os arquivos de usuários, a estrutura criada era bastante grande, o que dificultava a tarefa de salvar um arquivo. Imagine a cena: O usuário final abre o Microsoft Excel, cria uma nova pasta de trabalho, implementa suas planilhas e na hora de salvar, tem que buscar a pasta desejada dentro de uma estrutura com diversas pastas e diversos níveis de sub-pastas utilizando a janela Salvar Como. Isso realmente seria um problema.
SOLUÇÃO PROPOSTA
Analisando o cenário apresentado, propus a criação de uma barra de ferramentas personazada, onde pudéssemos inclur controles do tipo ComboBox para exibir listas das pastas existentes na unidade de rede, de forma que o usuário precisasse apenas selecionar a pasta onde desejava arquivar o documento e uma macro assocada ao controle se encarregaria de completar o processo. A Figura 1 apresenta a barra de ferramentas já criada e em execução no Microsoft Excel.
A MACRO CRIABARRADEFERRAMENTAS
O funcionamento da macro CriaBarraDeFerramentas é simples. Utilizando o evento Workbook_Open, nossa macro é invocada sempre que o usuário abrir a Pasta de Trabalho. O procedimento principal verifica a existência da barra de ferramentas, caso a barra já exista, certifica-se que ela esteja visível para o usuário. Caso contrário, cria a barra novamente e adiciona-a à coleção de CommandBars do Microsoft Office. Os controles ComboBoxes são alimentados programaticamente. Cada ComboBox está associada a um procedimento de evento que é informado na propriedade OnAction do controle. Também foi incluído um botão de comando ligado a cada ComboBox para permitir ao usuário salvar o arquivo repetidas vezes sem ter que selecionar novamente um item da lista. O botão de comando utiliza o mesmo procedimento associado à ComboBox. Neste exemplo, atribui o nome “Diretório Geologia e Mineração” para nossa barra de ferramentas. Confira na Lista 1 o código da macro CriaBarraDeFerramentas na íntegra.

Figura 1 - A barra de ferramentas com controles do tipo ComboBox
Sub CriaBarraFerramentas()
On Error GoTo ProcError
‘variável que indicará a existência da toolbar
Dim foundFlag As Boolean
‘assume-se que a barra não existe atribuindo o valor FALSE
foundFlag = False
‘percorre a coleção de toolbars do Office em busca da barra Geologia e Mineração
For Each bar In CommandBars
‘caso a barra seja encontrada
If (bar.BuiltIn = False) And (bar.Name = “Diretório Geologia e Mineração”)
Then
‘certifica-se que ela está visível para o usuário
If bar.Visible = False Then bar.Visible = True
‘atribuir valor TRUE para o flag que indica que a barra já existe
foundFlag = True
End If
Next bar
‘esta parte do código será executada apenas se a barra Geologia e Mineração
‘não foi encontrada. As linhas abaixo são responsáveis pela criação da barra
‘e implementação dos seus controles
If foundFlag = False Then
Dim barDiretorioDigital As CommandBar
‘cria a barra de ferramentas Geologia e Mineração e torna-a visível
Set barDiretorioDigital = CommandBars.Add(Name:=”Diretório Geologia e Mineração”, Position:=msoBarTop, Temporary:=True)
barDiretorioDigital.Visible = True
‘captura a imagem do botão SALVAR da barra STANDARD que será utilizada
‘nos botões que serão adicionados na barra Geologia e Mineração
Set btnSaveButtonStandard = CommandBars.FindControl(Type:=msoControlButton, ID:=3)
btnSaveButtonStandard.CopyFace ‘o método CopyFace copia a imagem do botão SALVAR para a área de trabalho
‘cria a ComboBox para armazenar a lista de pastas do diretório Gestao da Área
Dim cboGestaoArea As CommandBarComboBox
Set cboGestaoArea = barDiretorioDigital.Controls.Add(Type:=msoControlComboBox)
‘cria o botão btnSaveGestaoArea
Dim btnSaveGestaoArea As CommandBarButton
Set btnSaveGestaoArea = barDiretorioDigital.Controls.Add(Type:=msoControlButton)
‘define as propriedades do botão btnSaveGestaoArea
With btnSaveGestaoArea
.PasteFace
.TooltipText = “Salvar em Gestão da Área”
‘a propriedade OnAction indica o nome da Macro que deverá ser executada sempre que o botão for clicado .OnAction = “ArquivaCopiaGestaoArea” End With
‘Alimenta a lista de pastas da ComboBox
With cboGestaoArea
.AddItem “Acordos”
.AddItem “Auditorias”
.AddItem “Autorizações”
.AddItem “Comodatos”
.AddItem “Contratos”
.AddItem “Convênios”
.AddItem “DHO-RH”
.AddItem “DNPM”
.AddItem “Due Diligences”
.AddItem “Inspeções”
.AddItem “Investimentos”
.AddItem “Orçamentos”
.AddItem “Padronização”
.AddItem “Pareceres”
.AddItem “Propostas”
.AddItem “Reuniões”
.AddItem “Sinergia”
.AddItem “Suprimentos”
.AddItem “Vistorias”
‘define a propriedade Caption que será exibida ao lado da Combo .Caption = “Gestão da Área: “ ‘define o estilo como msoComboLabel para exibir o Caption .Style = msoComboLabel ‘Ajuda sensível ao contexto .TooltipText = “Selecione uma pasta do diretório Gestão da Área para salvar seu trabalho.”
‘define a propriedade TAG que será utilizada para identificar as ComboBox
entre os controles da toolbar
.Tag = “cboGestaoArea”
‘a propriedade OnAction define a macro que será executada sempre que o
usuário selecionar um item da lista
.OnAction = “ArquivaCopiaGestaoArea”
End With
‘cria a ComboBox para armazenar a lista de pastas do diretório Biblioteca
Digital
Dim cboBibliotecaDigital As CommandBarComboBox
Set cboBibliotecaDigital = barDiretorioDigital.Controls.Add(Type:=msoControl ComboBox)
‘cria o botão btnSaveBibliotecaDigital
Dim btnSaveBibliotecaDigital As CommandBarButton
Set btnSaveBibliotecaDigital = barDiretorioDigital.Controls.Add(Type:=msoControlButton)
‘define as propriedades do botão
With btnSaveBibliotecaDigital
.PasteFace
.TooltipText = “Salvar em Biblioteca Digital”
‘a propriedade OnAction indica o procedimento que será executado quando o
botão for clicado
.OnAction = “ArquivaCopiaBibliotecaDigital”
End With
‘adiciona os itens à lista da ComboBox Biblioteca Digital
With cboBibliotecaDigital
.AddItem “Links”
.AddItem “Softwares - BDMV”
.AddItem “Softwares - Datamine”
.AddItem “Softwares - Primavera”
.AddItem “Apoio Biblioteca Física”
.AddItem “Apresentações”
.AddItem “Agregados”
.AddItem “Equipamentos - Mineração”
.AddItem “Equipamentos - Auxiliares”
.AddItem “Legislação”
.AddItem “Relatórios”
‘define a propriedade Caption que será exibida ao lado da Combo
.Caption = “Biblioteca Digital: “
‘define o estilo = msoComboLabel para permitir a exibição do Caption
.Style = msoComboLabel
‘exibe a ajuda sensível ao contexto ao mover o mouse sobre o controle
.TooltipText = “Selecione uma pasta do diretório Biblioteca Digital para salvar seu trabalho.”
‘define a propriedade TAG que será utilizada para identificar a ComboBox entre os outros controles da barra
.Tag = “cboBibliotecaDigital”
‘a propriedade OnAction indica o procedimento que será executado sempre que um item for selecionado
.OnAction = “ArquivaCopiaBibliotecaDigital”
End With
‘cria a ComboBox para armazenar a lista de pastas do diretório Processos
Minerais
Dim cboProcessosMinerais As CommandBarComboBox
Set cboProcessosMinerais = barDiretorioDigital.Controls.Add(Type:=mso ControlComboBox)
‘cria o botão btnSaveProcessosMinerais
Dim btnSaveProcessosMinerais As CommandBarButton
Set btnSaveProcessosMinerais = barDiretorioDigital.Controls.Add(Type:=mso ControlButton)
‘define as propriedades do botão
With btnSaveProcessosMinerais
.PasteFace
.TooltipText = “Salvar em Processos Minerais”
‘a propriedade OnAction indica o procedimento que será executado sempre que o botão for clicado
.OnAction = “ArquivaCopiaProcessosMinerais”
End With
‘adiciona os itens à lista da ComboBox ProcessosMinerais
With cboProcessosMinerais
.AddItem “Pesquisas”
.AddItem “Lavras”
‘define a propriedade Caption que será exibida ao lado do controle
.Caption = “Processos Minerais: “
‘define o estilo = msoComboLabel para permitir a exibição do Caption
.Style = msoComboLabel
‘ajuda sensível ao contexto ativada quando movimenta-se o mouse sobre o controle
.TooltipText = “Selecione uma pasta do diretório Processos Minerais para salvar seu trabalho.”
‘a propriedade TAG será utilizada para identificar a ComboBox entre os outros controles da toolbar
.Tag = “cboProcessosMinerais”
‘a propriedade OnAction indica o procedimento que será executado sempre que um item for selecionado
.OnAction = “ArquivaCopiaProcessosMinerais”
End With
End If
‘tratamento de erros do procedimento notifica o usuário caso ocorra algum erro durante o processamento
ProcExit:
Exit Sub
ProcError:
Select Case Err.Number
Case 5
Resume ProcExit
Case Else
MsgBox “Ocorreu um erro associado à Macro [CriaBarraFerramentasGeoMinera].” & vbCrLf & “Erro: “ & Err.Number & vbCrLf & “Descrição: “ & Err.Description, vbExclamation, “Diretório Geologia e Mineração”
Resume ProcExit
End Select
End Sub
Lista 1 – Códgo da MacroCraBarraDeFerramentas
DESTAQUES DA MACRO
O código apresentado na Lista 1 merece alguns destaques. O primeiro ponto que gostaria de chamar a atenção do leitor refere-se aos métodos CopyFace e PasteFace. Esses métodos são utilizados para manipular as imagens que serão exibidas nos botões incluídos na barra de ferramentas personalizada. O primeiro passo é selecionar o botão do qual você deseja copiar a imagem. No exemplo apresentado, nós capturamos a imagem do botão Salvar utilizando o método CopyFace, para posteriormente atribuí-la aos nossos botões ligados aos controles ComboBox utilizando o método PasteFace. O método FindControl do objeto CommandBars foi utilizado para selecionar o botão Salvar da barra de ferramentas Standard. Atenção para o parâmetro ID que requer o número correspondente à posição do botão na barra de ferramentas, iniciando a contagem com o número 1.
Outro destaque do código apresentado na Lista 1, refere-se à propriedade OnAction. Para cada controle inserido na barra de ferramentas, esta propriedade deve ser alimentada com o nome do procedimento (macro), que será executado sempre que o usuário interagir com o controle. Por último, gostaria de destacar o uso da propriedade Tag. Quando implementamos barras de ferramentas personalizadas, temos à nossa disposição todos os métodos, propriedades e eventos “herdados” da classe CommandBars. Assim, podemos utilizar o método FindControl para localizar um controle na nossa barra de ferramentas passando o ID correspondente. Uma alternativa para essa abordagem é atribuir um identificador para a propriedade Tag e utilizá-lo em conjunto com o método FindControl, paralocalizar o controle desejado. É mais simples do que fazer referência ao índice do controle.
OS PROCEDIMENTOS PARA SALVAR A PASTA DE TRABALHONossa barra de ferramentas, foi implementada com três controles do tipo ComboBox e cada qual com um botão de comando associado, como mostra a Figura 2.

Figura 2 - A barra de ferramentas personalizada
Cada ComboBox está associada a uma área da unidade de rede. Por exemplo, criamos uma ComboBox para exibir alista de pastas da Área de Gestão, outra ComboBox para exibir a lista de pastas da Biblioteca Digitale outra para Processos Minerais. Desta forma, criei três procedimentos para salvar a Pasta de Trabalho, ou seja, um procedimento para cada ComboBox e seu botão de comando. A Lista 2 apresenta o código do procedimento ArquivaCopiaProcessosMinerais. Os outros procedimentos para salvar a pasta de trabalho são semelhantes e podem ser examinados no arquivo CustomToolBarVBA.xls.
Sub ArquivaCopiaProcessosMinerais()
On Error GoTo ProcError
‘variáveis para armazenar o PATH e nome do arquivo que serão utilizados pelo método SaveCopyAs
Dim strPath As String
Dim strFileName As String
‘identifica a ComboBox cboProcessosMinerais para capturar a propriedade Text
que contém o nome
‘da pasta onde o arquivo será gravado.
‘Poderíamos utilizar a sintaxe CommandBars.ActionControl.Text para capturar o item selecionado
‘contudo, seria necessário criar outro procedimento para associar ao botão
“Salvar” que trabalha
‘em conjunto com a ComboBox.
‘Identificando a combo através do TAG, o mesmo procedimento pode ser utilizado pelos dois
‘controles (ComboBox e CommandButton)
Set cbo = CommandBars(“Diretório Geologia e Mineração”).FindControl(Type:= msoControlComboBox, Tag:=”cboProcessosMinerais”)
‘se nenhum item da lista foi selecionado aborta o procedimento e notifica o usuário
If cbo.Text = “” Then
MsgBox “Selecione uma pasta do diretório [Processos Minerais] para salvar
seu trabalho.”, vbExclamation, “Diretório Digital Geologia e Mineração” Set cbo = Nothing Exit Sub
End If
‘solicita que o usuário informe o nome do arquivo a ser salvo
strFileName = InputBox(“Informe o nome do arquivo e extensão (Ex.: arquivo.xls,
arquivo.doc, etc.) para salvar na pasta [“ & cbo.Text & “] do Diretório Digital.”,
“Diretório Geologia e Mineração”, “digite o nome do arquivo e extensão. Ex.:
meuarquivo.xls”)
‘caso o usuário pressione o botão Cancelar da InputBox, aborta o procedimento
e notifica o usuário
If strFileName = “” Then
MsgBox “Operação de arquivo cancelada pelo usuário!”, vbInformation,
“Diretório Geologia e Mineração”
Exit Sub
End If
‘verifica qual pasta foi selecionada e identifica o PATH associado a ela
Select Case cbo.Text ‘could be = CommandBars.ActionControl.Text
Case “Pesquisas”
strPath = “c:\processos minerais\pesquisas\”
Case “Lavras”
strPath = “c:\processos minerais\lavras\”
Case Else
strPath = “”
End Select
‘se o PATH não foi informado ou se não foi localizado, notifica o usuário e aborta
o procedimento
If strPath <> “” And Dir(strPath, vbDirectory) <> “” Then
ActiveWorkbook.SaveCopyAs strPath & strFileName
Else
MsgBox “O PATH (Caminho) [“ & strPath & “] não foi encontrado.”,
vbExclamation, “Diretório Geologia e Mineração”
End If
‘tratamento de erro notifica o usuário de qualquer erro que ocorra durante o
processamento
ProcExit:
Exit Sub
ProcError:
Select Case Err.Number
Case 1004
Resume ProcExit
Case Else
MsgBox “Ocorreu um erro associado à Macro [ArquivaCopiaProcesso
sMinerais].” & vbCrLf & “Erro: “ & Err.Number & vbCrLf & “Descrição: “ & Err.
Description, vbExclamation, “Diretório Geologia e Mineração”
Resume ProcExit
End Select
End Sub
Lista 2– O procedimento ArquivaCopiaProcessosMinerais
ENTENDENDO OS PROCEDIMENTOS ARQUIVACOPIAX
Para que o leitor possa entender o código apresentado na Lista 2, aqui vai uma explicação: O procedimento é invocado sempre que um item da ComboBox é selecionado, ou então quando o usuário clica no botão de comando associado à ComboBox. Nos dois casos, o procedimento obtém a propriedadeText da ComboBox em referência e utiliza essa informação para identificar o Path, onde a pasta de trabalho deverá ser gravada. Finalmente dispara o método SaveCopyAs que encarrega-se de gravar efetivamente uma cópia do arquivo na pasta selecionada.
POR QUE O MÉTODO SAVECOPYAS?
O leitor habituado com o VBA pode estar perguntando: por que usei o método SaveCopyAs? Na verdade, essa é uma questão a ser analisada para cada cenário. A necessidade do meu usuário era que ele pudesse trabalhar nos seus arquivos em modo local e, quando desejasse, salvar uma cópia dentro da estrutura de pastas do arquivo digital. Os métodos Save ou SaveAs sempre exibiriam as janelas de diálogo Salvar ou Salvar Como, além disso, esses métodos solicitam a confirmação do usuário antes de sobrescrever qualquer arquivo existente e esse comportamento não era desejado. Com o método SaveCopyAs, o Microsoft Excel cria uma cópia do arquivo original no local especificado sem exibirjanelas de diálogo e nem solicitar a confirmação do usuário para sobrescrever um arquivo existente. Isso facilitaria a vida do nosso usuário final. Minha sugestão para o leitor é que analise cuidadosamente o cenário da sua empresa antes de escolher a melhor abordagem.
SUA CRIATIVIDADE É O LIMITE
Esta é apenas uma amostra do que podemos implementar no Microsoft Office utilizando o VBA. Num exercício de imaginação, você pode visualizar essa mesma solução associada a um banco de dados, onde você pode manter a estrutura de pastas devidamente atualizada. Ou ainda melhor, podemos utilizar o VBA para varrer “fisicamente” a unidade de rede e alimentar os controles ComboBox com a lista de pastas encontradas, exibindo assim, informações sempre atualizadas com a estrutura física das pastas. Desta forma, mesmo que os usuários criem novas pastas ou removam pastas existentes, a barra de ferramentas estará sempre atualizada.
Conclusão
Neste artigo o leitor aprendeu como utilizar o VBA paraimplementar uma barra de ferramentas customizada, queincluicontroles do tipo ComboBox e comointeragir com esses controles identificando os itens selecionados pelo usuário. O exemplo apresentado foiimplementado no Microsoft Excel, contudo, com alguns ajustes no código queinvoca o método SaveCopyAs, esta mesma solução pode ser adotada em qualquer aplicativo do Microsoft Office. Boa leitura e até a próxima oportunidade.