Você precisa adicionar bookmarks a um documento do Word sem clicar na guia Inserir toda vez. Bookmarks permitem marcar locais ou intervalos de texto para navegação rápida, referência cruzada ou atualização com códigos de campo. Este artigo explica como usar VBA para adicionar bookmarks programaticamente, abordando os objetos essenciais, métodos e armadilhas comuns. Ao final, você será capaz de escrever uma macro que insere um bookmark, nomeia corretamente e verifica se foi criado.
Principais Conclusões: Adicionar Bookmarks com VBA
- ActiveDocument.Bookmarks.Add Name:=”MeuBookmark”, Range:=Selection.Range: Cria um bookmark na posição atual do cursor ou no texto selecionado.
- Nomes de bookmark não podem conter espaços nem começar com número: Use sublinhados ou camelCase para evitar o erro de runtime 5941.
- Verifique se um bookmark existe antes de adicioná-lo: Use um loop For Each ou uma função auxiliar para evitar erros de nome duplicado.
- Use objetos Range em vez de Selection: Execução mais rápida e sem oscilação de tela ao adicionar bookmarks programaticamente.
- Bookmarks persistem ao salvar e fechar: Eles permanecem como parte do documento, a menos que sejam excluídos explicitamente.
Entendendo o Modelo de Objeto Bookmark do VBA
No VBA do Word, um bookmark é representado pelo objeto Bookmark. Todos os bookmarks de um documento pertencem à coleção Bookmarks, acessada via ActiveDocument.Bookmarks. A coleção oferece suporte para adicionar, excluir e contar bookmarks. Cada bookmark tem uma propriedade Name (uma string) e uma propriedade Range que retorna o objeto Range coberto pelo bookmark.
Um bookmark pode cobrir um único ponto (range colapsado) ou um bloco de texto. Ao adicionar um bookmark, você fornece um nome e um objeto Range. Se omitir o parâmetro Range, o Word adiciona o bookmark no ponto de inserção. O nome deve ser único no documento; nomes duplicados causam o erro de runtime 5941.
Nomes Válidos de Bookmark
Os nomes de bookmark seguem estas regras:
- Devem começar com uma letra ou sublinhado
- Podem conter letras, dígitos e sublinhados
- Não podem conter espaços, hífens ou pontuação
- Comprimento máximo de 40 caracteres
- Não diferenciam maiúsculas/minúsculas: “MeuBM” e “meubm” são tratados como o mesmo nome
Se você violar essas regras, o método Add gera um erro. Use uma rotina de validação ou sanitize a entrada do usuário antes de chamar Add.
Passos para Adicionar um Bookmark Usando VBA
Estes passos assumem que você tem o Editor do Visual Basic aberto (Alt+F11) e um módulo inserido. Você pode escrever a macro em qualquer módulo ou no painel de código do ThisDocument.
- Abra o Editor VBA
Pressione Alt+F11 no Word para abrir o Editor do Visual Basic. No Explorador de Projetos, expanda o projeto que contém o documento alvo. Clique com o botão direito em qualquer módulo ou no objeto ThisDocument e escolha Inserir > Módulo para criar um novo módulo de código. - Declare uma variável Range e defina-a
Use um objeto Range para definir onde o bookmark será inserido. Por exemplo:Dim rng As Range
Set rng = ActiveDocument.Range(Start:=0, End:=100)
Isso cria um range cobrindo os primeiros 100 caracteres. Para usar a seleção atual, useSet rng = Selection.Range. - Chame o método Bookmarks.Add
Escreva a linha que cria o bookmark:ActiveDocument.Bookmarks.Add Name:="SecaoA", Range:=rng
O parâmetro Name é obrigatório. O parâmetro Range é opcional; se omitido, o bookmark é colocado no ponto de inserção. - Verifique se o bookmark foi adicionado
Use o método Exists para confirmar:If ActiveDocument.Bookmarks.Exists("SecaoA") Then
MsgBox "Bookmark criado."
End If
Isso evita erros ao tentar acessar um bookmark que não existe. - Lide com nomes duplicados
Antes de adicionar um bookmark, verifique se o nome já existe. Exclua o bookmark antigo primeiro ou gere um nome único:Dim bmNome As String
bmNome = "MeuBM"
If ActiveDocument.Bookmarks.Exists(bmNome) Then
ActiveDocument.Bookmarks(bmNome).Delete
End If
ActiveDocument.Bookmarks.Add Name:=bmNome, Range:=rng
Exemplo Completo de Macro
Coloque esta macro em um módulo padrão. Ela adiciona um bookmark chamado “InicioDoc” no início do documento ativo.
Sub AdicionarBookmarkNoInicio()
Dim rng As Range
Set rng = ActiveDocument.Range(Start:=0, End:=0) ' range colapsado na posição 0
If ActiveDocument.Bookmarks.Exists("InicioDoc") Then
ActiveDocument.Bookmarks("InicioDoc").Delete
End If
ActiveDocument.Bookmarks.Add Name:="InicioDoc", Range:=rng
MsgBox "Bookmark 'InicioDoc' adicionado no início do documento."
End Sub
Problemas Comuns ao Adicionar Bookmarks com VBA
“Erro de runtime 5941: O nome do bookmark é inválido”
Esse erro ocorre quando o nome contém espaço, começa com dígito ou excede 40 caracteres. Também ocorre se você tentar adicionar um bookmark com um nome que já existe. Solução: sanitize os nomes com uma função que substitui espaços por sublinhados e trunca para 40 caracteres. Sempre verifique Exists antes de adicionar.
Bookmark desaparece após salvar e reabrir
Isso acontece quando o bookmark está dentro de um parágrafo que é excluído ou quando o documento é salvo em um formato que não suporta bookmarks (como .txt). Solução: salve como .docx ou .docm. Verifique também se o objeto Range aponta para um local estável. Bookmarks ancorados em conteúdo removido são perdidos silenciosamente.
Bookmark cobre o texto errado
O objeto Range passado para Add define a extensão do bookmark. Se você usar um range colapsado (início = fim), o bookmark marca um ponto. Se usar um range com comprimento maior que zero, o bookmark cobre aquele texto. Solução: verifique as propriedades Start e End do seu Range antes de chamar Add. Use Debug.Print rng.Start, rng.End na janela Imediato para inspecionar.
Métodos de Bookmark no VBA: Add vs Delete vs Exists
| Método | Sintaxe | Comportamento |
|---|---|---|
| Add | Bookmarks.Add Name, Range | Cria um novo bookmark. Retorna um objeto Bookmark. Gera erro se o nome for inválido ou duplicado |
| Delete | Bookmarks(nome).Delete | Remove o bookmark, mas preserva o texto. Gera erro se o bookmark não existir |
| Exists | Bookmarks.Exists(nome) | Retorna True se um bookmark com esse nome existir, False caso contrário. Sem erro se não existir |
Trabalhando com Range vs Selection
Ao adicionar um bookmark, você pode usar Selection.Range ou um objeto Range definido diretamente. Ambos funcionam, mas Range é mais rápido e não move o cursor. Selection exige que o usuário tenha o ponto de inserção no lugar certo. Para automação programática, sempre use objetos Range explícitos.
Para marcar um parágrafo específico, use a coleção Paragraphs:
Sub BookmarkPrimeiroParagrafo()
Dim rng As Range
Set rng = ActiveDocument.Paragraphs(1).Range
rng.End = rng.End - 1 ' excluir a marca de parágrafo
ActiveDocument.Bookmarks.Add Name:="PrimeiroPara", Range:=rng
End Sub
Conclusão
Agora você pode adicionar bookmarks programaticamente usando o método Bookmarks.Add com um nome válido e um objeto Range. Sempre verifique bookmarks existentes com Exists antes de adicionar para evitar erros de runtime. Use objetos Range explícitos em vez de Selection para automação confiável. Para uso avançado, explore o método Bookmark.Select para navegar até um bookmark ou o método Fields.Add para inserir um campo de referência cruzada que aponte para o novo bookmark.