使用VBA和ADODB在Excel中精梳表格

使用Excel VBA我希望能够将excel中的两个表与一个公共密钥相结合。 我build议ADODB作为一种方法,但是可以使用其他更高效/优雅的方法。 请看下面的例子:

我有以下开始…

工作表Sheet1

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

Sheet2中

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

并想结合它,以便我有以下结果:

表Sheet 3

  ABCDE 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 

做了一些谷歌search和SQLtypes的外部连接似乎接近,但不知道如何实现它。

以下是用于尝试和实施它的代码…

 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 

所以JET不支持完整的外连接,所以我最终不得不使用左连接重写,然后右连接来检查我们错过的types:

 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 

stream程是这样的:

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

如果您有任何问题或者我错过了什么,请告诉我。

编辑查询:我意识到不需要第三步,这是过度的。