Execute SQL escrito em uma caixa de texto com VBA
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
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
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