Exécuter SQL écrit dans une zone de texte avec VBA
En référence à cette question: évitez les nouveaux séparateurs de ligne dans la requête mySQL dans le code VBA , je voulais exécuter une SQLinstruction écrite dans un textboxfichier Excel.
Par conséquent, j'ai créé un textboxappelé SqlQuery1ressemblant à ceci:
Dans le VBAje me suis référé à la zone de texte dans le SqlString:
Sub Get_Data_from_DWH ()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=XX.XXX.XXX.XX; DATABASE=bi; UID=testuser; PWD=test; OPTION=3"
conn.Open
SqlString = ThisWorkbook.Sheet1.Shapes("SqlQuery1").OLEFormat.Object.Text
Set rs = New ADODB.Recordset
rs.Open strSQL, conn, adOpenStatic
Sheet1.Range("A1").CopyFromRecordset rs
rs.Close
conn.Close
End Sub
Cependant, je reçois runtime error 438le SqlString.
Avez-vous une idée de ce que je dois changer pour que cela fonctionne?
Réponses
Thisworkbook.Sheet1 n'est pas un chemin d'objet valide, essayez à la place:
SqlString = ThisWorkbook.Sheets("Sheet1").Shapes("SqlQuery1").OLEFormat.Object.Text
Ou juste
SqlString = Sheet1.Shapes("SqlQuery1").OLEFormat.Object.Text
Et assurez-vous que la feuille porte bien le nom "Sheet1"
Vous devez également changer
rs.Open strSQL, conn, adOpenStatic
pour ça:
rs.Open SqlString, conn, adOpenStatic
Et vous devriez probablement utiliser
Dim SqlString as String
au début de la routine
Vous êtes définitivement sur la bonne voie ici et je peux voir que vous avez essayé de résoudre cette erreur! :-)
Votre problème concerne la rs.Openpièce, pour autant que je sache. J'ai un peu mélangé votre code. Pour autant que je sache, vous n'avez pas ajouté la partie ADODB.Command. J'ai ajouté ceci dans l'extrait de code ci-dessous.
Un conseil pour gagner du temps dans des modules plus volumineux; déclarez votre connexion comme une chaîne globale privée au début, afin que vous puissiez y accéder plus tard dans le module.
Private Const CONNECTION As String = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=XX.XXX.XXX.XX; DATABASE=bi; UID=testuser; PWD=test; OPTION=3"
Sub Get_Data_from_DWH()
Dim cmd As ADODB.Command
Dim conn As ADODB.CONNECTION
Dim rs As ADODB.Recordset
Set conn = New ADODB.CONNECTION
conn.Open CONNECTION
conn.CommandTimeout = 900
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
If Not conn.State = ADODB.adStateOpen Then GoTo Bugcatcher
Set cmd = New ADODB.Command
cmd.ActiveConnection = CONNECTION
cmd.CommandText = ws.Shapes("TextBox 2").OLEFormat.Object.Text
cmd.CommandType = adCmdText
Set rs = cmd.Execute
ws.Range("A1").CopyFromRecordset rs
Bugcatcher:
Exit Sub
End Sub