对不同单元格的多个 MySQL 查询
Multiple MySQL Queries to different Cells
我试图开始工作的是不同的 MySQL 一个 Sub 中的查询,它应该在一个 table 中填充不同的范围。
这是我目前得到的:
使用函数 "ConnectionDB" 我想连接到远程数据库。在 Sub "QueryDatabase" 中,我打开连接并执行两个 Sql 查询。第一个 Sql 查询应填充范围 A2,第二个查询应填充同一工作表中的范围 D2。
我从录制的宏中提取了 Sql 字符串到远程数据库,并且在录制的宏中运行良好。
当我执行我的代码(见下文)时,Excel 工作了一段时间,但地址单元格保持为空。我没有得到调试错误。
伙计们,在这里我很高兴能得到所有帮助来使它正常工作=)这甚至可能成为现在想要的方式吗?
Public conMySQL As ADODB.Connection
Public rs As ADODB.Recordset
Public strSql As String
Public Function ConnectionDB()
Set conMySQL = New ADODB.Connection
Set rs = New ADODB.Recordset
conMySQL.Open
"Driver={MySQL ODBC 5.3 UNICODE Driver}; _
Server={XXX}; UID=XXX; PWD=XXX; DATABASE=XXX; _
Option=3; PORT=3306"
End Function
Sub QueryDatabase()
Call ConnectionDB
With Sheets("Energiedaten").Range("A2")
strSql = "SELECT Messdaten_0.Terminal, Messdaten_0.Timestamp, Messdaten_0.Value" & Chr(13) & "" & Chr(10) & "FROM BLB_Data.Messdaten Messdaten_0" & Chr(13) & "" & Chr(10) & _
"WHERE (Messdaten_0.Terminal = 'TerminalX') AND (Messdaten_0.Timestamp>=('" & UserForm1.TextBox1.Text & "') And (Messdaten_0.Timestamp<=('" & UserForm1.TextBox2.Text & "'))" _
& Chr(13) & "" & Chr(10) & "ORDER BY Messdaten_0.Timestamp"
End With
With Sheets("Energiedaten").Range("D2")
strSql = "SELECT Messdaten_0.Terminal, Messdaten_0.Timestamp, Messdaten_0.Value" & Chr(13) & "" & Chr(10) & "FROM BLB_Data.Messdaten Messdaten_0" & Chr(13) & "" & Chr(10) & _
"WHERE (Messdaten_0.Terminal = 'TerminalY') AND (Messdaten_0.Timestamp>=('" & UserForm1.TextBox1.Text & "') And Messdaten_0.Timestamp<=('" & UserForm1.TextBox2.Text & "'))" _
& Chr(13) & "" & Chr(10) & "ORDER BY Messdaten_0.Timestamp "
End With
conMySQL.execute strSql
conMySQL.Close
End Sub
您可以使用Range.CopyFromRecordset
方法。您已经声明了 rs As ADODB.Recordset
,因此您需要打开记录集,将其写入 sheet,然后为每个 SQL 语句关闭它。
编辑:用完整代码替换了示例代码部分:
Option Explicit
Public conMySQL As ADODB.Connection
Public Function ConnectionDB()
Set conMySQL = New ADODB.Connection
conMySQL.Open "Driver={MySQL ODBC 5.3 UNICODE Driver};" _
& "Server={XXX}; UID=XXX; PWD=XXX; DATABASE=XXX;" _
& "Option=3; PORT=3306"
End Function
Sub QueryDatabase()
Dim rs As ADODB.Recordset
Dim strSql As String
Set rs = New ADODB.Recordset
Call ConnectionDB
strSql = "SELECT `Terminal`, `Timestamp`, `Value` FROM Messdaten WHERE `Terminal` = 'Extruder' AND `Timestamp` >= '" & UserForm1.TextBox1.Text & "' AND `Timestamp` <= '" & UserForm1.TextBox1.Text & "' ORDER BY `Timestamp` ASC"
rs.Open Source:=strSql, ActiveConnection:=conMySQL, CursorType:=adOpenStatic, _
LockType:=adLockOptimistic
ThisWorkbook.Sheets("Energiedaten").Range("A2").CopyFromRecordset rs
rs.Close
strSql = "SELECT `Terminal`, `Timestamp`, `Value` FROM Messdaten WHERE `Terminal` = 'Beschichtungseinheit' AND `Timestamp` >= '" & UserForm1.TextBox1.Text & "' AND `Timestamp` <= '" & UserForm1.TextBox1.Text & "' ORDER BY `Timestamp` ASC "
rs.Open Source:=strSql, ActiveConnection:=conMySQL, CursorType:=adOpenStatic, _
LockType:=adLockOptimistic
ThisWorkbook.Sheets("Energiedaten").Range("D2").CopyFromRecordset rs
rs.Close
conMySQL.Close
End Sub
类似于:
Option Explicit
Public conMySQL As ADODB.Connection
Public Sub ConnectionDB()
Set conMySQL = New ADODB.Connection
conMySQL.Open "Driver={MySQL ODBC 5.3 UNICODE Driver};" & _
"Server={XXX}; UID=XXX; PWD=XXX; DATABASE=XXX;" & _
"Option=3; PORT=3306"
End Sub
Sub QueryDatabase()
ConnectionDB
strSql = "SELECT Messdaten_0.Terminal, Messdaten_0.Timestamp, Messdaten_0.Value" & Chr(13) & "" & Chr(10) & "FROM BLB_Data.Messdaten Messdaten_0" & Chr(13) & "" & Chr(10) & _
"WHERE (Messdaten_0.Terminal = 'TerminalX') AND (Messdaten_0.Timestamp>=('" & UserForm1.TextBox1.Text & "') And (Messdaten_0.Timestamp<=('" & UserForm1.TextBox2.Text & "'))" _
& Chr(13) & "" & Chr(10) & "ORDER BY Messdaten_0.Timestamp"
PutResults Sheets("Energiedaten").Range("A2"), strSql
strSql = "SELECT Messdaten_0.Terminal, Messdaten_0.Timestamp, Messdaten_0.Value" & Chr(13) & "" & Chr(10) & "FROM BLB_Data.Messdaten Messdaten_0" & Chr(13) & "" & Chr(10) & _
"WHERE (Messdaten_0.Terminal = 'TerminalY') AND (Messdaten_0.Timestamp>=('" & UserForm1.TextBox1.Text & "') And Messdaten_0.Timestamp<=('" & UserForm1.TextBox2.Text & "'))" _
& Chr(13) & "" & Chr(10) & "ORDER BY Messdaten_0.Timestamp "
PutResults Sheets("Energiedaten").Range("D2"), strSql
conMySQL.Close
End Sub
Sub PutResults(rng As Range, SQL As String)
Dim rs As ADODB.Recordset
Set rs = conMySQL.Execute(SQL)
If Not rs.EOF Then
rng.Cells(1).CopyFromRecordset rs
End If
rs.Close
Set rs = Nothing
End Sub
我试图开始工作的是不同的 MySQL 一个 Sub 中的查询,它应该在一个 table 中填充不同的范围。
这是我目前得到的:
使用函数 "ConnectionDB" 我想连接到远程数据库。在 Sub "QueryDatabase" 中,我打开连接并执行两个 Sql 查询。第一个 Sql 查询应填充范围 A2,第二个查询应填充同一工作表中的范围 D2。
我从录制的宏中提取了 Sql 字符串到远程数据库,并且在录制的宏中运行良好。
当我执行我的代码(见下文)时,Excel 工作了一段时间,但地址单元格保持为空。我没有得到调试错误。
伙计们,在这里我很高兴能得到所有帮助来使它正常工作=)这甚至可能成为现在想要的方式吗?
Public conMySQL As ADODB.Connection
Public rs As ADODB.Recordset
Public strSql As String
Public Function ConnectionDB()
Set conMySQL = New ADODB.Connection
Set rs = New ADODB.Recordset
conMySQL.Open
"Driver={MySQL ODBC 5.3 UNICODE Driver}; _
Server={XXX}; UID=XXX; PWD=XXX; DATABASE=XXX; _
Option=3; PORT=3306"
End Function
Sub QueryDatabase()
Call ConnectionDB
With Sheets("Energiedaten").Range("A2")
strSql = "SELECT Messdaten_0.Terminal, Messdaten_0.Timestamp, Messdaten_0.Value" & Chr(13) & "" & Chr(10) & "FROM BLB_Data.Messdaten Messdaten_0" & Chr(13) & "" & Chr(10) & _
"WHERE (Messdaten_0.Terminal = 'TerminalX') AND (Messdaten_0.Timestamp>=('" & UserForm1.TextBox1.Text & "') And (Messdaten_0.Timestamp<=('" & UserForm1.TextBox2.Text & "'))" _
& Chr(13) & "" & Chr(10) & "ORDER BY Messdaten_0.Timestamp"
End With
With Sheets("Energiedaten").Range("D2")
strSql = "SELECT Messdaten_0.Terminal, Messdaten_0.Timestamp, Messdaten_0.Value" & Chr(13) & "" & Chr(10) & "FROM BLB_Data.Messdaten Messdaten_0" & Chr(13) & "" & Chr(10) & _
"WHERE (Messdaten_0.Terminal = 'TerminalY') AND (Messdaten_0.Timestamp>=('" & UserForm1.TextBox1.Text & "') And Messdaten_0.Timestamp<=('" & UserForm1.TextBox2.Text & "'))" _
& Chr(13) & "" & Chr(10) & "ORDER BY Messdaten_0.Timestamp "
End With
conMySQL.execute strSql
conMySQL.Close
End Sub
您可以使用Range.CopyFromRecordset
方法。您已经声明了 rs As ADODB.Recordset
,因此您需要打开记录集,将其写入 sheet,然后为每个 SQL 语句关闭它。
编辑:用完整代码替换了示例代码部分:
Option Explicit
Public conMySQL As ADODB.Connection
Public Function ConnectionDB()
Set conMySQL = New ADODB.Connection
conMySQL.Open "Driver={MySQL ODBC 5.3 UNICODE Driver};" _
& "Server={XXX}; UID=XXX; PWD=XXX; DATABASE=XXX;" _
& "Option=3; PORT=3306"
End Function
Sub QueryDatabase()
Dim rs As ADODB.Recordset
Dim strSql As String
Set rs = New ADODB.Recordset
Call ConnectionDB
strSql = "SELECT `Terminal`, `Timestamp`, `Value` FROM Messdaten WHERE `Terminal` = 'Extruder' AND `Timestamp` >= '" & UserForm1.TextBox1.Text & "' AND `Timestamp` <= '" & UserForm1.TextBox1.Text & "' ORDER BY `Timestamp` ASC"
rs.Open Source:=strSql, ActiveConnection:=conMySQL, CursorType:=adOpenStatic, _
LockType:=adLockOptimistic
ThisWorkbook.Sheets("Energiedaten").Range("A2").CopyFromRecordset rs
rs.Close
strSql = "SELECT `Terminal`, `Timestamp`, `Value` FROM Messdaten WHERE `Terminal` = 'Beschichtungseinheit' AND `Timestamp` >= '" & UserForm1.TextBox1.Text & "' AND `Timestamp` <= '" & UserForm1.TextBox1.Text & "' ORDER BY `Timestamp` ASC "
rs.Open Source:=strSql, ActiveConnection:=conMySQL, CursorType:=adOpenStatic, _
LockType:=adLockOptimistic
ThisWorkbook.Sheets("Energiedaten").Range("D2").CopyFromRecordset rs
rs.Close
conMySQL.Close
End Sub
类似于:
Option Explicit
Public conMySQL As ADODB.Connection
Public Sub ConnectionDB()
Set conMySQL = New ADODB.Connection
conMySQL.Open "Driver={MySQL ODBC 5.3 UNICODE Driver};" & _
"Server={XXX}; UID=XXX; PWD=XXX; DATABASE=XXX;" & _
"Option=3; PORT=3306"
End Sub
Sub QueryDatabase()
ConnectionDB
strSql = "SELECT Messdaten_0.Terminal, Messdaten_0.Timestamp, Messdaten_0.Value" & Chr(13) & "" & Chr(10) & "FROM BLB_Data.Messdaten Messdaten_0" & Chr(13) & "" & Chr(10) & _
"WHERE (Messdaten_0.Terminal = 'TerminalX') AND (Messdaten_0.Timestamp>=('" & UserForm1.TextBox1.Text & "') And (Messdaten_0.Timestamp<=('" & UserForm1.TextBox2.Text & "'))" _
& Chr(13) & "" & Chr(10) & "ORDER BY Messdaten_0.Timestamp"
PutResults Sheets("Energiedaten").Range("A2"), strSql
strSql = "SELECT Messdaten_0.Terminal, Messdaten_0.Timestamp, Messdaten_0.Value" & Chr(13) & "" & Chr(10) & "FROM BLB_Data.Messdaten Messdaten_0" & Chr(13) & "" & Chr(10) & _
"WHERE (Messdaten_0.Terminal = 'TerminalY') AND (Messdaten_0.Timestamp>=('" & UserForm1.TextBox1.Text & "') And Messdaten_0.Timestamp<=('" & UserForm1.TextBox2.Text & "'))" _
& Chr(13) & "" & Chr(10) & "ORDER BY Messdaten_0.Timestamp "
PutResults Sheets("Energiedaten").Range("D2"), strSql
conMySQL.Close
End Sub
Sub PutResults(rng As Range, SQL As String)
Dim rs As ADODB.Recordset
Set rs = conMySQL.Execute(SQL)
If Not rs.EOF Then
rng.Cells(1).CopyFromRecordset rs
End If
rs.Close
Set rs = Nothing
End Sub