【问题标题】:How do you perform a SQL query on a recordset in VBA?如何在 VBA 中对记录集执行 SQL 查询?
【发布时间】:2017-11-13 20:59:34
【问题描述】:

我正在使用 Excel VBA,其中我位于不同工作表的不同位置,我需要在这些工作表上运行一些 SQL 查询。

首先,我拼凑了一些“简单”的功能来尝试概念验证,看看我是否可以让它工作。到目前为止,我有这个:

    Private rstADO As ADODB.Recordset

Private Function StartEre()

    Call SetupRecordset
    Call Add("123", "ab", "ba")
    Call Add("321", "ba", "ab")

    Dim rs As ADODB.Recordset
    Set rs = search("123", rstADO)

End Function

Private Function search(emp As String, oRecordset As ADODB.Recordset) As ADODB.Recordset

    Dim strSQL As String
    Dim cn As New ADODB.Connection
    Dim rs As ADODB.Recordset

    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 8.0;HDR=Yes"";"

    strSQL = "SELECT EmployeeID FROM oRecordset"
    Set rs = cn.Execute(strSQL)

    Set search = rs

End Function

Private Function Add(emp As String, first As String, last As String)

    Dim fieldsArray(2) As Variant
    Dim values(2) As Variant

    fieldsArray(0) = "EmployeeID"
    fieldsArray(1) = "FirstName"
    fieldsArray(2) = "LastName"
    values(0) = emp
    values(1) = first
    values(2) = last

    Call rstADO.AddNew(fieldsArray, values)

End Function


Private Function SetupRecordset()

    Dim fld As ADODB.Field

    Set rstADO = New ADODB.Recordset

    With rstADO
        .Fields.Append "EmployeeID", adInteger, , adFldKeyColumn
        .Fields.Append "FirstName", adVarChar, 10, adFldMayBeNull
        .Fields.Append "LastName", adVarChar, 20, adFldMayBeNull

        .CursorType = adOpenKeyset
        .CursorLocation = adUseClient
        .LockType = adLockPessimistic
        .Open
    End With

End Function

我的问题出在search 函数中,我有我的 SQL 字符串:

strSQL = "SELECT EmployeeID FROM oRecordset"

如何让FROM 子句指向提供给该函数的记录集? 这只是一个简单的函数,但最终会出现(如果我能让它工作的话)许多函数,它们具有执行不同操作的不同 SQL 查询。

编辑: 已被识别为来自 Performing SQL queries on an Excel Table within a Workbook with VBA Macro 的可能重复项,我想澄清一下。

提到的帖子查询工作表中的范围,而我想查询预填充的记录集。我的search 函数有一个参数 - oRecordset,其中包含我想使用 SQL 查询的所有数据。我不想像前面提到的链接那样直接查询工作表。

【问题讨论】:

标签: excel adodb recordset vba


【解决方案1】:

我意识到这是一个旧线程,但由于没有答案,我将发布我相当笨拙的解决方案。

基本原理是……

  1. 在工作簿中创建一个空工作表 (tempRS) 以供临时使用
  2. (可选)循环遍历记录集字段并写入从 A1 开始的 tempRS 工作表的第一行,因此我们的新记录集将具有可使用的列名。
  3. 将记录集粘贴到带有ThisWorkbook.Sheets("tempRS").Range("A2").CopyFromRecordset rs 的新工作表中
  4. 您现在有一个工作表,您可以像平常一样使用SELECT * FROM [tempRS$] 之类的内容进行查询
  5. 可选地,如果您的原始记录集有一个客户端光标 (rs.CursorLocation = 3),则使用它来计算 SELECT 语句的范围,而不是整个工作表,这样您最终会得到 SELECT * FROM [tempRS$A1:N30]
  6. 删除 tempRS 表

可能有更好的解决方案,但我不知道有任何其他方法可以直接查询记录集而无需额外的库。

【讨论】:

  • 基本上:可以使用 SQL 查询来获取记录集,但不能将 SQL 查询直接应用于记录集。记录集有自己的过滤和排序方法。但是,您可以将记录集导出为可以查询的格式。导出到 CSV 的答案在这里:stackoverflow.com/questions/21205627/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
相关资源
最近更新 更多