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.
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.
- 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. - Identifique todas as declarações de variáveis de ligação antecipada
Em seus módulos de código, encontre toda declaraçãoDimouSetque use um tipo específico do Office. Tipos comuns incluemOffice.CommandBar,Office.CommandBarButton,Office.FileDialog,Office.MsoFileDialogTypeeOffice.MsoThemeColorIndex. Procure também por palavras-chaveNewque criam objetos do Office. - Altere os tipos de variáveis para Object
Substitua cada tipo específico porObject. Por exemplo, mudeDim cb As Office.CommandBarparaDim cb As Object. MudeDim fd As Office.FileDialogparaDim fd As Object. Faça o mesmo para todas as variáveis relacionadas ao Office. - Substitua New por CreateObject
Qualquer linha que useSet cb = New Office.CommandBardeve mudar paraSet 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"). - Substitua constantes nomeadas por seus valores numéricos
O Office define muitas constantes comomsoFileDialogFilePickeroumsoThemeColorAccent1. 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,msoFileDialogFilePickertem valor 1. SubstituamsoFileDialogFilePickerpor1. 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. - 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. - 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.
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.