Você vê o Erro 91 do VBA no Word: Variável de objeto ou variável With block não definida quando sua macro tenta acessar um ContentControl específico. Esse erro ocorre porque o código referencia um objeto ContentControl que não existe, não foi atribuído ou foi liberado da memória. A macro tenta usar uma variável de objeto que contém o valor Nothing, então o Word não pode executar nenhum método ou propriedade nela. Este artigo explica as causas exatas do Erro 91 com ContentControls e fornece etapas testadas para identificar, atribuir e referenciar com segurança o ContentControl alvo em seu projeto VBA.
Principais conclusões: Corrigindo o Erro 91 do VBA para objetos ContentControl
- Atribua a variável de objeto com a palavra-chave Set: Sem Set, a variável permanece Nothing e causa o Erro 91.
- Verifique se o ContentControl existe antes de acessá-lo: Confira a contagem de ActiveDocument.ContentControls ou use um índice ou título específico.
- Use associação antecipada e WithEvents explícito: Declare o objeto como tipo ContentControl para habilitar o IntelliSense e evitar variáveis não tipadas.
Por que o Erro 91 do VBA no Word ocorre ao acessar um ContentControl
O Erro 91 significa que seu código está tentando usar uma variável de objeto que não foi definida para um objeto válido. No VBA, uma variável de objeto deve ser atribuída usando a palavra-chave Set antes que você possa ler suas propriedades ou chamar seus métodos. Se você declarar uma variável como Dim cc As ContentControl mas depois escrever cc = ActiveDocument.ContentControls(1) sem a palavra-chave Set, a variável permanece Nothing. Qualquer linha subsequente como cc.Range.Text gerará o Erro 91.
Outra causa comum é referenciar um ContentControl que não existe no documento. Por exemplo, usar ContentControls(99) quando o documento contém apenas cinco controles, ou usar ContentControls("NomeQueNaoExiste"). O índice ou título deve corresponder exatamente a um controle existente. Uma terceira causa é que o objeto ContentControl foi excluído ou a coleção do documento foi modificada entre o momento em que você atribuiu a variável e o momento em que a usa. Isso pode acontecer quando uma macro percorre controles e remove um, deixando a referência inválida.
Etapas para diagnosticar e corrigir o erro de variável de objeto
Siga estas etapas para corrigir o código VBA e eliminar o Erro 91 ao trabalhar com ContentControls. As etapas pressupõem que você tenha o Editor do Visual Basic aberto com a macro que produz o erro.
- Adicione a palavra-chave Set à atribuição do objeto
Localize a linha onde você atribui o ContentControl a uma variável. Alterecc = ActiveDocument.ContentControls(1)paraSet cc = ActiveDocument.ContentControls(1). A palavra-chave Set é obrigatória para todas as atribuições de objeto no VBA. Sem ela, a variável permanece Nothing. - Verifique se o índice ou título do ContentControl existe
Antes de acessar um ContentControl específico, verifique se ele existe. Use a propriedade Count:If ActiveDocument.ContentControls.Count >= 1 Then Set cc = ActiveDocument.ContentControls(1). Para acesso baseado em título, use um loop:For Each cc In ActiveDocument.ContentControls: If cc.Title = "MeuTitulo" Then Exit For: Next. Isso evita codificar um índice que pode mudar. - Declare a variável com o tipo de objeto correto
UseDim cc As ContentControlem vez deDim cc As ObjectouDim cc. A associação antecipada fornece IntelliSense e detecta incompatibilidades de tipo em tempo de compilação. Se a referência à biblioteca de objetos do Word estiver faltando, vá em Ferramentas > Referências e marque “Microsoft Word 16.0 Object Library”. - Certifique-se de que o documento seja o documento ativo
Se sua macro for executada em um documento que não é a janela ativa, useDocuments("SeuDocumento.docx")em vez deActiveDocument. Atribua o objeto de documento a uma variável primeiro:Dim doc As Document: Set doc = Documents("SeuDocumento.docx"). Em seguida, usedoc.ContentControls. - Teste a macro passo a passo com a janela Locais
Pressione F8 para percorrer o código linha por linha. Abra Exibir > Janela Locais. Observe o valor da sua variável ContentControl. Se mostrar “Nothing” quando você chegar a uma linha que a acessa, você tem um problema de atribuição ou existência. Corrija a linha que deveria definir a variável. - Use tratamento de erros para capturar a falha de forma elegante
Adicione um On Error Resume Next antes da linha problemática e, em seguida, verifique se a variável é Nothing depois. Exemplo:On Error Resume Next: Set cc = ActiveDocument.ContentControls(99): If cc Is Nothing Then MsgBox "Controle não encontrado.": Exit Sub: On Error GoTo 0. Isso impede que a macro trave e informa exatamente qual controle está faltando.
Se o Word ainda tiver problemas após a correção principal
Erro 91 aparece após excluir um ContentControl na mesma macro
Quando você exclui um ContentControl do documento usando cc.Delete, a variável de objeto se torna inválida. Qualquer referência subsequente a essa variável aciona o Erro 91. A correção é definir a variável como Nothing após a exclusão e evitar usar a mesma variável novamente. Exemplo: cc.Delete: Set cc = Nothing. Se você precisar trabalhar com outro controle, atribua um novo objeto à variável usando Set.
Erro 91 ao percorrer ContentControls por índice
Se você excluir controles dentro de um loop For que usa um número de índice, a coleção encolhe e o ponteiro do índice se torna incorreto. Por exemplo, excluir o controle 3 desloca o controle 4 para a posição 3. O loop então pula o novo controle 3. Isso pode causar um erro de índice fora do intervalo ou Erro 91 se o loop continuar além do último controle. A solução é percorrer de trás para frente: For i = ActiveDocument.ContentControls.Count To 1 Step -1. Dessa forma, as exclusões não afetam os índices dos controles restantes.
Erro 91 quando o documento está protegido
Se o documento tiver restrições de edição, sua macro pode não conseguir acessar a coleção ContentControls. Verifique se ActiveDocument.ProtectionType não é wdAllowOnlyFormFields ou wdAllowOnlyComments. Para acessar ContentControls em um documento protegido, você deve desprotegê-lo primeiro: If ActiveDocument.ProtectionType <> wdNoProtection Then ActiveDocument.Unprotect. Após fazer alterações, você pode reaplicar a proteção com a mesma senha.
Padrões de codificação VBA que evitam o Erro 91 com ContentControls
| Padrão | Código Correto | Código Incorreto |
|---|---|---|
| Atribuição de variável | Set cc = ActiveDocument.ContentControls(1) |
cc = ActiveDocument.ContentControls(1) |
| Verificação de existência | If ActiveDocument.ContentControls.Count > 0 Then |
Sem verificação, assume que o controle existe |
| Loop com exclusão | For i = Count To 1 Step -1 |
For i = 1 To Count |
| Objeto de documento | Set doc = ActiveDocument: Set cc = doc.ContentControls(1) |
Set cc = ContentControls(1) sem referência ao documento |
Cada padrão na tabela aborda uma causa específica do Erro 91. Use a coluna de código correto como modelo para suas próprias macros.
Agora você pode identificar a linha exata que causa o Erro 91 em seu projeto VBA e corrigir a atribuição do objeto, a verificação de existência ou a referência ao documento. Em seguida, aplique a palavra-chave Set a cada atribuição de variável de objeto e adicione uma verificação de Count antes de acessar um ContentControl por índice. Para proteção avançada, escreva uma função reutilizável que retorne um ContentControl válido ou Nothing, e chame-a de qualquer macro que precise acessar um controle específico.