【问题标题】:Using "NOT IN" select in ADODB.Connection在 ADODB.Connection 中使用“NOT IN”选择
【发布时间】: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 语句中嵌入另一个记录集。

标签: sql excel vba adodb


【解决方案1】:

下面是一个引用两个不同工作簿的查询示例:

Sub CrossFileQuery()

    Dim fold As String, fPath1, fPath2
    Dim conn As Object, rs As Object
    
    fold = ThisWorkbook.Path & "\"
    
    fPath1 = fold & "Source1.xlsx"
    fPath2 = fold & "Source 2.xlsx"
    
    Set conn = CreateObject("ADODB.Connection")
    
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
              "Data Source = " & fPath1 & _
              ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
              
    Set rs = CreateObject("ADODB.Recordset")
    
    rs.Open " select a.* from [Sheet1$] a " & _
            " where a.FirstCol not in " & _
            " (select b.FirstCol from [" & fPath2 & "].[Sheet1$] b)", conn
    
    With Sheet1.Range("A1")
        .CurrentRegion.ClearContents
        .CopyFromRecordset rs
    End With

End Sub

【讨论】:

  • 非常感谢,太好了。
猜你喜欢
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多