Expor Membros de um Projeto no Intellisense

O VBE é uma IDE que possui algumas deficiências, e nesta postagem é mostrado como expandir a funcionalidade do intellisense.

Por vezes, acho tedioso escrever código VBA, como no Excel:

ThisWorkbook.Worksheets("Vendas").Range("A1").Value2 = 50

O intellisense ajuda ao pressionarmos o . na digitação de ThisWorkbook para autocompletarmos com Worksheets, e isso é ótimo. Então, pensei: “não seria ótimo se, ao abrirmos aspas, fossem mostradas todas as planilhas contidas na pasta de trabalho?“.

Consegui resolver esse problema utilizando tipos definidos. Ao executar o procedimento deste artigo, é gerado um novo módulo com funções de acesso a esses membros. Então, no VBE, ao digitar ws (de Worksheets) e um ponto, são listadas todas as planilhas do meu projeto:

Isso é possível porque o código executado cria um módulo que possui uma função chamada ws que retorna um tipo definido de planilhas, e cada um dos membros desse tipo definido retorna um objeto Worksheet.

Algumas vantagens imediatas dessa técnica:

  • Visualiza-se rapidamente todas as planilhas da pasta de trabalho.
  • O intellisense aumenta a agilidade no desenvolvimento do código.
  • Você não obterá erros em tempo de execução ao tentar acessar, por exemplo, Worksheets("Clientes"), mas sim um erro de compilação se estiver na forma ws.Clientes, uma vez que Clientes não é um membro de ws. Em outras palavras, troca-se um erro de execução por um de compilação, o que é bom para depuração.

Expandi essa ideia para diversos objetos do Excel, utilizando sempre uma forma de prefixo de dois caracteres como função de acesso dos objetos:

Note que alguns membros estão numa hierarquia de mais de um nível, como é o caso do DataBodyRange. Considerando que a tabela acima se chama Membros, por exemplo, ao digitar no VBE:

Debug.Print dr.Membros.MostraListaDe(3)

Obtemos na janela de verificação imediata o terceiro elemento da tabela Membros da coluna MostrarListaDe, que é o texto Tabelas. Note que a técnica remove espaços e caracteres inválidos ao montar a lista de membros do tipo definido de acordo com os requisitos técnicos de linguagem do VBA para que não haja erros de compilação:

Public Type MembrosDataBodyRanges
    Abreviação As Range
    Significado As Range
    MostraListaDe As Range
End Type

Demonstração

Veja a tela a seguir:

Veja como usar essa técnica com o código de demonstração a seguir:

Sub Demonstration()
    'Ativar planilha Vendas
    ws.Vendas.Activate
    
    'Cor da fonte do estilo Vendedores
    Debug.Print st.Vendedores.Font.Color
    
    'Mostra endereço da tabela Vendedores
    Debug.Print lo.Vendedores.Range.Address
    
    'Posição da coluna Abreviação na tabela Membros
    Debug.Print lc.Membros.Abreviação.Index
    
    'Laço que percorre todas as células da coluna Cidade da tabela VendasPorCidade
    Dim iCell As Range
    For Each iCell In dr.VendasPorCidade.Cidade
        Debug.Print iCell
    Next iCell
    
    'Valor do nome definido global Usuário
    Debug.Print gr.Usuário
    
    'Valor do nome definido local UFAtual da planilha Vendas:
    Debug.Print lr.Vendas.UFAtual
    
    'Referência do nome definido global Usuário:
    Debug.Print gn.Usuário.RefersTo
 
    'Visibilidade do nome definido local Período da planilha Vendas:
    Debug.Print ln.Vendas.Período.Visible
End Sub

Cuidados

Toda vez que você criar, alterar ou excluir um objeto de sua pasta de trabalho (estilos, tabelas, planilhas ou nomes), deverá executar novamente a rotina que gera suas funções de acesso. Caso contrário, os membros das funções não irão refletir a realidade dos objetos do seu documento.

Toda vez que executar a rotina de gerar as funções de acesso, compile o código para verificar a ausência de erros. Como a rotina desconsidera alguns caracteres, ocasionalmente podem ser gerados membros duplicados. Por exemplo, os estilos chamados Taxa e Taxa (%) são convertidos para o membro Taxa, e ao compilar o código o VBE irá acusar que existem dois membros na declaração de um tipo com o mesmo nome. A solução nesse caso seria, por exemplo, você alterar o nome do estilo Taxa (%) para algo como Taxa Percentual para o código gerar um membro chamado TaxaPercentual e não ter mais a duplicidade.

Utilizei variáveis estáticas para implementar essa técnica e até agora o desempenho tem se mostrado satisfatório. Claro, se em determinada situação você quiser fazer um laço grande, vale a pena usar a cláusula With ou uma variável para referenciar um determinado objeto.

Expansão

Você pode utilizar essa rotina como modelo para acessar outros objetos de uma pasta de trabalho, como tabelas dinâmicas, autoformas (objetos Shape) e comentários, por exemplo.

Além disso, se você trabalha com PowerPoint, pode aplicar o conceito para acessar Slides e autoformas. No Word, útil para acessar estilos e indicadores. No Access, Tabelas e campos das tabelas. Use sua criatividade.

Não esqueça de habilitar a caixa de seleção Confiar no acesso ao modelo de objeto do projeto do VBA nas configurações de segurança de macro antes de executar a macro.
Para fazer download do arquivo, clique aqui.

Sobre Felipe Gualberto

Microsoft Most Valuable Professional (MVP) de Excel.
Esta entrada foi publicada em Ferramentas e marcada com a tag , , , , , , , , . Adicione o link permanente aos seus favoritos.