2013-03-03 41 views
4

你有一個想法如何加入與外兩個表加入?知道在SQL中這樣做,但我現在需要Excel。外連接在MS Excel

我有所有員工的列表中一列 我有任務的表爲每一位員工。我想創建一個函數,該函數將填充失蹤員工的表。

表1 - 所有員工的名單

 
Fernando 
Hector 
Vivian 
Ivan 

表2 - 的實際任務

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

結果列表我想實現

 
Fernando, task A, 5 hours 
Vivian, task B, 8 hours 
Hector, , 0 hours 
Ivan, , 0 hours 

非常感謝任何想法。 (?可能是唯一的方式)

回答

0

的簡單的方式將與中間細胞:

在 「結果」 的工作表:

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

然後隱藏COLS C和B

編輯:

實際上有些東西關閉:樞軸表。您可以組織以這樣的方式,非refered 細胞會留下空數據。

但是,這不是公式不同的解決方案 - 它可能不適合,取決於您的使用。

+0

您可能會得到較短的答案(?),但不一定更容易實施或維護(!) – 2013-03-03 02:51:10

+0

vlookup只帶來第一個值。我的意思是,如果同一名員工在表格2中出現超過一次,您將無法獲得該價值。也許他應該只找到失蹤的員工,然後在有任務的員工的下面剪切和粘貼結果... – cesarse 2013-03-03 03:04:24

+1

在Excel中沒有左外連接這樣的事情嗎? – user2127956 2013-03-03 09:55:35

5

確實是有這樣的事,作爲一個左在Excel中加入如果您使用ADO。

轉到VBA編輯器(Alt-F11)並向「Microsoft ActiveX Data Objects 2.8 Library」添加引用(工具>參考)。創建一個新的正常的模塊(插入>模塊),並添加以下代碼:

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 

保存工作簿,然後運行代碼,你應該得到上表Sheet 3左加入列表。您將看到Employee列被重複,但您可以通過適當地修改SELECT子句對其進行排序。您還可以有空白單元格,而不是0小時那裏沒有比賽

編輯:我已經離開了Excel 97-2003連接字符串的詳細信息代碼中的註釋,但已改爲使用的代碼Excel 2007起始連接字符串代替。我還添加代碼,以輸出列後的字段名和自動調整記錄已經輸出

+1

這種技術應該廣爲人知! – HarveyFrench 2015-05-13 08:07:40

+0

偉大的代碼,快速和容易。不過,我會在文件末尾獲得以F開頭的多列。任何想法,只是對於風格點而言並不重要。 – Lowpar 2017-03-02 15:47:53

+0

如果有任何沒有標題的列,則ADO會創建一個默認列名,以F開頭,後面跟一個數字 – barrowc 2017-03-02 23:41:27

0

此方法不會複製和粘貼,篩選和排序,以實現外Excel中加入和良好的只是一個權衡。這個想法是使用VLOOKUP從左到右查找所有匹配的記錄,並從右到左查找。[添加另一條記錄到表2,以顯示外部聯接]

表1

Fernando 
Hector 
Vivian 
Ivan 

表2

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

複印兩個表整理爲一個表,其中表1將佔用第一左列第一行和表2將佔用最後的右列和最後一行(這兩個表的標題應該是第1行)。爲接下來的兩列創建一個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/A  N/A 
Vivian       Vivian N/A 
Ivan        N/A  N/A 
     Fernando task A 5 hours N/A  Fernando 
     Vivian task B 8 hours N/A  Vivian 
     Thomas task B 8 hours N/A  N/A 

:對於大型數據集,下一步將採取因爲VLOOKUP計算出現這種情況的一個非常長的時間。複製並粘貼匹配1和匹配2列的列,以便在過濾期間不重新計算VLOOKUP。

在匹配1和匹配2上過濾僅查看所有N/A結果。將主數據複製到另一個帶有標題的工作表。在第1場和第2場

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

過濾至沒有看到N/A的結果。爲兩者排序鍵,以便複製和粘貼所有內容時匹配。將表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 

結果如下,您可以刪除,排序,無論外部連接的數據。

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