Exécuter une requête SQL avec VBA et remplir une feuille avec des données


2

Très nouveau pour toute forme de code. Tentative d'exécuter un script dans VBA qui extraira des données d'une base de données d'accès à l'aide de SQL et les mettra dans un tableur Excel. Le code est similaire à ci-dessous. Fonctionne à blanc mais je ne sais pas comment utiliser les données qu'il extrait. Merci d'avance.

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

Le problème est-il que vous ne savez pas comment accéder aux données récupérées en exécutant la requête SQL?
Excellll

Oui ... J'ai réussi à accéder aux données, mais je ne sais pas où elles sont stockées ni comment les utiliser.
Toad62

Vous devez utiliser un Recordsetobjet pour conserver les résultats de la requête. Notez que vous l'avez déclaré rsmais que vous ne l'utilisez nulle part dans votre code.
Excellll

Réponses:


7

Vous devez remplir votre objet recordset (c'est la variable rs que vous avez déclarée). J'ai changé le code ci-dessous pour faire exactement cela. Vous pouvez ensuite copier les résultats du jeu d’enregistrements directement dans une plage RANGE.copyfromrecordset <yourrecordset>ci-dessous. J’ajoute également le lieu où je vends les résultats dans SHeet1.Range ("A1"). Vous voudrez probablement changer cela. MODIFIÉ POUR AJOUTER: Vous venez de réaliser que vous utilisez une liaison tardive pour ADODB. J'ai ajusté le code pour qu'il fonctionne réellement.

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

Vous pouvez considérer RecordSet (rs dans ce cas) comme une table virtuelle contenant les résultats du code SQL. Vous pouvez interagir avec RecordSet sur un enregistrement par enregistrement (avec rs.MoveFirst, MoveNext, MoveLast) et champ par champ (en itérant dans la collection rs.fields), ou vous pouvez simplement vider les résultats dans une plage.


après avoir ajouté la ligne "Set rs = CreateObject (" ADODB.Recordset ")", la procédure ci-dessus a fonctionné. Je vous remercie. Je semble avoir un problème avec la manière dont j'utilise ma variable d'entrée utilisateur dans ma chaîne SQL ... mais c'est un autre problème. Merci
Toad62

Oui, j'ai aussi remarqué cela. Essayez: strSQL = "SELECT NAME, Location WHERE NAME =" & chr(34) & strInput & chr(34) & ";"Le chr(34)est un guillemet. Le &concatène tout cela ensemble. Si Access requiert une simple citation autour du texte (je ne m'en souviens pas par coeur), alors chr(39)c'est celui que vous souhaitez.
JNevill
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.