将Excel上的MySQL数据库表行数作为VBA变量获取,而不在表

时间:2018-03-13 10:15:31

标签: excel excel-vba vba

我在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中的代码(至少更改) dbNametableName):

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(*)")

1 个答案:

答案 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,以使上述代码生效。