Como Referenciar a Biblioteca de Objetos do Office no VBA do Word sem Ligação Antecipada
🔍 WiseChecker

Como Referenciar a Biblioteca de Objetos do Office no VBA do Word sem Ligação Antecipada

Ao escrever macros VBA no Word que interagem com outros aplicativos do Office, como Excel ou Outlook, você precisa referenciar a Biblioteca de Objetos do Office. O método padrão usa ligação antecipada, que exige configurar uma referência no editor VBA e trava seu código a uma versão específica da biblioteca. Isso pode causar macros quebradas quando os usuários têm uma versão diferente do Office ou quando o caminho da biblioteca muda. Este artigo explica como usar ligação tardia, para que seu código funcione em todas as versões do Office sem configuração manual de referências.

Principais Conclusões: Ligação Tardia para a Biblioteca de Objetos do Office no VBA do Word

  • Declare variáveis como Object em vez de tipos específicos (ex.: Excel.Application): Evita dependência em tempo de compilação da versão da biblioteca do Office.
  • Use CreateObject(“Excel.Application”) em vez de New Excel.Application: Cria o objeto em tempo de execução sem precisar de referência configurada.
  • Remova a referência à Biblioteca de Objetos do Office em Ferramentas > Referências: Garante que a macro funcione em qualquer versão do Office sem ajustes manuais.

ADVERTISEMENT

O que Significam Ligação Antecipada e Ligação Tardia no VBA do Word

Ligação antecipada, também chamada de ligação estática, ocorre quando você define uma referência a uma biblioteca de tipos específica no editor VBA. Por exemplo, você vai em Ferramentas > Referências e marca “Microsoft Excel 16.0 Object Library.” Então você pode declarar variáveis como tipos específicos, como Dim xlApp As Excel.Application. O compilador resolve todas as propriedades e métodos do objeto em tempo de compilação. Isso fornece IntelliSense e execução mais rápida, mas prende sua macro àquela versão exata da biblioteca.

Ligação tardia, ou ligação dinâmica, resolve os tipos de objeto em tempo de execução. Você declara variáveis como o tipo genérico Object e usa CreateObject ou GetObject para instanciá-las. O compilador VBA não verifica os membros do objeto até o código ser executado. Isso significa que você não precisa de nenhuma referência configurada no editor VBA. A macro funciona em qualquer máquina que tenha o aplicativo Office de destino instalado, independentemente da versão.

A Biblioteca de Objetos do Office contém objetos, constantes e funções comuns compartilhados entre os aplicativos do Office. Você pode precisar dela para objetos como Office.CommandBar, Office.FileDialog ou Office.MsoThemeColorIndex. Com ligação antecipada, você deve referenciar a biblioteca. Com ligação tardia, você evita essa referência completamente.

Por que Usar Ligação Tardia para a Biblioteca de Objetos do Office

O principal motivo é a compatibilidade. Se você distribuir uma macro do Word para colegas ou clientes, não pode garantir que eles tenham a mesma versão do Office. Uma referência de ligação antecipada para “Microsoft Office 16.0 Object Library” falha em uma máquina com Office 2019 ou Office 365. A ligação tardia elimina esse problema. Você também evita a necessidade de atualizar referências quando o Office é atualizado. A desvantagem é que você perde o IntelliSense e o código executa um pouco mais devagar porque a ligação ocorre em tempo de execução.

Passos para Referenciar a Biblioteca de Objetos do Office no VBA do Word sem Ligação Antecipada

