MS Excel中的外部连接

你有一个想法如何join两个表与外部联接? 知道在SQL中这样做,但我现在需要Excel。

我有一列所有员工的列表,我有一个每个员工的任务表。 我想创build一个函数,这将填补失踪员工的表。

表1 – 所有员工的名单

费尔南多
赫克托
维维安
伊万

表2 – 实际任务列表

费尔南多,任务A,5个小时
维维安,任务B,8个小时

结果我想实现

费尔南多,任务A,5个小时
维维安,任务B,8个小时
赫克托,0个小时
伊凡,0小时

非常感谢任何想法。

如果你使用ADO,确实有这样的事情在Excel中左连接。

转到VBA编辑器(Alt-F11),并添加一个参考(工具>参考)到“Microsoft ActiveX数据对象2.8库”。 创build一个新的正常模块(插入>模块)并添加以下代码:

Option Explicit Sub get_employees() Dim cn As ADODB.Connection Set cn = New ADODB.Connection ' This is the Excel 97-2003 connection string. It should also work with ' Excel 2007 onwards worksheets as long as they have less than 65536 ' rows 'With cn ' .Provider = "Microsoft.Jet.OLEDB.4.0" ' .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _ ' "Extended Properties=Excel 8.0;" ' .Open 'End With With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties=""Excel 12.0 Macro;IMEX=1;HDR=YES"";" .Open End With Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Open "SELECT * FROM [Sheet1$] LEFT JOIN [Sheet2$] ON [Sheet1$].[EMPLOYEE] = " & _ "[Sheet2$].[EMPLOYEE]", cn Dim fld As ADODB.Field Dim i As Integer With ThisWorkbook.Worksheets("Sheet3") .UsedRange.ClearContents i = 0 For Each fld In rs.Fields i = i + 1 .Cells(1, i).Value = fld.Name Next fld .Cells(2, 1).CopyFromRecordset rs .UsedRange.Columns.AutoFit End With rs.Close cn.Close End Sub 

保存工作簿,然后运行代码,您应该在Sheet3上得到一个左join列表。 你会看到Employee列是重复的,但你可以通过适当地修改SELECT子句来sorting。 在没有匹配的情况下,您也将拥有空白单元格,而不是0个小时

编辑:我已经在代码注释中留下了Excel 97-2003连接string的详细信息,但已将代码更改为使用Excel 2007起始连接string。 我还添加了代码来输出字​​段名称,并在输出logging集后自动调整列

简单的方法(也许是唯一的方法?)将与中间单元格:

在“结果”工作表中:

  A, B, CD fernando, vlookup(...), vlookup(...), =if(ISNA(B2),"<default-1>"), =if(ISNA(B2),"deafult2) 

然后隐藏列C和B

编辑:

实际上有一些关系: 枢轴表 。 您可以以这样的方式组织数据,即非引用的单元格将保持空白。

但这是一个不同的解决scheme – 可能不适合,取决于您的使用情况。

这种方法可以复制粘贴,过滤和sorting,从而在Excel中完成外部连接,而且只需一次就可以完成。 这个想法是使用VLOOKUP从左到右查找所有匹配的logging,右到左表。 [在表2中添加另一个logging以显示外连接]

表格1

 Fernando Hector Vivian Ivan 

表2

 Fernando, task A, 5 hours Vivian, task B, 8 hours Thomas, task A, 5 hours 

将两个表复制到一个表中,其中表1将占据第一个左列和第一行,而表2将占据最后的右列和最后一行(这两个表的标题应该是第一行)。 为接下来的两列创build一个VLOOKUP函数,从左到右表格和右到左表格中查找匹配的键。

表3

 Name Name Task Hours Match 1 Match 2 Fernando =VLOOKUP(A2,B:B,1,FALSE) =VLOOKUP(B2,A:A,1,FALSE) Hector =VLOOKUP(A3,B:B,1,FALSE) =VLOOKUP(B3,A:A,1,FALSE) Vivian =VLOOKUP(A4,B:B,1,FALSE) =VLOOKUP(B4,A:A,1,FALSE) Ivan =VLOOKUP(A5,B:B,1,FALSE) =VLOOKUP(B5,A:A,1,FALSE) Fernando task A 5 hours =VLOOKUP(A6,B:B,1,FALSE) =VLOOKUP(B6,A:A,1,FALSE) Vivian task B 8 hours =VLOOKUP(A7,B:B,1,FALSE) =VLOOKUP(B7,A:A,1,FALSE) Thomas task B 8 hours =VLOOKUP(A8,B:B,1,FALSE) =VLOOKUP(B8,A:A,1,FALSE) 

表3结果

 Name Name Task Hours Match 1 Match 2 Fernando Fernando N/A Hector N/AN/A Vivian Vivian N/A Ivan N/AN/A Fernando task A 5 hours N/A Fernando Vivian task B 8 hours N/A Vivian Thomas task B 8 hours N/AN/A 

:对于大数据集,由于发生VLOOKUP计算,下一步将需要很长时间。 复制并粘贴匹配1和匹配2列的列,以便在过滤期间不重新计算VLOOKUP。

在匹配1和匹配2上过滤仅查看所有N / A结果。 将主数据复制到另一个带有标题的工作表。

 Name Name Task Hours Match 1 Match 2 Hector N/AN/A Ivan N/AN/A Thomas task B 8 hours N/AN/A 

在匹配1和匹配2上过滤不会看到N / A结果。 为两者sorting键,以便在复制和粘贴所有内容时匹配。 将表1数据复制并粘贴到先前粘贴的数据下方的新工作表中。 然后将表2数据复制并粘贴到刚刚粘贴的表1数据的右侧。

 Name Name Task Hours Match 1 Match 2 Fernando Fernando N/A Vivian Vivian N/A Fernando task A 5 hours N/A Fernando Vivian task B 8 hours N/A Vivian 

结果如下,你可以删除,sorting,外部连接的数据。

 Name Name Task Hours Hector Ivan Thomas task B 8 hours Fernando Fernando task A 5 hours Vivian Vivian task B 8 hours 
Interesting Posts