Este post foi originalmente publicado em http://officevbavsto.blogspot.com/2011/04/consultas-sql-no-excel-2003-e-versoes.html

Neste artigo, eu escrevo sobre usar o Excel como um banco de dados e fazer consultas nele. Nós vamos executar um comando SELECT para retornar os dados da planilha.

Adicione referência à biblioteca do ADO

Você deve adicionar referência à biblioteca Microsoft ActiveX Data Objects 2.1 Library.

Adicionando referência ao ADO

Crie uma conexão com a planilha

Sub consulta_excel()

  Dim cn As ADODB.Connection
  Dim cnString As String
  
  Set cn = New ADODB.Connection
  
  cnString = "Provider=Microsoft.Jet.OLEDB.4.0;"
  cnString = cnString & "Data Source=C:\Documents and Settings\João A. Neto\Meus documentos\MyExcel.xls;"
  cnString = cnString & "Extended Properties=Excel 8.0;"
  
  cn.ConnectionString = cnString
  cn.Open
  cn.Close
  
  Set cn = Nothing

End Sub   

Execute a consulta SQL

É importante que você conheça o padrão SQL ANSI para poder executar as consultas.

No caso do excel, o nome da planilha será o nome da tabela, a primeira linha será entendida como o nome das colunas e o restante será considerado como dados.

Sintaxe: SELECT [Nome da Coluna 1], [Nome da Coluna n] FROM [Nome da Planilha$]

O nome da planilha deve ter o "$" no final e envolvido com as chaves "[" e "]".

A planilha que utilizarei como exemplo:

Planilha que será utilizada como exemplo
Sub consulta_excel()

  Dim cn As ADODB.Connection
  Dim cnString As String
  Dim rs As Recordset
  Dim sqlString As String
  
  Set cn = New ADODB.Connection
  
  cnString = "Provider=Microsoft.Jet.OLEDB.4.0;"
  cnString = cnString & "Data Source=C:\Documents and Settings\João A. Neto\Meus documentos\MyExcel.xls;"
  cnString = cnString & "Extended Properties=Excel 8.0;"
  
  sqlString = "SELECT Dados, Antiguidade, Valor"
  sqlString = sqlString & " FROM [Cotacoes$]"
  
  cn.ConnectionString = cnString
  cn.Open  
  
  Set rs = New ADODB.Recordset
  rs.Open sqlString, cn, adOpenForwardOnly, adLockReadOnly
  
  ThisWorkbook.Worksheets(1).Range("A1").CopyFromRecordset rs
  
  rs.Close  
  cn.Close
  
  Set rs = Nothing
  Set cn = Nothing

End Sub

CopyFromRecordset - método do objeto Range que copia os dados do Recordset.

Agora, e se os dados da sua planilha não estiverem a partir da célula A1?

Planilha com os dados a partir da célula A2

Bem, isso é simples de se resolver!

[...] 
sqlString = "SELECT Dados, Antiguidade, Valor"
sqlString = sqlString & " FROM [Cotacoes$A2:D12]"
[...]

Depois do "$", você delimita onde estão os seus dados.

Você também pode utilizar intervalo de células nomeado.

[...] 
sqlString = "SELECT Dados, Antiguidade, Valor"
sqlString = sqlString & " FROM regiao_dados"
[...]

Fonte: http://www.connectionstrings.com/excel

Créditos

Photo by Pixabay from Pexels