Você tem um documento do Word com bookmarks que não estão visíveis na caixa de diálogo padrão de Bookmarks ou no corpo do documento. Esses bookmarks ocultos podem estar em cabeçalhos, rodapés, caixas de texto, comentários ou outros story ranges. A coleção padrão ActiveDocument.Bookmarks cobre apenas o story principal. Para acessar todos os bookmarks, você deve usar VBA para iterar por todos os story ranges do documento. Este artigo explica como escrever uma macro VBA que percorre todos os story ranges e recupera cada bookmark, incluindo aqueles em partes ocultas do documento.
Principais Conclusões: Iterar Todos os Bookmarks do Word em VBA
- Enumeração ActiveDocument.StoryRanges: Percorre todos os 11 tipos de story, incluindo cabeçalhos, rodapés e caixas de texto, para acessar bookmarks ocultos.
- Coleção Range.Bookmarks: Cada story range tem sua própria coleção de Bookmarks que pode conter bookmarks invisíveis no documento principal.
- Constantes StoryType (wdMainTextStory, wdPrimaryHeaderStory, etc.): Identificam a qual story range um bookmark pertence durante a iteração.
Por Que a Iteração Padrão de Bookmarks Perde Bookmarks Ocultos
O Word armazena conteúdo em múltiplos story ranges. O corpo principal do documento é um story. Cabeçalhos, rodapés, notas de rodapé, notas de fim, comentários, caixas de texto e outros contêineres são stories separados. A propriedade ActiveDocument.Bookmarks retorna apenas bookmarks no story principal. Bookmarks colocados em um cabeçalho, rodapé ou caixa de texto não estão visíveis ali. Para encontrá-los, você deve acessar cada story range individualmente.
Uma causa comum de bookmarks ausentes é usar a caixa de diálogo Inserir Bookmark enquanto o ponto de inserção está dentro de um cabeçalho ou rodapé. O Word cria o bookmark naquele story range, não no documento principal. O bookmark ainda existe, mas está oculto da lista padrão de bookmarks. O VBA pode alcançá-lo iterando todos os story ranges.
Outro cenário são bookmarks dentro de uma tela de desenho ou uma caixa de texto ancorada a um parágrafo. Esses bookmarks pertencem ao story range da caixa de texto, não ao documento principal. Somente enumerando os story ranges você pode capturá-los.
Escrevendo uma Macro VBA para Iterar Todos os Bookmarks em Todos os Story Ranges
Você precisa de uma macro VBA que percorra cada story range no documento e depois percorra os bookmarks em cada range. A macro abaixo imprime os nomes dos bookmarks e seu tipo de story na janela Immediate. Você pode modificá-la para realizar outras ações, como excluir, contar ou copiar bookmarks.
Passo 1: Abrir o Editor VBA e Inserir um Módulo
- Abrir o Editor Visual Basic
Pressione Alt + F11 no Word para abrir o editor VBA. - Inserir um novo módulo
No Project Explorer, clique com o botão direito no nome do seu documento ou Normal.dotm, escolha Inserir e depois Módulo. Uma janela de código em branco aparece.
Passo 2: Colar a Macro para Iterar Todos os Bookmarks
- Copiar o código da macro
Copie o seguinte código VBA para o módulo:Sub ListAllBookmarksAllStories() Dim rngStory As Range Dim bmk As Bookmark Dim storyType As String For Each rngStory In ActiveDocument.StoryRanges Select Case rngStory.StoryType Case wdMainTextStory: storyType = "Documento Principal" Case wdPrimaryHeaderStory: storyType = "Cabeçalho Primário" Case wdFirstPageHeaderStory: storyType = "Cabeçalho da Primeira Página" Case wdEvenPagesHeaderStory: storyType = "Cabeçalho de Páginas Pares" Case wdPrimaryFooterStory: storyType = "Rodapé Primário" Case wdFirstPageFooterStory: storyType = "Rodapé da Primeira Página" Case wdEvenPagesFooterStory: storyType = "Rodapé de Páginas Pares" Case wdFootnotesStory: storyType = "Notas de Rodapé" Case wdEndnotesStory: storyType = "Notas de Fim" Case wdCommentsStory: storyType = "Comentários" Case wdTextFrameStory: storyType = "Caixas de Texto / Frames" Case Else: storyType = "Outro" End Select For Each bmk In rngStory.Bookmarks Debug.Print storyType & ": " & bmk.Name Next bmk Next rngStory End Sub - Executar a macro
Pressione F5 ou clique em Executar na barra de ferramentas. Vá para a janela Immediate (Ctrl + G) para ver a lista de todos os bookmarks com seu tipo de story.
Passo 3: Modificar a Macro para Outras Ações
Para excluir todos os bookmarks em partes ocultas, substitua a linha Debug.Print por bmk.Delete. Para contá-los, incremente uma variável contadora. Para copiar nomes de bookmarks para um novo documento, colete-os em um array de strings e escreva-os em um documento separado.
Problemas Comuns ao Iterar Bookmarks Ocultos
A Macro Não Mostra Nenhum Bookmark Mesmo Sabendo que Eles Existem
A causa mais provável é que o bookmark está dentro de uma caixa de texto vinculada ou uma forma agrupada. A coleção StoryRanges do Word não inclui cadeias de caixas de texto vinculadas além da primeira. Para alcançar bookmarks em caixas de texto vinculadas, você deve seguir a propriedade NextStoryRange do story range da caixa de texto. Adicione um loop que verifique rngStory.NextStoryRange até que retorne Nothing.
Bookmarks em Comentários Não São Listados
Comentários têm seu próprio story range wdCommentsStory. A macro acima o inclui. Se você ainda não vir bookmarks de comentários, certifique-se de que o comentário não está dentro de um contêiner aninhado, como uma caixa de texto colocada no comentário. Execute a macro novamente após selecionar a área de comentário e verificar o tipo de story na janela Immediate.
A Macro Retorna Nomes de Bookmarks Duplicados
O Word permite que o mesmo nome de bookmark exista em diferentes story ranges. A caixa de diálogo padrão de Bookmarks mostra apenas o bookmark do story principal. Quando você itera todos os stories, obtém cada ocorrência. Para desduplicar, use um objeto Collection ou Dictionary para armazenar nomes e pular duplicatas.
Story Ranges do Word vs Caixa de Diálogo de Bookmarks: O Que Cada Um Captura
| Item | ActiveDocument.Bookmarks | Enumeração StoryRanges |
|---|---|---|
| Corpo do documento principal | Sim | Sim |
| Cabeçalhos e rodapés (todos os tipos) | Não | Sim |
| Notas de rodapé e notas de fim | Não | Sim |
| Comentários | Não | Sim |
| Caixas de texto e frames (primeiro na cadeia) | Não | Sim |
| Caixas de texto vinculadas além da primeira | Não | Não (requer NextStoryRange) |
| Formas em tela de desenho | Não | Não (use a coleção CanvasShapes) |
A caixa de diálogo padrão de Bookmarks retorna apenas a primeira linha. A enumeração StoryRanges cobre a maioria das áreas ocultas, mas não caixas de texto vinculadas além da primeira ou formas em tela de desenho. Para essas, você precisa de código VBA adicional usando as coleções CanvasShapes ou InlineShapes.
Agora você pode escrever uma macro VBA que itera todos os bookmarks em um documento do Word, incluindo aqueles em cabeçalhos, rodapés, caixas de texto, comentários e outras partes ocultas. A chave é usar ActiveDocument.StoryRanges e verificar a coleção Bookmarks de cada range. Para caixas de texto vinculadas, estenda o loop com NextStoryRange. Como próximo passo, modifique a macro para exportar todos os nomes de bookmarks e seus tipos de story para uma tabela em um novo documento para auditoria. Uma dica avançada: use a constante wdTextFrameStory combinada com um loop Do While em NextStoryRange para capturar bookmarks em caixas de texto encadeadas que a enumeração básica não captura.