Siga estes passos para reescrever seu código existente de ligação antecipada ou escrever novo código que use ligação tardia para a Biblioteca de Objetos do Office. Estes passos assumem que você já tem uma macro que usa ligação antecipada com uma referência configurada.

  1. Abra o editor VBA e verifique as referências atuais
    Pressione Alt+F11 para abrir o editor VBA. Vá em Ferramentas > Referências. Procure por qualquer item marcado que diga “Microsoft Office xx.x Object Library” onde xx.x é um número de versão. Anote o nome exato da biblioteca. Você removerá esta marcação depois.
  2. Identifique todas as declarações de variáveis de ligação antecipada
    Em seus módulos de código, encontre toda declaração Dim ou Set que use um tipo específico do Office. Tipos comuns incluem Office.CommandBar, Office.CommandBarButton, Office.FileDialog, Office.MsoFileDialogType e Office.MsoThemeColorIndex. Procure também por palavras-chave New que criam objetos do Office.
  3. Altere os tipos de variáveis para Object
    Substitua cada tipo específico por Object. Por exemplo, mude Dim cb As Office.CommandBar para Dim cb As Object. Mude Dim fd As Office.FileDialog para Dim fd As Object. Faça o mesmo para todas as variáveis relacionadas ao Office.
  4. Substitua New por CreateObject
    Qualquer linha que use Set cb = New Office.CommandBar deve mudar para Set cb = CreateObject("Office.CommandBar"). O argumento string é o identificador programático (ProgID) do objeto. Para a Biblioteca de Objetos do Office, o formato do ProgID é “Office.NomeDoObjeto”. Exemplos comuns: CreateObject("Office.CommandBar"), CreateObject("Office.FileDialog").
  5. Substitua constantes nomeadas por seus valores numéricos
    O Office define muitas constantes como msoFileDialogFilePicker ou msoThemeColorAccent1. Na ligação tardia, essas constantes não estão disponíveis porque a biblioteca de tipos não está carregada. Você deve consultar o valor numérico de cada constante e usar esse número diretamente. Por exemplo, msoFileDialogFilePicker tem valor 1. Substitua msoFileDialogFilePicker por 1. Uma maneira rápida de encontrar valores é abrir o Navegador de Objetos no editor VBA enquanto a referência ainda está configurada, selecionar a biblioteca do Office e visualizar o valor da constante no painel inferior. Anote todos os valores necessários antes de remover a referência.
  6. Remova a referência à Biblioteca de Objetos do Office
    Vá em Ferramentas > Referências novamente. Desmarque o item “Microsoft Office xx.x Object Library”. Clique em OK. O editor VBA não resolverá mais os tipos do Office. Seu código ainda deve compilar porque você alterou todos os tipos para Object e substituiu constantes por números.
  7. Teste a macro em um novo documento
    Abra um novo documento do Word. Pressione Alt+F8, selecione sua macro e clique em Executar. Se ocorrer um erro de compilação, verifique se há declarações ou constantes de ligação antecipada restantes. Corrija-as e teste novamente. A macro deve ser executada sem qualquer referência à Biblioteca de Objetos do Office.

ADVERTISEMENT

Problemas Comuns e Como Evitá-los

Erro “Objeto não dá suporte a esta propriedade ou método” em tempo de execução

Esse erro ocorre quando você usa uma propriedade ou método que existe em uma versão mais recente da Biblioteca de Objetos do Office, mas não na versão instalada na máquina do usuário. A ligação tardia não protege contra membros ausentes. Para evitar isso, verifique a versão do Office em tempo de execução usando Application.Version ou use tratamento de erros com On Error Resume Next ao redor da linha problemática. Em seguida, teste a propriedade ou método antes de usá-lo.

Não é possível encontrar o ProgID correto para um objeto do Office

Nem todos os objetos do Office têm um ProgID. Por exemplo, Office.FileDialog tem um ProgID, mas Office.MsoThemeColorIndex é uma enumeração, não um objeto. Enumerações não podem ser criadas com CreateObject. Para enumerações, você deve usar valores numéricos. Para objetos que não têm um ProgID, talvez seja necessário acessá-los por meio de um objeto pai. Por exemplo, você obtém um CommandBar através de Application.CommandBars em vez de criá-lo diretamente.

A macro fica mais lenta após mudar para ligação tardia

A ligação tardia é inerentemente mais lenta porque o runtime VBA precisa consultar cada propriedade e método em tempo de execução. A diferença geralmente é insignificante, a menos que sua macro chame milhares de membros de objetos do Office em um loop. Se o desempenho for crítico, mantenha a versão de ligação antecipada para uso próprio e distribua a versão de ligação tardia. Você também pode usar compilação condicional para alternar entre ligação antecipada e tardia com base em uma constante.

Ligação Antecipada vs Ligação Tardia para a Biblioteca de Objetos do Office no VBA do Word

Item Ligação Antecipada Ligação Tardia
Configuração de referência Deve marcar a biblioteca em Ferramentas > Referências Nenhuma referência necessária
Declaração de variável Tipo específico (ex.: Office.CommandBar) Tipo Object genérico
Criação de objeto Palavra-chave New ou CreateObject com referência Apenas CreateObject com ProgID
Suporte a IntelliSense Sim Não
Velocidade de execução Mais rápida Ligeiramente mais lenta
Compatibilidade entre versões Pode falhar se a versão do Office for diferente Funciona em todas as versões
Uso de constantes Usa constantes nomeadas diretamente Deve usar valores numéricos

Mudar para ligação tardia para a Biblioteca de Objetos do Office torna suas macros VBA do Word portáteis entre versões do Office. Você abre mão do IntelliSense e de um pequeno ganho de desempenho, mas ganha distribuição confiável sem conflitos de versão. Comece convertendo uma macro que usa objetos do Office. Depois de dominar o padrão, aplicá-lo a outras macros é rápido. Para projetos complexos, considere usar compilação condicional para manter uma versão de ligação antecipada para desenvolvimento e uma versão de ligação tardia para implantação.

ADVERTISEMENT