Para copiar dados de arquivos fechados com VBA, sem precisar abri-los na tela, use a função ExecuteExcel4Macro para ler o valor de uma célula específica de cada vez, montando uma referência no formato 'caminho\[arquivo.xlsx]Planilha'!A1 — essa técnica lê o valor diretamente do arquivo em disco, sem exibir o Excel abrindo a pasta de trabalho na tela.
Você já precisou buscar um valor específico — um total, uma data, um indicador — espalhado em dezenas de arquivos fechados numa pasta, e a única forma que conhecia era abrir cada arquivo, um por um, copiar o valor manualmente e fechar de novo?
Esse processo não é só lento: abrir e fechar muitos arquivos também deixa o Excel mais pesado durante a execução, além do risco real de, sem querer, salvar uma alteração num arquivo que deveria continuar intocado, misturando dados originais com dados alterados por engano.
Neste artigo iremos mostrar duas formas de ler dados de arquivos fechados com VBA sem abri-los na tela: a função ExecuteExcel4Macro, ideal para buscar valores pontuais de células específicas, e uma consulta via ADODB, ideal para importar uma tabela inteira de um arquivo fechado de uma só vez.
ExecuteExcel4Macro: lendo uma célula sem abrir o arquivo
A função ExecuteExcel4Macro é uma função antiga do Excel (herdada de uma versão anterior às macros do VBA como conhecemos hoje), mas que continua funcionando nas versões atuais e é a forma mais direta de ler o valor de uma única célula de um arquivo fechado, sem precisar abri-lo. A sintaxe da referência segue o formato:
'caminho\[nomeDoArquivo.xlsx]NomeDaPlanilha'!A1
Encapsulando isso numa função reutilizável:
Function LerCelulaFechada(caminho As String, arquivo As String, aba As String, celula As String) As Variant
Dim referencia As String
referencia = "'" & caminho & "[" & arquivo & "]" & aba & "'!" & celula
LerCelulaFechada = ExecuteExcel4Macro(referencia)
End Function
Repare que o parâmetro caminho precisa terminar com uma barra invertida (\), e o arquivo referenciado não pode estar aberto no momento da chamada — se estiver, a função retorna um erro, já que a sintaxe é pensada especificamente para ler arquivos fechados. Um exemplo de uso, lendo a célula B10 da planilha “Resumo” de um arquivo chamado “Vendas_Janeiro.xlsx”:
Sub TestarLeituraFechada()
Dim valor As Variant
valor = LerCelulaFechada("C:\Relatorios\", "Vendas_Janeiro.xlsx", "Resumo", "B10")
MsgBox valor
End Sub
Combinando com um loop para ler vários arquivos de uma pasta
A função de leitura fica ainda mais útil combinada com um loop Dir() percorrendo todos os arquivos de uma pasta, buscando o mesmo valor em cada um deles sem nunca abrir nenhum na tela:
Sub ResumirTotaisDaPasta()
Dim pasta As String
Dim arquivo As String
Dim linha As Long
pasta = "C:\Relatorios\"
linha = 2
arquivo = Dir(pasta & "*.xlsx")
Do While arquivo <> ""
ThisWorkbook.Worksheets("Resumo").Cells(linha, 1).Value = arquivo
ThisWorkbook.Worksheets("Resumo").Cells(linha, 2).Value = _
LerCelulaFechada(pasta, arquivo, "Resumo", "B10")
linha = linha + 1
arquivo = Dir
Loop
End Sub
Exemplo prático: totais de vendas de arquivos mensais fechados
Imagine três arquivos fechados numa pasta — Vendas_Janeiro.xlsx, Vendas_Fevereiro.xlsx e Vendas_Marco.xlsx — cada um com o total de vendas do mês na célula B10 da aba “Resumo”. Rodando a macro ResumirTotaisDaPasta apresentada acima, sem abrir nenhum dos três arquivos manualmente, o resultado gerado na planilha atual fica assim:
| Arquivo | Total (célula B10) |
|---|---|
| Vendas_Janeiro.xlsx | R$ 45.700,00 |
| Vendas_Fevereiro.xlsx | R$ 51.200,00 |
| Vendas_Marco.xlsx | R$ 39.800,00 |
Essa técnica é especialmente rápida quando você precisa de apenas um ou poucos valores de cada arquivo — abrir e fechar dezenas de pastas de trabalho inteiras só para ler uma célula de cada uma seria muito mais lento do que ler diretamente com ExecuteExcel4Macro.
Importando uma tabela inteira de um arquivo fechado com ADODB
Quando o objetivo não é ler uma célula isolada, mas sim uma tabela inteira de um arquivo fechado, a técnica mais eficiente é tratar o próprio arquivo Excel como se fosse um banco de dados, usando uma conexão ADODB com o provedor Microsoft.ACE.OLEDB.12.0 e uma consulta SQL:
Sub LerTabelaArquivoFechado()
Dim conn As Object
Dim rs As Object
Dim caminho As String
caminho = "C:\Relatorios\Vendas_Janeiro.xlsx"
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & caminho & _
";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM [Resumo$A1:C100]", conn
ThisWorkbook.Worksheets("Consolidado").Range("A2").CopyFromRecordset rs
rs.Close
conn.Close
End Sub
Nessa consulta, HDR=YES indica que a primeira linha do intervalo contém os cabeçalhos das colunas, [Resumo$A1:C100] especifica a aba e o intervalo lido (o cifrão depois do nome da aba é parte obrigatória da sintaxe), e o método CopyFromRecordset despeja o resultado inteiro de uma vez na planilha de destino, sem precisar de um loop linha por linha.
Essa técnica exige que o driver Microsoft Access Database Engine (que fornece o provedor ACE OLEDB) esteja instalado no computador — ele já vem embutido em instalações completas do Microsoft Office, mas pode faltar em instalações mais enxutas, exigindo download separado da Microsoft nesse caso, prestando atenção para instalar a versão de 32 ou 64 bits compatível com a versão do Office instalada.
Disponibilidade
ExecuteExcel4Macro está disponível no Excel para Windows desde versões bem antigas, incluindo 2007, 2010, 2013, 2016, 2019, 2021 e Excel 365, e também no Excel para Mac. A conexão ADODB com o provedor ACE OLEDB funciona apenas no Excel para Windows, já que depende de um componente do Windows (não existe equivalente nativo no Excel para Mac). O Excel Online não executa macros VBA. O Google Sheets não tem equivalente direto a essas duas técnicas, mas permite ler dados de outra planilha do Google Drive via Apps Script usando SpreadsheetApp.openById(), que abre o arquivo em segundo plano sem exibir uma janela, de forma conceitualmente parecida.
Perguntas frequentes
ExecuteExcel4Macro funciona se o arquivo estiver aberto no momento da leitura?
Não é recomendado usar assim. A função foi pensada para arquivos fechados; se o arquivo já estiver aberto, o comportamento pode ser inconsistente ou gerar erro. Se o arquivo já estiver aberto, é mais simples e seguro ler a célula diretamente com uma referência normal, como Workbooks(“Arquivo.xlsx”).Worksheets(“Resumo”).Range(“B10”).Value.
Por que recebo um erro de “Provedor não encontrado” ao tentar usar o ADODB com Microsoft.ACE.OLEDB.12.0?
Esse erro indica que o driver Microsoft Access Database Engine não está instalado no computador. Ele normalmente vem com instalações completas do Microsoft Office, mas pode faltar em instalações enxutas ou no Office 365 apenas web. Baixe o “Microsoft Access Database Engine Redistributable” no site da Microsoft, escolhendo a versão de 32 ou 64 bits que combine com a versão instalada do Office.
Qual técnica é mais rápida: ExecuteExcel4Macro ou abrir o arquivo com Workbooks.Open?
Para ler uma ou poucas células de cada arquivo, o ExecuteExcel4Macro costuma ser bem mais rápido, já que evita o custo de abrir e fechar a pasta de trabalho inteira. Para importar uma tabela inteira ou processar muitos dados de cada arquivo, abrir com Workbooks.Open (ou usar a consulta ADODB) tende a ser mais prático.
Veja também: Como Importar Todos os Arquivos de uma Pasta com VBA no Excel (aquele artigo abre cada arquivo com Workbooks.Open para copiar os dados; este aqui mostra como ler valores sem nunca abrir o arquivo na tela, mais rápido para poucos valores) e Como Abrir um Arquivo com o VBA.
Compartilhe ou Comente
Se você curtiu esse artigo aonde mostramos como usar ExecuteExcel4Macro para ler células de arquivos fechados sem abri-los, e uma consulta ADODB com o provedor ACE OLEDB para importar tabelas inteiras de arquivos fechados, 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ê já precisou buscar um valor espalhado em vários arquivos fechados? Qual das duas técnicas parece mais útil para o seu tipo de planilha? Conta para nós nos comentários!