Execute SQL escrito em uma caixa de texto com VBA

Sep 11 2020

Com referência a esta pergunta: Evite novos separadores de linha na consulta mySQL dentro do código VBA , eu queria executar uma SQLinstrução que está escrita no textboxarquivo Excel.
Portanto, criei um textboxchamado SqlQuery1parecido com este:


No VBAreferi-me à caixa de texto dentro de 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

No entanto, eu entro runtime error 438no SqlString.
Você tem alguma ideia do que preciso mudar para que funcione?

Respostas

3 jamheadart Sep 11 2020 at 11:25

Thisworkbook.Sheet1 não é um caminho de objeto válido, tente:

SqlString = ThisWorkbook.Sheets("Sheet1").Shapes("SqlQuery1").OLEFormat.Object.Text

Ou apenas

SqlString = Sheet1.Shapes("SqlQuery1").OLEFormat.Object.Text

E certifique-se de que o nome da planilha seja "Planilha1"

Além disso, você precisa mudar

rs.Open strSQL, conn, adOpenStatic

para isso:

rs.Open SqlString, conn, adOpenStatic

E você provavelmente deve usar

Dim SqlString as String

no início da rotina

HavardKleven Sep 11 2020 at 11:38

Definitivamente, você está no caminho certo e posso ver que tentou solucionar esse erro! :-)

Seu problema é com a rs.Openpeça, pelo que posso ver. Eu embaralhei seu código um pouco. Pelo que posso ver, você não adicionou a parte ADODB.Command. Eu adicionei isso no trecho de código abaixo.

Um conselho para economizar tempo em módulos maiores; declare sua conexão como uma string global privada no início, para que você possa acessá-la mais tarde no módulo.

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