Você vê o erro de compilação VBA no Word “Sub or Function Not Defined” após mover um projeto de macros de um computador para outro ou de uma versão antiga do Office. Esse erro significa que o editor do Visual Basic for Applications não consegue localizar um procedimento chamado pelo seu código. A causa raiz é quase sempre uma referência ausente ou um caminho de biblioteca quebrado que era válido no sistema de origem, mas não no sistema de destino. Este artigo explica como identificar a referência ausente, reparar o projeto e evitar que o erro ocorra novamente em migrações futuras.
Principais conclusões: corrigindo o erro de compilação VBA após migração do projeto
- Ferramentas > Referências no editor VBA: Mostra todas as referências de biblioteca ativas; uma referência ausente exibe “MISSING” na caixa de diálogo e é a causa usual do erro.
- Early binding vs. late binding: Mudar de early binding (referência de biblioteca específica) para late binding (CreateObject) elimina a dependência de uma versão específica da biblioteca.
- Exportar e reimportar módulos: Remove metadados corrompidos do projeto que podem causar falhas na resolução de referências após a migração.
Por que o erro “Sub or Function Not Defined” ocorre após a migração
Ao escrever código VBA que chama uma função ou sub de uma biblioteca externa — por exemplo, Excel.Application, MSForms.UserForm ou Scripting.FileSystemObject — o Word armazena uma referência a essa biblioteca. Essa referência inclui um GUID e um número de versão. Na máquina de origem, a biblioteca está presente. Na máquina de destino, a biblioteca pode ser de uma versão diferente, um pacote de idioma diferente ou estar totalmente ausente. O editor VBA não consegue resolver a referência, então marca toda chamada a essa biblioteca como indefinida.
Uma segunda causa comum é uma referência corrompida ou órfã que sobreviveu à migração. Ao copiar um arquivo .dotm ou .docm, o projeto VBA embutido carrega sua tabela de referências. Se o sistema de destino tiver uma edição diferente do Office — por exemplo, 64 bits vs. 32 bits — os caminhos das bibliotecas mudam e as referências quebram.
O papel do early binding em falhas de migração
Early binding significa que seu código declara variáveis de objeto com um tipo específico, como Dim xlApp As Excel.Application. Isso requer uma referência à biblioteca de objetos do Excel. Se a máquina de destino não tiver o Excel instalado, ou se a versão da biblioteca for diferente, a compilação falha. Late binding usa Dim xlApp As Object e CreateObject("Excel.Application"), que resolve em tempo de execução e não requer uma referência em tempo de compilação.
Etapas para identificar e corrigir a referência ausente
Siga estas etapas em ordem. Pare após cada etapa se o erro não aparecer mais.
Etapa 1: Abra o editor VBA e verifique as referências
- Abra o editor VBA
Pressione Alt+F11 no Word. A janela do editor VBA é aberta. - Abra a caixa de diálogo Referências
No menu do editor VBA, selecione Ferramentas > Referências. A caixa de diálogo Referências lista todas as bibliotecas ativas. - Encontre a referência ausente
Role a lista. Uma referência ausente mostra a palavra “MISSING” no início de sua entrada. A caixa de seleção ainda está marcada. Desmarque essa entrada e clique em OK. - Teste o projeto
Pressione F5 para executar a macro. Se o erro desaparecer, a referência ausente era a causa. Se o erro persistir, vá para a Etapa 2.
Etapa 2: Re-adicione a referência de biblioteca correta
- Abra a caixa de diálogo Referências novamente
Pressione Alt+F11 e selecione Ferramentas > Referências. - Localize a biblioteca correta
Encontre a biblioteca que você acabou de desmarcar. Por exemplo, “Microsoft Excel 16.0 Object Library” ou “Microsoft Scripting Runtime.” Marque sua caixa. - Verifique o caminho do arquivo
Com a biblioteca selecionada, observe o campo Localização na parte inferior da caixa de diálogo. O caminho deve apontar para um arquivo que existe no sistema de destino. Se o caminho estiver quebrado, navegue até o arquivo correto usando o botão Procurar. - Clique em OK e compile
Clique em OK. No editor VBA, selecione Depurar > Compilar VBAProject. Se nenhum erro aparecer, a correção está completa.
Etapa 3: Converta código early-bound para late binding
Se a referência ausente for de uma biblioteca que não está instalada no sistema de destino — por exemplo, Excel em uma máquina que só tem Word — converta o código relevante para late binding. Esta é a correção de longo prazo mais confiável para projetos migrados.
- Identifique declarações early-bound
No editor VBA, pesquise por palavras-chaveAsseguidas por um tipo de biblioteca, comoAs Excel.ApplicationouAs Scripting.FileSystemObject. Essas são declarações early-bound. - Substitua pelo tipo Object
AltereDim xlApp As Excel.ApplicationparaDim xlApp As Object. - Substitua a palavra-chave New por CreateObject
AltereSet xlApp = New Excel.ApplicationparaSet xlApp = CreateObject("Excel.Application"). - Remova a referência de biblioteca
Abra Ferramentas > Referências e desmarque a biblioteca que não é mais necessária. Compile o projeto com Depurar > Compilar VBAProject. O erro deve desaparecer.
Etapa 4: Exporte e reimporte todos os módulos
Se o erro persistir apesar das referências corretas, o próprio projeto VBA pode conter metadados corrompidos. Exportar e reimportar módulos reconstrói o arquivo do projeto.
- Exporte cada módulo
No painel do Gerenciador de Projetos, clique com o botão direito em um módulo e selecione Exportar Arquivo. Salve o arquivo .bas em uma pasta. Repita para cada módulo, módulo de classe e formulário de usuário. - Remova os módulos originais
Clique com o botão direito em cada módulo e selecione Remover. Confirme a remoção. Não salve alterações nos arquivos exportados. - Importe os módulos de volta
Clique com o botão direito no projeto no Gerenciador de Projetos, selecione Importar Arquivo e selecione os arquivos .bas que você exportou. Repita para todos os módulos. - Re-adicione referências e compile
Defina as referências necessárias em Ferramentas > Referências. Compile o projeto. O erro deve ser resolvido.
Se o erro ainda ocorrer após essas correções
Erro de compilação VBA no Word em migração de 64 bits vs. 32 bits
Se você moveu o projeto de um Office 32 bits para um Office 64 bits, declare funções de API com a palavra-chave PtrSafe. Sem PtrSafe, o Office 64 bits trata a declaração como indefinida. Adicione PtrSafe após Private Declare ou Public Declare. Atualize também parâmetros Long usados para ponteiros para LongPtr.
Erro de compilação VBA no Word causado por referência órfã a um complemento ausente
Alguns projetos referenciam bibliotecas de complementos de terceiros. Se o complemento não estiver instalado na máquina de destino, a referência aparece como MISSING. Desmarque a referência órfã em Ferramentas > Referências. Se seu código depende desse complemento, instale o complemento na máquina de destino ou reescreva o código para evitar a dependência.
Erro de compilação VBA no Word após atualizar a versão do Office
Uma atualização do Office pode alterar os números de versão das bibliotecas. Por exemplo, “Microsoft Word 15.0 Object Library” muda para “Microsoft Word 16.0 Object Library.” Abra Ferramentas > Referências, desmarque a versão antiga e marque a nova versão. O erro de compilação desaparecerá.
Early binding vs. late binding para projetos migrados
| Item | Early Binding | Late Binding |
|---|---|---|
| Referência de biblioteca necessária | Sim, marcada na caixa de diálogo Referências | Não, resolvida em tempo de execução |
| Erro de compilação em biblioteca ausente | Sim, “Sub or Function Not Defined” | Não, erro em tempo de execução apenas se a biblioteca estiver ausente |
| Suporte a IntelliSense | Sim, preenchimento automático completo e verificação de tipos | Não, sem preenchimento automático durante a edição |
| Desempenho | Ligeiramente mais rápido em tempo de execução | Ligeiramente mais lento em tempo de execução |
| Melhor para projetos migrados | Apenas se o ambiente de destino for idêntico | Recomendado para qualquer projeto que se mova entre máquinas |
Agora você pode identificar e corrigir o erro de compilação “Sub or Function Not Defined” em um projeto VBA do Word migrado. Comece verificando a caixa de diálogo Referências em busca de entradas MISSING e re-adicionando a biblioteca correta. Para projetos que se movem entre diferentes versões ou configurações do Office, converta o código early-bound para late binding. Como limpeza final, exporte e reimporte todos os módulos para remover metadados corrompidos. A estratégia de longo prazo mais eficaz é usar late binding para qualquer referência a objetos externos, como Excel, Outlook ou File System Object.