Executa o SQL Query com o VBA e a folha de preenchimento com dados

2

Muito novo para qualquer forma de código. Tentativa de executar um script no VBA que extrairá dados de um banco de dados de acesso usando SQL e os colocará em uma planilha do Excel. Código é semelhante ao abaixo. Funciona limpo, mas não sei como usar os dados que ele está puxando. Desde já, obrigado.

Sub Get_Data()
Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL, strInput As String

strFile = "S:\Location.Database.accdb"

strCon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strFile

Set cn = CreateObject("ADODB.Connection")
cn.Open strCon

strInput = InputBox("Input Desired Name")

strSQL = "SELECT NAME, Location WHERE NAME =""'strInput'"";"

cn.Execute strSQL

cn.Close
Set cn = Nothing

End Sub
    
por Toad62 17.09.2014 / 18:11

1 resposta

7

Você precisa preencher seu objeto recordset (essa é a variável rs que você declarou). Eu mudei o código abaixo para fazer exatamente isso. Em seguida, você pode copiar os resultados do conjunto de registros diretamente em um intervalo com RANGE.copyfromrecordset <yourrecordset> abaixo. Eu adicionei isso também e despejo os resultados em SHeet1.Range ("A1"). Você provavelmente vai querer mudar isso. EDITADO PARA ADICIONAR: Apenas percebi que você está usando ligação tardia para o ADODB. Eu ajustei o código para que funcione.

Sub Get_Data()
Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL, strInput As String

strFile = "S:\Location.Database.accdb"

strCon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strFile

Set cn = CreateObject("ADODB.Connection")
cn.Open strCon

strInput = InputBox("Input Desired Name")

strSQL = "SELECT NAME, Location WHERE NAME =""'strInput'"";"

'Added the following four lines
Set rs = CreateObject("ADODB.RECORDSET")    
rs.activeconnection = cn    
rs.open strSQL    
Sheet1.Range("A1").CopyFromRecordSet rs

'removed
'cn.Execute strSQL


rs.close
cn.Close
Set cn = Nothing

End Sub

Você pode pensar no RecordSet (rs neste caso) como uma tabela virtual que contém os resultados do SQL. Você pode interagir com o RecordSet em um registro por registro (com rs.MoveFirst, MoveNext, MoveLast) e campo por campo (iterando através da coleção rs.fields), ou você pode simplesmente despejar os resultados em um intervalo.

    
por 17.09.2014 / 18:44