Queries no Excel - Busca de dados
Autor: Lucas | Publicado: 2012-09-15T09:09:00-03:00


Hoje vou postar um método para buscar dados no Excel utilizando queries SQL. A idéia é criar uma conexão com o próprio arquivo, como se ele fosse um banco de dados externo e suas planilhas, as tabelas.


O código utiliza uma conexão ADODB para realizar as consultas. Para utilizar o objeto ADODB é necessário adicionar, na janela de código, a referência ä biblioteca 'Microsoft ActiveX Data Objects 2.7 Library'. Para fazer isso, no menu 'Ferramentas' selecione a opção 'Referências' e seleciona a biblioteca em questão, como mostrado na imagem abaixo.





No código abaixo, como exemplo, queremos copiar os dados da planilha 'Tabela1' para a planilha 'Teste'. Note que, na query, o nome da planilha é colocado entre colchetes e terminado com o símbolo &amp;. Isso é um padrão do Excel ao tratar as planilhas como tabelas de um banco de dados.

'Realiza a busca no banco de dados via query utilizando ADO
'Necessário adicionar a referência 'Microsoft ActiveX Data Objects 2.7 Library'
'Para fazer isso selecione, na janela de código (essa mesma) o menu 'Ferramentas'
'e a opção 'Referências' e marque a biblioteca na lista.
Sub BuscaSQL()

    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim sql_busca As String
    
    'Inicializa a conexão
    Set cn = New ADODB.Connection
    
    'Inicializa o recordset
    Set rs = New ADODB.Recordset
    
    'Define parâmetros do recordset
    rs.CursorType = adOpenDynamic
    rs.CursorLocation = adUseClient
    rs.LockType = adLockBatchOptimistic
    
    'Abre a conexão com o arquivo atual
    With cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=C:\Arquivo.xlsm;Extended Properties=Excel 8.0;"
        .Open
    End With
    
    'Define a query SQL a ser executada
    'Note que o nome da planilha está entre colchetes e termina com o símbolo $
    'sql_busca = "SELECT * FROM [Tabela1$] WHERE [Código] = 1234"
    
    'Executa a query
    rs.Open sql_busca, cn

    'Copia os dados do recordset para a planilha 'Teste'
    'Essa função CopyFromRecordset é bem problemática...
    ThisWorkbook.Worksheets("Teste").Cells.CopyFromRecordset rs
    
    'Fecha o recordset
    rs.Close
    
    'Fecha a conexão
    cn.Close

End Sub



Seguem algumas observações sobre o código acima:




Para copiar todos os dados de um recordset para uma planilha, utilizamos a função CopyFromRecordset. Essa função pode apresentar problemas dependendo da versão utilizada do Excel. Rodei esse código utilizando o Excel 2010. Essa função recebe o nome do recordset com os dados e o copia para algum Range especificado.





A propriedade ConnectionString define o caminho do arquivo a ser aberto como banco de dados. Esse arquivo pode ser o próprio arquivo onde a macro está sendo executada. Para obter o caminho do arquivo atual pode-se utilizar as propriedades ThisWorkbook.Path e ThisWorkbook.Name





As planilhas no arquivo aberto como banco de dados devem estar no formato de tabela, isto é, a primeira coluna possui os nomes das colunas (que não devem se repetir), não devem existir colunas em branco e os registros devem estar dispostos nas linhas.




A string de conexão pode ser adaptada para realizar conexões com arquivos de texto ou outros bancos de dados.



Abraços,
Lucas Rodrigues