Como juntar várias abas em uma só no Excel com VBA (macro pronta)

Vendas de cada mês numa aba, uma aba por filial, uma por vendedor: para montar um relatório ou uma tabela dinâmica, você precisa de tudo junto. Copiar e colar aba por aba funciona uma vez, mas vira retrabalho todo mês. Com uma macro, dá para juntar várias abas em uma só com VBA num clique, e ainda saber de qual aba veio cada linha.

Neste tutorial você vai receber o código pronto, entender cada parte dele e aprender a instalar e executar a macro, mesmo que nunca tenha usado o editor VBA.

O que a macro faz

  • Cria uma aba chamada Consolidado no final da pasta de trabalho (ou limpa a que já existe).
  • Copia o cabeçalho da primeira aba uma única vez.
  • Percorre todas as outras abas e copia os dados abaixo do cabeçalho, um bloco embaixo do outro.
  • Acrescenta a coluna Origem, com o nome da aba de onde veio cada linha.
  • Ignora abas que só têm o cabeçalho.

Pode rodar quantas vezes quiser: a aba Consolidado é refeita do zero a cada execução, sem duplicar dados.

Exemplo: vendas de janeiro a abril

Nos exemplos, cada mês está numa aba com as mesmas colunas: Data, Cliente, Produto e Valor. A aba Abril ainda não tem lançamentos, só o cabeçalho.

Três abas de vendas, Janeiro, Fevereiro e Março, cada uma com colunas Data, Cliente, Produto e Valor
Antes: cada mês em uma aba (dados fictícios).

Depois de rodar a macro, a aba Consolidado reúne as 9 vendas das três abas, com a origem de cada uma:

Aba Consolidado com as 9 vendas das três abas juntas e a coluna Origem indicando o mês de cada linha
Depois: a aba Consolidado criada pela macro, com a coluna Origem.

O código da macro

Option Explicit

Sub JuntarAbas()
    Const NOME_DESTINO As String = "Consolidado"
    Dim wsDestino As Worksheet
    Dim ws As Worksheet
    Dim ultimaLinha As Long
    Dim ultimaColuna As Long
    Dim proximaLinha As Long
    Dim qtdLinhas As Long
    Dim totalAbas As Long

    On Error GoTo TratarErro
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual

    ' 1. Cria a aba de destino ou limpa a que já existe
    On Error Resume Next
    Set wsDestino = ThisWorkbook.Worksheets(NOME_DESTINO)
    On Error GoTo TratarErro
    If wsDestino Is Nothing Then
        Set wsDestino = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
        wsDestino.Name = NOME_DESTINO
    Else
        wsDestino.Cells.Clear
    End If

    ' 2. Copia o cabeçalho da primeira aba e acrescenta a coluna Origem
    Set ws = ThisWorkbook.Worksheets(1)
    ultimaColuna = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
    ws.Range(ws.Cells(1, 1), ws.Cells(1, ultimaColuna)).Copy wsDestino.Cells(1, 1)
    wsDestino.Cells(1, ultimaColuna + 1).Value = "Origem"
    proximaLinha = 2

    ' 3. Percorre as abas e copia os dados abaixo do cabeçalho
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> NOME_DESTINO Then
            ultimaLinha = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
            If ultimaLinha >= 2 Then
                qtdLinhas = ultimaLinha - 1
                ws.Range(ws.Cells(2, 1), ws.Cells(ultimaLinha, ultimaColuna)).Copy wsDestino.Cells(proximaLinha, 1)
                wsDestino.Range(wsDestino.Cells(proximaLinha, ultimaColuna + 1), _
                    wsDestino.Cells(proximaLinha + qtdLinhas - 1, ultimaColuna + 1)).Value = ws.Name
                proximaLinha = proximaLinha + qtdLinhas
                totalAbas = totalAbas + 1
            End If
        End If
    Next ws

    wsDestino.Columns.AutoFit
    MsgBox totalAbas & " abas juntadas, " & (proximaLinha - 2) & " linhas copiadas.", vbInformation

Sair:
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Exit Sub

