Como Percorrer Todos os Documentos Abertos do Word no VBA
🔍 WiseChecker

Como Percorrer Todos os Documentos Abertos do Word no VBA

Se você trabalha com vários documentos do Word ao mesmo tempo, pode precisar aplicar a mesma formatação, extrair dados ou executar uma macro em todos os arquivos abertos. Alternar manualmente entre documentos e repetir a mesma ação perde tempo e introduz erros. Macros VBA podem automatizar essa tarefa percorrendo a coleção Documents. Este artigo explica como usar o loop For Each com o objeto Documents para processar todos os documentos abertos no Word. Você aprenderá a sintaxe, um exemplo prático e o que observar ao escrever essas macros.

Principais Conclusões: Percorrer Documentos Abertos do Word no VBA

  • Coleção Documents: Use For Each doc In Application.Documents para referenciar todos os documentos abertos no momento.
  • Ativar vs referência direta: Evite doc.Activate a menos que necessário; use doc.Content diretamente para maior velocidade.
  • Tratamento de erros: Verifique doc.Saved e use On Error Resume Next para ignorar documentos não salvos ou protegidos.

ADVERTISEMENT

Entendendo a Coleção Documents no VBA do Word

O VBA do Word armazena cada documento aberto na coleção Documents. Essa coleção faz parte do objeto Application. Cada documento na coleção é um objeto Document. A coleção é baseada em zero ou um, dependendo de como você a acessa, mas o loop For Each lida com isso automaticamente. Você não precisa saber o número do índice. O loop é executado uma vez para cada documento aberto, incluindo novos documentos em branco que não foram salvos.

Pré-requisitos para Usar Esta Macro

Antes de escrever a macro, você deve ter a guia Desenvolvedor visível no Word. Para habilitar a guia Desenvolvedor, vá em Arquivo > Opções > Personalizar Faixa de Opções e marque Desenvolvedor na coluna da direita. Você também precisa de familiaridade básica com o editor VBA. Pressione Alt+F11 para abrir o editor. Insira um novo módulo clicando em Inserir > Módulo. Todo o código deste artigo vai em um módulo padrão.

Estrutura Básica do Loop

O loop principal usa a palavra-chave For Each. A variável doc é declarada como um objeto Document. O loop itera sobre Application.Documents. Dentro do loop, você pode ler ou modificar propriedades de doc. A macro termina quando o último documento é processado.

Passos para Escrever um Loop que Processa Todos os Documentos Abertos

Siga estes passos para criar uma macro VBA que percorre todos os documentos abertos no Word. O exemplo de macro conta o número de parágrafos em cada documento e exibe o resultado em uma caixa de mensagem.

  1. Abra o Editor VBA
    Pressione Alt+F11 no Word. O editor Visual Basic for Applications é aberto. Se o Project Explorer não estiver visível, pressione Ctrl+R para exibi-lo.
  2. Insira um Novo Módulo
    No Project Explorer, clique com o botão direito em Normal ou em seu projeto atual e clique em Inserir > Módulo. Uma janela de código em branco aparece.
  3. Declare o Procedimento Sub
    Digite Sub LoopAllDocuments() e pressione Enter. O editor adiciona automaticamente a linha End Sub.
  4. Declare a Variável de Documento
    Dentro do sub, digite Dim doc As Document. Esta variável armazenará cada documento aberto um de cada vez.
  5. Escreva o Loop For Each
    Digite For Each doc In Application.Documents. Isso inicia o loop. Pressione Enter e digite o código que será executado para cada documento.
  6. Adicione Ações Dentro do Loop
    Digite MsgBox doc.Name & " tem " & doc.Paragraphs.Count & " parágrafos.". Esta linha exibe o nome do documento e a contagem de parágrafos.
  7. Feche o Loop
    Digite Next doc. Isso informa ao VBA para passar para o próximo documento na coleção.
  8. Execute a Macro
    Pressione F5 enquanto o cursor estiver dentro do sub. O Word processa cada documento aberto e mostra uma caixa de mensagem para cada um. Clique em OK para passar para o próximo documento.

ADVERTISEMENT

Erros Comuns e Limitações ao Percorrer Documentos

Vários problemas podem causar erros ou comportamento inesperado ao executar esta macro. Entender esses problemas ajuda a escrever código robusto.

O Word Trava Quando o Loop Modifica a Coleção Documents

Se sua macro tenta fechar ou abrir um documento dentro do loop, a coleção Documents muda durante a iteração. Isso pode causar um erro de tempo de execução ou travamento. Para evitar isso, colete os nomes dos documentos em um array primeiro e depois percorra o array. Por exemplo:

Sub CloseAllExceptOne()
    Dim doc As Document
    Dim docNames() As String
    Dim i As Integer
    
    ReDim docNames(Application.Documents.Count - 1)
    i = 0
    For Each doc In Application.Documents
        docNames(i) = doc.Name
        i = i + 1
    Next doc
    
    For i = LBound(docNames) To UBound(docNames)
        If docNames(i) <> "KeepMe.docx" Then
            Documents(docNames(i)).Close SaveChanges:=wdDoNotSaveChanges
        End If
    Next i
End Sub

O Loop Falha Quando um Documento Está Protegido ou Somente Leitura

Um documento com restrições de edição pode gerar um erro se a macro tentar modificar seu conteúdo. Use On Error Resume Next antes da modificação e verifique Err.Number depois. Alternativamente, verifique a propriedade ProtectionType do documento. Se doc.ProtectionType <> wdNoProtection, pule esse documento ou desproteja-o com uma senha conhecida.

A Macro Fica Lenta com Muitos Documentos Abertos

Ativar cada documento com doc.Activate dentro do loop torna a macro significativamente mais lenta. O Word precisa redesenhar a tela a cada troca de documento. Defina Application.ScreenUpdating = False no início da macro e restaure para True no final. Defina também Application.DisplayAlerts = False para suprimir avisos.

Métodos de Loop VBA: For Each vs For Index

Item For Each doc In Documents For i = 1 To Documents.Count
Sintaxe Mais simples, sem necessidade de índice Requer variável de índice e acesso manual
Velocidade Mais rápido para a maioria das operações Ligeiramente mais lento devido à busca por índice
Segurança com exclusão Quebra se documentos forem removidos durante o loop Deve ajustar o índice ou fazer loop reverso
Legibilidade Claro e autodocumentado Mais verboso
Caso de uso Operações somente leitura ou modificações Quando você precisa fechar ou excluir documentos

Agora você pode escrever uma macro VBA que percorre todos os documentos abertos do Word e aplica qualquer ação necessária. Comece com o loop For Each simples para ler dados. Para operações que alteram a coleção de documentos, use o loop baseado em índice com um array. Sempre desative a atualização de tela e os alertas para melhorar o desempenho. Como dica avançada, combine o loop com uma instrução Select Case interna para aplicar lógica diferente com base no nome do documento ou tipo de conteúdo.

ADVERTISEMENT