Como Percorrer Todas as Abas de um Arquivo com VBA no Excel

Para percorrer todas as abas de um arquivo com VBA, use um loop For Each na coleção Worksheets da pasta de trabalho, assim: For Each ws In ThisWorkbook.Worksheets — dentro do loop, a variável ws representa a planilha atual a cada repetição, permitindo ler, formatar ou somar dados de cada aba automaticamente.

Você já precisou repetir a mesma tarefa em várias abas de uma pasta de trabalho — somar uma coluna, formatar um cabeçalho, extrair um total — e foi clicando aba por aba, copiando e colando a mesma fórmula ou o mesmo formato em cada uma delas?

Esse trabalho manual não é só cansativo: em arquivos com dez, vinte ou mais planilhas (uma por mês, uma por filial, uma por vendedor), o risco de esquecer uma aba ou aplicar a fórmula errada em uma delas cresce junto com o número de abas, e revisar tudo depois consome ainda mais tempo do que o trabalho original.

Neste artigo iremos mostrar como usar o VBA para percorrer automaticamente todas as abas de uma pasta de trabalho, com um exemplo completo de consolidação de dados de várias planilhas mensais em uma única aba de resumo.

DOMINE EXCEL COMIGO

QUERO APRENDER EXCEL

A coleção Worksheets e o loop For Each

Toda pasta de trabalho do Excel guarda suas planilhas numa coleção chamada Worksheets. Para acessar uma planilha específica você normalmente escreve Worksheets("Janeiro"), mas quando o objetivo é repetir uma ação em todas as abas, sem precisar saber os nomes ou a quantidade exata de antemão, o loop For Each é a ferramenta certa:

Sub ListarTodasAsAbas()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        Debug.Print ws.Name
    Next ws
End Sub

A cada repetição, a variável ws (declarada como Worksheet) passa a representar uma planilha diferente, na ordem em que as abas aparecem na parte inferior do Excel. O código acima simplesmente imprime o nome de cada aba na Janela Imediata do editor VBA (Exibir > Janela Imediata, ou Ctrl+G), mas qualquer instrução que funcione com uma planilha específica também funciona dentro do loop, agora repetida automaticamente para todas.

Worksheets x Sheets: use Worksheets quando quiser garantir que está lidando apenas com planilhas comuns. A coleção Sheets também inclui planilhas de gráfico (chart sheets), o que raramente é o que você precisa num loop de dados.

Pulando abas específicas dentro do loop

É comum que uma pasta de trabalho tenha uma aba de resumo, painel ou capa que não deve entrar no processamento junto com as demais. Para isso, basta um If comparando o nome da aba atual:

Sub PercorrerIgnorandoUmaAba()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "Resumo" Then
            Debug.Print "Processando: " & ws.Name
        End If
    Next ws
End Sub

Essa verificação evita, por exemplo, que a macro tente somar a própria aba de resumo junto com as abas de dados originais, o que geraria um total duplicado.

Exemplo prático: consolidando o total de várias abas mensais

Imagine uma pasta de trabalho de controle de vendas com uma aba para cada mês — Janeiro, Fevereiro e Março — cada uma com datas na coluna A e valores de venda na coluna B, começando na linha 2. O objetivo é gerar automaticamente, numa aba Resumo, uma lista com o nome de cada mês e o total vendido naquele mês.

Veja como ficam os dados de exemplo na aba “Janeiro”:

Data Valor
05/01/2026 R$ 1.250,00
12/01/2026 R$ 890,00
28/01/2026 R$ 2.430,00

A macro abaixo percorre todas as abas da pasta de trabalho, ignora a própria aba “Resumo”, encontra a última linha com dados de cada planilha (que pode variar de uma aba para outra) e grava o nome da aba e o total somado numa linha da planilha Resumo:

