Como Iterar Todos os Bookmarks do Word com VBA Incluindo Partes Ocultas do Documento
🔍 WiseChecker

Como Iterar Todos os Bookmarks do Word com VBA Incluindo Partes Ocultas do Documento

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.

ADVERTISEMENT

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

  1. Abrir o Editor Visual Basic
    Pressione Alt + F11 no Word para abrir o editor VBA.
  2. 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

  1. 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
    
  2. 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.

ADVERTISEMENT

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.

ADVERTISEMENT