Para importar todos os arquivos de uma pasta com VBA, use a função Dir() dentro de um loop Do While para listar cada arquivo da pasta, um por vez, e a instrução Workbooks.Open para abrir cada um deles e copiar os dados para uma planilha de consolidação, fechando o arquivo em seguida sem salvar.
Você já recebeu uma pasta cheia de planilhas parecidas — um arquivo por filial, um por vendedor, um por mês — e precisou juntar os dados de todas elas numa única tabela, abrindo arquivo por arquivo, copiando e colando manualmente o mesmo intervalo de células?
Esse processo é repetitivo e arriscado: além de tomar um tempo enorme quando são dezenas de arquivos, é fácil pular um arquivo sem perceber, colar os dados na linha errada, ou esquecer de atualizar a consolidação quando um novo arquivo chega na pasta no mês seguinte.
Neste artigo iremos mostrar como usar o VBA para percorrer automaticamente todos os arquivos de uma pasta, abrir cada um, copiar os dados relevantes e consolidar tudo numa única planilha, com um exemplo completo de consolidação de relatórios mensais de vendas.
A função Dir(): listando os arquivos da pasta
A função Dir() do VBA retorna o nome de um arquivo que corresponde a um padrão de busca, e a cada nova chamada de Dir (sem argumentos) ela retorna o próximo arquivo da mesma pasta, até retornar uma string vazia quando não houver mais arquivos. Esse comportamento é o que permite percorrer uma pasta inteira dentro de um loop Do While:
Sub ListarArquivosDaPasta()
Dim pasta As String
Dim arquivo As String
pasta = "C:\Relatorios\"
arquivo = Dir(pasta & "*.xlsx")
Do While arquivo <> ""
Debug.Print arquivo
arquivo = Dir
Loop
End Sub
Repare em dois detalhes importantes: o caminho da pasta precisa terminar com uma barra invertida (\), e o padrão "*.xlsx" filtra para trazer apenas arquivos com essa extensão, ignorando outros tipos de arquivo que possam estar na mesma pasta (como PDFs ou arquivos temporários do próprio Excel, que começam com ~$).
Abrindo cada arquivo e copiando os dados
Com a listagem funcionando, o próximo passo é abrir cada arquivo encontrado usando Workbooks.Open, copiar o intervalo de dados desejado para a planilha de consolidação, e fechar o arquivo de origem sem salvar (para não alterar os arquivos originais):
Workbooks.Open pasta & arquivo
' ... copiar os dados ...
Workbooks(arquivo).Close SaveChanges:=False
Como cada arquivo pode ter uma quantidade diferente de linhas preenchidas, é preciso descobrir a última linha com dados de cada arquivo individualmente antes de copiar, exatamente como acontece ao percorrer várias abas dentro de uma mesma pasta de trabalho.
Exemplo prático: consolidando relatórios mensais de vendas
Imagine uma pasta chamada C:\Relatorios\ com um arquivo para cada mês — Vendas_Janeiro.xlsx, Vendas_Fevereiro.xlsx, Vendas_Marco.xlsx — todos com a mesma estrutura: coluna A com o vendedor e coluna B com o valor vendido, a partir da linha 2 da primeira planilha do arquivo. O objetivo é juntar os dados de todos os arquivos numa aba Consolidado da pasta de trabalho principal.
Dados de exemplo no arquivo “Vendas_Janeiro.xlsx”:
| Vendedor | Valor |
|---|---|
| Ana | R$ 3.200,00 |
| Bruno | R$ 2.750,00 |
A macro completa fica assim:
Sub ImportarArquivosDaPasta()
Dim pasta As String
Dim arquivo As String
Dim wbOrigem As Workbook
Dim wsDestino As Worksheet
Dim ultimaLinhaOrigem As Long
Dim ultimaLinhaDestino As Long
pasta = "C:\Relatorios\"
Set wsDestino = ThisWorkbook.Worksheets("Consolidado")
wsDestino.Range("A2:B10000").ClearContents
Application.ScreenUpdating = False
arquivo = Dir(pasta & "*.xlsx")
Do While arquivo <> ""
Set wbOrigem = Workbooks.Open(pasta & arquivo)
ultimaLinhaOrigem = wbOrigem.Worksheets(1).Cells(wbOrigem.Worksheets(1).Rows.Count, "A").End(xlUp).Row
ultimaLinhaDestino = wsDestino.Cells(wsDestino.Rows.Count, "A").End(xlUp).Row + 1
If ultimaLinhaOrigem >= 2 Then
wbOrigem.Worksheets(1).Range("A2:B" & ultimaLinhaOrigem).Copy _
wsDestino.Cells(ultimaLinhaDestino, "A")
End If
wbOrigem.Close SaveChanges:=False
arquivo = Dir
Loop
Application.ScreenUpdating = True
MsgBox "Importação concluída!"
End Sub
O resultado na aba Consolidado junta as linhas de todos os arquivos, um atrás do outro, sem precisar abrir manualmente nenhum deles:
| Vendedor | Valor |
|---|---|
| Ana | R$ 3.200,00 |
| Bruno | R$ 2.750,00 |
| Carla | R$ 4.100,00 |
| Diego | R$ 1.980,00 |
Se quiser identificar de qual arquivo veio cada linha, basta gravar o nome do arquivo (a variável arquivo) numa coluna extra da consolidação, dentro do mesmo loop, antes de passar para o próximo arquivo.
Cuidados ao importar arquivos de uma pasta
Alguns pontos merecem atenção para essa macro funcionar de forma confiável: primeiro, o padrão "*.xlsx" não traz arquivos .xls (formato antigo) ou .xlsm (com macros) — se a pasta tiver arquivos nesses formatos, ajuste o padrão de busca ou rode o Dir mais de uma vez, uma para cada extensão. Segundo, arquivos temporários que o próprio Excel cria enquanto outro arquivo está aberto (com nome começando em ~$) podem ser pegos pelo Dir se você deixar algum arquivo da pasta aberto durante a execução — feche todos os arquivos da pasta de origem antes de rodar a macro. Terceiro, sempre feche cada arquivo de origem com SaveChanges:=False dentro do loop, para não deixar dezenas de arquivos abertos ao mesmo tempo, consumindo memória.
Disponibilidade
A função Dir() e Workbooks.Open estão disponíveis em VBA 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 (com a sintaxe de caminho de pasta usando barra normal em vez de barra invertida). O Excel Online não executa macros VBA. No Google Sheets, o equivalente é feito via Apps Script usando os serviços DriveApp e SpreadsheetApp para listar e abrir arquivos de uma pasta do Google Drive, com sintaxe completamente diferente.
Perguntas frequentes
A macro funciona se a pasta tiver arquivos de diferentes formatos, como .xls e .xlsx juntos?
Não com um único padrão de busca. A função Dir(“*.xlsx”) só retorna arquivos .xlsx. Se a pasta tiver formatos mistos, rode o Dir uma vez para cada extensão (por exemplo, primeiro “*.xlsx” e depois “*.xls”), ou use o padrão “*.xls*” que também traz arquivos .xlsm e .xlsb.
Preciso fechar os arquivos da pasta antes de rodar a macro?
Sim, é recomendado. Se um dos arquivos da pasta já estiver aberto, o Excel pode criar um arquivo temporário com nome iniciado em ~$ na mesma pasta, e esse arquivo temporário pode ser capturado pelo Dir junto com os arquivos reais, causando erro ao tentar abri-lo.
Como faço para saber de qual arquivo veio cada linha na consolidação?
Grave o nome do arquivo (a variável usada no loop, como “arquivo”) numa coluna extra da planilha de destino, dentro do mesmo trecho de código que copia os dados, antes de passar para o próximo arquivo do Dir.
Veja também: Listar Arquivos e Pastas em um Diretório e Salvar a Listagem em uma Planilha (aquele artigo apenas lista os nomes dos arquivos de uma pasta; este aqui vai além, abrindo cada arquivo e consolidando os dados de dentro deles) e GetOpenFilename no VBA: Como Criar uma Janela para Escolher um Arquivo no Excel.
Compartilhe ou Comente
Se você curtiu esse artigo aonde mostramos como usar a função Dir() em um loop para percorrer todos os arquivos de uma pasta e consolidar automaticamente os dados de cada um numa única planilha, 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.
Você ainda consolida relatórios de vários arquivos manualmente, copiando e colando um por um? Quantos arquivos você costuma juntar por mês? Conta para nós nos comentários!