【问题标题】:Combing Tables in Excel using VBA and ADODB [duplicate]使用 VBA 和 ADODB 在 Excel 中组合表格 [重复]
【发布时间】:2014-11-01 00:04:04
【问题描述】:

使用 Excel VBA 我希望能够将 Excel 中的两个表与一个公共键组合在一起。我建议将 ADODB 作为一种方法,但我对任何其他更有效/优雅的方法持开放态度。请参阅下面的最小示例:

我有以下开始...

表 1

    A     B       C
 1 type year1   year2
 2 aaa  100     110
 3 bbb  220     240
 4 ccc  304     200
 5 ddd  20      30
 6 eee  440     20

表 2

    A     B       C
 1 type year1   year2
 2 bbb  10      76
 3 ccc  44      39
 4 ddd  50      29
 5 eee  22      23
 6 fff  45      55

并且想将它结合起来,因此我得到以下结果:

表 3

    A     B       C       D       E
 1 type year1   year2   year1   year2
 2 aaa  100      110      0       0
 3 bbb  220      240      10      76
 4 ccc  304      200      44      39
 5 ddd  20       30       50      29
 6 eee  440      20       22      23
 7 fff  0        0        45      55

已经做了一些谷歌搜索,SQL 类型的外连接似乎很接近,但不知道如何实现它。

下面是目前为止用来尝试和实现它的代码...

Option Explicit



Sub JoinTables()

 Dim cn As ADODB.Connection
 Set cn = New ADODB.Connection


 With cn
     .Provider = "Microsoft.Jet.OLEDB.4.0"
     .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _
         "Extended Properties=Excel 8.0;"
     .Open
 End With

 Dim rs As ADODB.Recordset
 Set rs = New ADODB.Recordset

 rs.Open "SELECT * FROM [Sheet1$] OUTER JOIN [Sheet2$] ON [Sheet1$].[type] = " & _
     "[Sheet2$].[type]", cn

 With Worksheets("Sheet3")
     .Cells(2, 1).CopyFromRecordset rs
 End With

 rs.Close
 cn.Close

 End Sub

【问题讨论】:

  • @Fionnuala 据我记得 ADODB 不支持外部联接,因此指向您的答案的链接在这里并没有真正的帮助
  • @vba4all 带有 Jet 或 ACE 驱动程序的 ADODB 几乎支持 MS Access SQL 支持的任何东西,包括外连接。它已经做了很长时间了。

标签: sql vba excel adodb


【解决方案1】:

所以 JET 不支持完全外连接,所以我最终不得不使用左连接和右连接重写它以检查我们错过的类型:

Sub Button1_Click()

 Dim cn As ADODB.Connection
 Set cn = New ADODB.Connection


 With cn
     .Provider = "Microsoft.Jet.OLEDB.4.0"
     .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _
         "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"
     .Open
 End With

 Dim rs As ADODB.Recordset
 Set rs = New ADODB.Recordset



  rs.Open "SELECT [Sheet1$].[Type] AS Type" & _
  " ,[Sheet1$].[Year1] as Year11" & _
  " ,[Sheet1$].[Year2] as Year21" & _
  " ,[Sheet2$].[Year1] as Year12" & _
  " ,[Sheet2$].[Year2] as Year22" & _
  " FROM [Sheet1$] LEFT JOIN [Sheet2$] ON [Sheet1$].[type] = " & _
     "[Sheet2$].[type] UNION ALL " & _
     " SELECT [Sheet2$].[Type] AS Type" & _
  " ,[Sheet1$].[Year1] as Year11" & _
  " ,[Sheet1$].[Year2] as Year21" & _
  " ,[Sheet2$].[Year1] as Year12" & _
  " ,[Sheet2$].[Year2] as Year22" & _
  " FROM [Sheet1$] RIGHT JOIN [Sheet2$] ON [Sheet1$].[type] = " & _
 "[Sheet2$].[type] WHERE [Sheet2$].[type] NOT IN (SELECT type FROM [Sheet1$]) ", cn

 With Worksheets("Sheet3")
     .Cells(2, 1).CopyFromRecordset rs
 End With


 rs.Close
 cn.Close

End Sub

流程是这样的:

  1. 获取 Sheet1 和 Sheet2 之间的匹配项
  2. 获取 Sheet2 和 Sheet1 之间的匹配项,我们在之前的查询中没有得到这些匹配项

如果您有任何问题或我遗漏了什么,请告诉我。

编辑了查询:我意识到不需要第三步,这太过分了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2021-09-28
    • 2010-09-18
    • 2013-02-22
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多