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.

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

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

- Faça uma cópia de segurança da planilha antes do primeiro teste.
- Pressione Alt + F11 para abrir o editor do VBA.
- No menu, clique em Inserir › Módulo.
- Cole o código no módulo em branco e feche o editor.
- De volta à planilha, pressione Alt + F8, selecione
JuntarAbase clique em Executar. - 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
1deCells(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, troqueThisWorkbookporActiveWorkbook.
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.