【问题标题】:Excel VBA SQL query ADODBExcel VBA SQL 查询 ADODB
【发布时间】:2016-02-11 15:10:33
【问题描述】:

您好,我有一个现有的 Excel 表,里面有一些数据,现在我想直接从 VBA 执行查询。这就是我现在拥有的:

Private Sub CommandButton1_Click()
Dim sSQLQry As String
Dim ReturnArray
Dim Conn As New ADODB.Connection
Dim mrs As New ADODB.Recordset
Dim DBPath As String, sconnect As String
Dim newSheet As Worksheet
'DBPath = ThisWorkbook.FullName
DBPath = "C:\someData.xlsm"
sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath & ";HDR=Yes';"
Conn.Open sconnect
sSQLSting = "SELECT username,count(username) FROM [Sheet1$] group by username order by count(username) desc;"
mrs.Open sSQLSting, Conn
Set newSheet = Sheets.Add
ActiveSheet.Range("A1").CopyFromRecordset mrs
mrs.Close
Conn.Close
End Sub

这个查询执行得很好并且给出了想要的结果,但是当我把它改成这个时:

Select param0,count(param0) From [Sheet1$] where eventid='addToCart' group by param0 order by count(param0) desc;

因为param0是这样的:大部分是数字,但也有一些是数字和字符混合在一起的,所以查询结果只返回纯数字条目。那么如何配置数据库以使其识别 param0 字段应该是文本,而不是 int?此外,当我执行此查询时:

Select eventid,param0,param1,count(*) From [Sheet1$] where eventid='search' group by param0, param1 order by count(*) desc;

它给出了“自动化错误”。我搜索了它,但找不到合适的解决方案。有人能帮忙吗?谢谢!

编辑:所有三个查询在 MySQL 工作台中都给出了正确的结果。现在我需要直接在 Excel 工作表中执行查询。

【问题讨论】:

    标签: excel vba ado


    【解决方案1】:

    您的第二个问题在于您要求 eventid 字段而没有将其包含在聚合 GROUP BY 子句中。

    SELECT eventid, param0, param1, count(*)
      FROM [Sheet1$]
      WHERE eventid='search'
      GROUP by eventid, param0, param1
      ORDER BY COUNT(*) DESC;
    

    我针对我编写并提出的一些示例数据运行了修复后的查询。

    Sub grp_param()
        Dim cnx As Object, rs As Object, rs1 As Object
        Dim sWS1 As String, sWS2 As String, sWB As String, sCNX As String, sSQL As String
        Dim ws1TBLaddr As String
    
        ws1TBLaddr = Worksheets("Sheet4").Cells(1, 1).CurrentRegion.Address(0, 0)
        sWS1 = Worksheets("Sheet4").Name
    
        sWB = ThisWorkbook.FullName
        'for 64-bit Office
        'sCNX = "Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" & sWB _
            & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
        'for 32-bit or 64-bit Office
        sCNX = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sWB _
            & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
        Debug.Print sCNX
    
        Set cnx = CreateObject("ADODB.Connection")
        Set rs = CreateObject("ADODB.Recordset")
        Set rs1 = CreateObject("ADODB.Recordset")
    
        cnx.Open sCNX
    
        'Select param0,count(param0) From [Sheet1$] where eventid='addToCart'
        ' group by param0 order by count(param0) desc;
        sSQL = "SELECT param0, COUNT(param0) " & _
               "FROM [" & sWS1 & "$" & ws1TBLaddr & "] " & _
               "GROUP BY param0 " & _
               "ORDER BY count(param0) DESC;"
        Debug.Print sSQL
    
        rs.Open sSQL, cnx
    
        With Worksheets.Add(after:=Sheets(Sheets.Count))
            .Name = "Summary Data"
            .Range("A1").Resize(1, 2) = Array("param0", "count")
            .Range("A2").CopyFromRecordset rs
        End With
    
        'Select eventid,param0,param1,count(*) From [Sheet1$] where eventid='search'
        'group by param0, param1 order by count(*) desc;
        sSQL = "SELECT eventid, param0, param1, COUNT(*) " & _
               "FROM [" & sWS1 & "$" & ws1TBLaddr & "] " & _
               "GROUP BY eventid, param0, param1 " & _
               "ORDER BY count(param0) DESC;"
        Debug.Print sSQL
    
        rs1.Open sSQL, cnx
    
        With Worksheets(Sheets.Count)
            .Range("E1").Resize(1, 3) = Array("eventid", "param0", "count")
            .Range("E2").CopyFromRecordset rs1
        End With
    
        rs.Close: Set rs = Nothing
        rs1.Close: Set rs1 = Nothing
        cnx.Close: Set cnx = Nothing
    
    End Sub
    

    我不清楚为什么 mySQL 允许最后一个查询,但我的背景是 T-SQl,它肯定会因此而窒息。

    【讨论】:

    • 谢谢!我删除了第一个 eventid,然后它就可以工作了。
    【解决方案2】:

    对于第一个困惑,我注意到这里的帖子:link,但我不想添加另一个文件进行处理,所以最后没有其他选择,我通过添加4来预处理文件标题行正下方的文本行。 (就我而言,所有字段都可以是文本;我在 MySQL 中这样做了)由于数据量很大,这些虚拟文本不会影响结果,但可以帮助我正确生成数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 2021-07-06
      • 2019-06-08
      • 1970-01-01
      • 2017-03-21
      相关资源
      最近更新 更多