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.Documentspara referenciar todos os documentos abertos no momento. - Ativar vs referência direta: Evite
doc.Activatea menos que necessário; usedoc.Contentdiretamente para maior velocidade. - Tratamento de erros: Verifique
doc.Savede useOn Error Resume Nextpara ignorar documentos não salvos ou protegidos.
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.
- 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. - 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. - Declare o Procedimento Sub
DigiteSub LoopAllDocuments()e pressione Enter. O editor adiciona automaticamente a linhaEnd Sub. - Declare a Variável de Documento
Dentro do sub, digiteDim doc As Document. Esta variável armazenará cada documento aberto um de cada vez. - Escreva o Loop For Each
DigiteFor Each doc In Application.Documents. Isso inicia o loop. Pressione Enter e digite o código que será executado para cada documento. - Adicione Ações Dentro do Loop
DigiteMsgBox doc.Name & " tem " & doc.Paragraphs.Count & " parágrafos.". Esta linha exibe o nome do documento e a contagem de parágrafos. - Feche o Loop
DigiteNext doc. Isso informa ao VBA para passar para o próximo documento na coleção. - 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.
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.