如何在VBA中的记录集上执行SQL查询?

时间:2017-11-13 20:59:35

标签: excel-vba adodb recordset vba excel

我正在使用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查询的所有数据。我不想像前面提到的链接那样直接查询工作表。

1 个答案:

答案 0 :(得分:0)

我意识到这是一个老话题,但是由于没有答案,我将发布我的笨拙解决方案。

基本原理是...

  1. 在工作簿中创建一个临时工作表(tempRS)以供临时使用
  2. (可选)遍历记录集字段,并从A1开始写入tempRS工作表的第一行,因此我们的新记录集将具有要使用的列名。
  3. 使用ThisWorkbook.Sheets("tempRS").Range("A2").CopyFromRecordset rs
  4. 将记录集粘贴到新表中
  5. 您现在有了一张工作表,可以像平常一样用SELECT * FROM [tempRS$]
  6. 查询
  7. (可选)如果原始记录集具有客户端游标(rs.CursorLocation = 3),请使用此游标来计算SELECT语句的范围,而不是整个工作表的范围,因此您将以SELECT * FROM [tempRS$A1:N30] < / li>
  8. 删除tempRS工作表

也许有更好的解决方案,但我不知道有没有其他方法可以直接查询记录集而无需其他库。