Sub SomarTodasAsAbas()
    Dim ws As Worksheet
    Dim ultimaLinha As Long
    Dim total As Double
    Dim linhaResumo As Long

    linhaResumo = 2
    ThisWorkbook.Worksheets("Resumo").Range("A2:B100").ClearContents

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "Resumo" Then
            ultimaLinha = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
            If ultimaLinha >= 2 Then
                total = Application.WorksheetFunction.Sum(ws.Range("B2:B" & ultimaLinha))
            Else
                total = 0
            End If
            ThisWorkbook.Worksheets("Resumo").Cells(linhaResumo, 1).Value = ws.Name
            ThisWorkbook.Worksheets("Resumo").Cells(linhaResumo, 2).Value = total
            linhaResumo = linhaResumo + 1
        End If
    Next ws

    MsgBox "Resumo atualizado com " & (linhaResumo - 2) & " abas."
End Sub

Repare que ws.Cells(ws.Rows.Count, "B").End(xlUp).Row descobre a última linha com dados daquela planilha específica a cada repetição do loop — como cada mês pode ter uma quantidade diferente de vendas, essa linha não pode ser fixa, precisa ser recalculada para cada aba. O resultado gerado na aba Resumo fica assim:

Mês Total
Janeiro R$ 4.570,00
Fevereiro R$ 5.120,00
Março R$ 3.980,00

Usando o índice das abas em vez do For Each

Existe também a opção de percorrer as abas pelo número da posição, usando um loop For tradicional com o índice de 1 até Worksheets.Count:

Sub PercorrerPorIndice()
    Dim i As Integer
    For i = 1 To Worksheets.Count
        Debug.Print Worksheets(i).Name
    Next i
End Sub

Essa forma é útil quando você precisa saber a posição da aba durante o processamento (por exemplo, para comparar a aba atual com a anterior), mas para a grande maioria dos casos o For Each é mais direto e menos propenso a erro, já que você não precisa se preocupar em atualizar um contador manualmente.

Disponibilidade

VBA e a coleção Worksheets estão disponíveis no Excel para Windows a partir da versão 2007, incluindo Excel 2010, 2013, 2016, 2019, 2021 e Excel 365, e também no Excel para Mac (desde que o arquivo seja salvo como .xlsm, com macros habilitadas). O Excel Online (versão web) não suporta a execução de macros VBA. O Google Sheets não tem VBA, mas tem um recurso equivalente para esse tipo de automação usando Apps Script, com uma sintaxe totalmente diferente (JavaScript), percorrendo as abas com SpreadsheetApp.getActiveSpreadsheet().getSheets().

Perguntas frequentes

Qual a diferença entre percorrer com For Each Worksheets e com Sheets?

Worksheets contém apenas planilhas comuns (com células e dados). Sheets inclui também planilhas de gráfico (chart sheets), que raramente entram num processamento de dados. Na dúvida, use Worksheets para evitar erros ao tentar acessar células numa aba que na verdade é um gráfico.

Como faço para pular a primeira aba, tipo uma capa, no loop?

Adicione um teste de If dentro do loop comparando ws.Name com o nome da aba que deve ser ignorada (como no exemplo If ws.Name <> “Resumo” Then), ou compare a posição usando ws.Index <> 1 se quiser pular sempre a primeira aba, independente do nome dela.

O loop For Each processa as abas ocultas também?

Sim. O For Each em Worksheets percorre todas as planilhas da pasta de trabalho, estejam elas visíveis ou ocultas. Se quiser processar só as abas visíveis, adicione a condição If ws.Visible = xlSheetVisible Then dentro do loop.

Veja também: Como Usar Loops no VBA do Excel: For, For Each e Do While (aquele artigo é uma introdução geral aos três tipos de loop do VBA; este aqui foca especificamente em percorrer todas as abas de uma pasta de trabalho, com um exemplo completo de consolidação de dados entre planilhas) e Como Manipular Planilhas e Pastas de Trabalho com VBA no Excel.

Compartilhe ou Comente

Se você curtiu esse artigo aonde mostramos como usar o loop For Each para percorrer todas as abas de uma pasta de trabalho com VBA, consolidando dados de várias planilhas mensais numa única aba de resumo, compartilhe com as suas redes sociais e não se esqueça de deixar um comentário aqui embaixo caso você tenha ficado com alguma dúvida.

Sua pasta de trabalho tem muitas abas repetitivas que você processa manualmente uma por uma? Já pensou em quanto tempo economizaria automatizando isso? Conta para nós nos comentários!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *