我在Excel工作表上有一个表,其中包含来自MySQL数据库的外部数据(使用MySQL Connector。我将创建一个表单,以便用户可以选择要加载的日期范围的数据,但是在开始加载之前,我想告诉用SELECT COUNT(*) FROM tableName WHERE date BETWEEN start AND end
加载了多少行。
我可以这样做:
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:="ODBC;DRIVER={MySQL ODBC 5.3 Unicode Driver};UID=user;PWD=user;SERVER=xxx.xxx.xx.xxx;DATABASE=dbName;PORT=3306;", Destination:=Range("$A$1")).QueryTable
.CommandText = Array("SELECT COUNT(*) FROM tableName")
.Refresh
End With
然后从单元格A2获取行数,但我想知道的是我是否只能在VBA上创建连接而不在表格上加载表格并将结果放在变量中。不想在工作表上加载,从中获取值,然后删除表。
以某种方式将目标部分更改为变量或执行此类操作(无法使其工作):
Dim Cn As ADODB.Connection 'or As ODBC.Connection
Set Cn = New ADODB.Connection 'or New ODBC.Connection
Cn.Open With ActiveSheet.ListObjects.Add(SourceType:=0, Source:="ODBC;DRIVER={MySQL ODBC 5.3 Unicode Driver};UID=user;PWD=user;SERVER=xxx.xxx.xx.xxx;DATABASE=dbName;PORT=3306;"
'...
修改
供将来参考(主要是一旦我忘记并再次需要它)下载MySQL Connector/ODBC,最好将32位版本作为64位版本,可能不会在Excel / Microsoft上显示驱动程序(MySQL ODBC 5.3 Unicode Driver
)查询列表(它确实显示在C:\WINDOWS\syswow64\odbcad32.exe
上)。然后在VBA,菜单/下拉列表Tools
,选项References...
上,选中Microsoft ActiveX Data Objects 6.1 Library
(或可用的最新版本)并使用answer中的代码(至少更改) dbName
和tableName
):
Sub Test()
Dim c As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sq As String
Dim strConnectionString As String
Dim result As Long
strConnectionString = "DRIVER={MySQL ODBC 5.3 Unicode Driver};UID=root;PWD=;SERVER=127.0.0.1;DATABASE=dbName;PORT=3306;"
sq = "SELECT Count(*) As row_count FROM tableName;"
Set c = New ADODB.Connection
c.Open strConnectionStringstring
Set rst = c.Execute(sq)
result = rst!row_count
c.Close
'MsgBox c.Errors
MsgBox result
End Sub
另一个编辑:
代码压缩:
Sub Test()
Dim conn As ADODB.Connection
On Error GoTo ErrorHandler
conn.Open "DRIVER={MySQL ODBC 5.3 Unicode Driver};UID=user;PWD=user;SERVER=192.168.20.198;DATABASE=dbName;PORT=3306;"
MsgBox conn.Execute("SELECT COUNT(*) As row_count FROM tableName;")!row_count
conn.Close
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox "An error has occurred while connecting to the server. Verify your internet connection." & Chr(10) & Chr(10) & "Error:" & Chr(10) & Err.Number & Chr(10) & Err.Source & Chr(10) & Err.Description
End Sub
!row_count
可以更改为.Fields("row_count")
conn.Execute("SELECT COUNT(*) As row_count FROM tableName;")!row_count
可以更改为conn.Execute("SELECT COUNT(*) FROM tableName;").Fields("COUNT(*)")
答案 0 :(得分:1)
这是一些你可以适应的通用代码。
Sub valueFromRecordset()
' ========================================================
' jdoxey
'
' ensure reference is set to Microsoft ActiveX DataObjects library (the latest version of it).
'
' ========================================================
Dim c As ADODB.Connection ' a connection object
Dim rst As ADODB.Recordset ' a recordset object
Dim sq As String ' Sql to execute
Dim strConnectionString As String ' string to store connection string
Dim result As Long ' long to store count of records
' Set to your connection string
strConnectionString = "<your connection string>"
' Put your SQL here
sq = "SELECT Count(<column>) As row_count FROM <table>;"
Set c = New ADODB.Connection ' create new connection
c.Open strConnectionString ' open the connection using connection string
Set rst = c.Execute(sq) ' execute the sql file contents and set result set
result = rst!row_count ' put value of returned record into variable
c.Close ' close the connection
'Debug.Print c.Errors
MsgBox (result)
End Sub
注意:您需要在SQL中将记录计数列的别名设置为row_count
,以使上述代码生效。