
[英]Using Excel VBA, How do I limit the results of a query using ADODB.connection & ADODB.Recordset?
[英]How do you perform a SQL query on a recordset in VBA?
我在不同工作表的不同位置使用 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
我的问题出在我拥有 SQL 字符串的search
功能中:
strSQL = "SELECT EmployeeID FROM oRecordset"
如何让FROM
子句指向提供给这个函数的记录集? 这只是一个简单的函数,但最终将有(如果我可以让它工作)许多函数具有不同的 SQL 查询执行不同的操作。
编辑:从使用 VBA 宏在工作簿中的 Excel 表上执行 SQL 查询中被识别为可能的重复项,我想增加清晰度。
帖子提到从工作表查询范围,而我想查询预填充的记录集。 我的search
函数有一个参数 - oRecordset,它包含我想使用 SQL 查询的所有数据。 我不想像前面提到的链接那样直接查询工作表。
我意识到这是一个旧线程,但由于它没有得到答复,我将发布我相当笨拙的解决方案。
基本原理是...
ThisWorkbook.Sheets("tempRS").Range("A2").CopyFromRecordset rs
将记录集粘贴到新工作表中SELECT * FROM [tempRS$]
rs.CursorLocation = 3
),使用它来计算 SELECT 语句的范围,而不是整个工作表,这样您最终会得到SELECT * FROM [tempRS$A1:N30]
可能有更好的解决方案,但我不知道有任何其他方式可以直接查询记录集而无需其他库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.