【发布时间】:2021-05-18 00:55:51
【问题描述】:
我正在尝试从另一个工作簿中提取当前 Excel 中的数据,并且我想防止读取重复数据,因为该宏将在周末在用户的 Excel 文件上运行,所以我会使用“Not In”选择SQL 通过写入两个 ADODB.Connection 来读取新数据:
Dim szConnect As String
Dim szSQL As String
Dim strCon As String
Dim strSQL As String
'''''''''''''''''''''''''''''''''''''''''''''''
Dim cn As Object
Dim rs As Object
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
strSQL = "SELECT * FROM [A1:J10000]"
cn.Open strCon
rs.Open strSQL, cn, 0, 1, 1
''''''''''''''''''''''''''''''''''''''''''''''
Dim rsCon As Object
Dim rsData As Object
Set rsCon = CreateObject("ADODB.Connection")
Set rsData = CreateObject("ADODB.Recordset")
SourceFile = "C:\Users\Windows\Desktop\test.xlsm"
SourceRange$ = "A1:J10000"
SourceSheet$ = "Data"
szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & SourceFile & ";" & _
"Extended Properties=""Excel 12.0;HDR=yes"";"
szSQL = "SELECT * FROM [" & SourceSheet$ & "$" & SourceRange$ & "] WHERE [Name] Not in (select [Name] from rs) ;"
rsCon.Open szConnect
rsData.Open szSQL, rsCon, 0, 1, 1
sheet4.Cells(2, 1).CopyFromRecordset rsData
运行后出现此错误:
【问题讨论】:
-
rs 仅存在于您的代码中。在第二个查询的 SQL 中,尝试将其替换为子查询。
-
不,先生,rs只使用一次:rs.Open strSQL, cn, 0, 1, 1 我在“szSQL”中使用它作为记录集
-
您将 rs 引用为 rsCon 中的子数据集。 rsCon 连接不知道 rs 是什么。不幸的是,我认为没有办法将来自多个 VBA 工作簿连接的数据组合到一个查询中。至少,我从未见过它,也找不到任何东西。可能必须将外部工作簿中的数据带入一张活动工作簿中。或者也许探索 MS PowerQuery 加载项应用程序。它可能能够同时查看工作簿并构建嵌套查询。
-
无论此 VBA 位于何处(Excel、Access、Word 等),一个记录集都不可能在其 SQL 语句中嵌入另一个记录集。