4

外部結合で 2 つのテーブルを結合する方法を知っていますか? これを SQL で行うことはわかっていますが、今は Excel が必要です。

1 つの列にすべての従業員のリストがあり、すべての従業員のタスクの表があります。このテーブルに行方不明の従業員を入力する関数を作成したいと思います。

表 1 - 全従業員のリスト

フェルナンド
ヘクター
ビビアン
イヴァン

表 2 - 実際のタスクのリスト

Fernando、タスク A、5 時間
ビビアン、タスク B、8 時間

達成したい結果

Fernando、タスク A、5 時間
ビビアン、タスク B、8 時間
ヘクター, , 0 時間
イヴァン, , 0 時間

アイデアをありがとう。

4

3 に答える 3

5

ADO を使用している場合、Excel には左結合のようなものがあります。

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

ワークブックを保存してからコードを実行すると、シート 3 に左結合リストが表示されます。Employee 列が重複していることがわかりますが、SELECT 句を適切に修正することでそれを整理できます。また、一致しない 0 時間ではなく空白のセルが表示されます

編集:コード コメントに Excel 97-2003 接続文字列の詳細を残しましたが、代わりに Excel 2007 以降の接続文字列を使用するようにコードを変更しました。また、フィールド名を出力し、レコードセットが出力された後に列を自動調整するコードを追加しました

于 2013-03-04T01:05:39.487 に答える
0

この方法では、コピーと貼り付け、フィルター処理、および並べ替えを行って、Excel で外部結合を実行し、1 回限りの操作に適しています。アイデアは、VLOOKUP を使用して、左から右のテーブル、右から左のテーブルのすべての一致するレコードを検索することです。[テーブル 2 に別のレコードを追加して外部結合を表示]

表1

Fernando
Hector
Vivian
Ivan

表 2

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

両方のテーブルを 1 つのテーブルにコピーします。ここで、テーブル 1 は最初の左の列と最初の行を占め、テーブル 2 は最後の右の列と最後の行を占めます (ヘッダーは両方のテーブルの行 1 である必要があります)。次の 2 つの列の 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 計算が発生するため、次のステップに非常に長い時間がかかります。フィルター処理中に VLOOKUP が再計算されないように、一致 1 列と一致 2 列の列を値としてコピー アンド ペーストします。

一致 1 と一致 2 でフィルター処理して、すべての N/A の結果のみを表示します。メイン データをヘッダー付きの別のシートにコピーします。

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 のデータをコピーして、以前に貼り付けたデータの下の新しいシートに貼り付けます。次に、表 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
于 2015-12-10T16:52:10.037 に答える
0

簡単な方法 (おそらく唯一の方法?) は、中間セルを使用することです。

「結果」ワークシートで:

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

次に、列CとBを非表示にします

編集:

実際に近いものがあります: Pivot Table参照されていないセルが空のままになるようにデータを整理できます。

しかし、それは数式とは異なる解決策です。使用法によっては、適合しない場合があります。

于 2013-03-03T02:50:02.243 に答える