TratarErro:
    MsgBox "Erro " & Err.Number & ": " & Err.Description, vbExclamation
    Resume Sair
End Sub

Como instalar e executar

Passos para instalar a macro: Alt+F11, Inserir Módulo, colar o código e executar com Alt+F8
Instalação da macro em quatro passos.
  1. Faça uma cópia de segurança da planilha antes do primeiro teste.
  2. Pressione Alt + F11 para abrir o editor do VBA.
  3. No menu, clique em Inserir › Módulo.
  4. Cole o código no módulo em branco e feche o editor.
  5. De volta à planilha, pressione Alt + F8, selecione JuntarAbas e clique em Executar.
  6. Salve o arquivo como Pasta de Trabalho Habilitada para Macro (.xlsm). No formato .xlsx o código é descartado.

Se é a primeira vez que você usa macros, veja também como criar sua primeira macro no Excel.

Entendendo o código, parte por parte

Configurações de velocidade e tratamento de erro

ScreenUpdating, EnableEvents e Calculation são desligados no início para a macro rodar rápido, sem a tela piscar a cada cópia. O bloco Sair: religa tudo no final, inclusive se acontecer um erro, graças ao On Error GoTo TratarErro. Sem isso, um erro no meio do caminho deixaria o Excel com o cálculo em modo manual.

Criar ou limpar a aba Consolidado

O trecho com On Error Resume Next tenta encontrar a aba. Se ela não existir, a macro cria uma no final da pasta. Se já existir, Cells.Clear apaga o conteúdo antigo. É isso que permite rodar a macro de novo sem duplicar linhas.

Encontrar a última linha e a última coluna

Cells(Rows.Count, 1).End(xlUp).Row parte do fim da coluna A e sobe até o último valor preenchido, o mesmo que pressionar Ctrl + ↑ no Excel. Para as colunas, End(xlToLeft) faz o mesmo na linha do cabeçalho. Assim a macro funciona com qualquer quantidade de linhas e colunas, sem intervalo fixo.

Percorrer as abas

O laço For Each ws In ThisWorkbook.Worksheets passa por todas as abas da pasta. Se as estruturas de repetição do VBA ainda não estão claras para você, veja o artigo sobre For, Do While e For Each.

Copiar os dados e marcar a origem

Range(...).Copy com o destino na mesma instrução copia valores e formatos (datas e moedas continuam formatadas). Em seguida, o nome da aba é gravado de uma vez em todas as linhas copiadas, na coluna logo depois da última. A variável proximaLinha avança para que o próximo bloco entre logo abaixo.

Cuidados e limitações

  • Todas as abas precisam ter as mesmas colunas, na mesma ordem. A macro usa o cabeçalho da primeira aba como referência.
  • A coluna A não pode ter linhas vazias no meio dos dados. A última linha é encontrada por ela. Se a sua coluna A pode ficar em branco, troque o 1 de Cells(ws.Rows.Count, 1) pelo número de uma coluna sempre preenchida.
  • Deixe a aba Consolidado depois das outras. Se ela for movida para a primeira posição, o cabeçalho deixa de ser encontrado.
  • Abas que não devem entrar: para pular uma aba de resumo ou de parâmetros, troque a condição por If ws.Name <> NOME_DESTINO And ws.Name <> "Resumo" Then.
  • Fórmulas são copiadas como fórmulas. Se os dados de origem forem fórmulas com referências relativas, elas podem apontar para outras células na aba de destino. Nesse caso, prefira copiar só os valores.
  • A macro age na pasta onde está o código (ThisWorkbook). Se você guardar a macro na Pasta de Trabalho Pessoal para usar em vários arquivos, troque ThisWorkbook por ActiveWorkbook.

E depois de juntar?

Com tudo numa aba só, a base está pronta para análise. Formate a aba Consolidado como Tabela (Ctrl+Alt+T) e use a função FILTRO para consultar por cliente ou período, ou some por critério com a função SOMASES. Se precisar copiar só um intervalo específico de uma aba para outra, veja como copiar dados entre planilhas com uma macro.

Ficou com alguma dúvida ou a sua planilha tem uma estrutura diferente? Deixe nos comentários.