Exécuter SQL écrit dans une zone de texte avec VBA

Sep 11 2020

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

3 jamheadart Sep 11 2020 at 11:25

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

HavardKleven Sep 11 2020 at 11:38

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