Excelで完全外部結合をシミュレートする方法は?


34

Excelに(実際のデータベースにはない)データがあると仮定します。1つのシートに、1つの列がIDとして機能するデータがあり、この列の値が一意であることを確認しました。別のシートでは、IDとして取得できる1つの列を持つデータもありますが、これも一意です。シート1の行Nに値があり、シート2の行Mに同じ値がある場合、行Nと行Mは同じ実世界のオブジェクトを記述していると確信します。

私が求めているのは、マクロを作成せずに完全な外部結合と同等のものを取得するにはどうすればよいですか?リボンからアクセスできる数式とすべての関数はOKです。

小さな「再生データ」の例:

シート1:

Dostoyevski    Russia
Pushkin        Russia
Shelley        England
Flaubert       France
Hugo           France
Eichendorff    Germany
Byron          England
Zola           France

シート2:

Shelley        Percy Bysshe
Eichendorff    Josef Freiherr Von
Flaubert       Gustave
Byron          Lord
Keller         Gottfried
Dostoyevski    Fyodor
Zola           Emile
Balzac         Honoré de

必要な出力(ソートは重要ではありません):

Dostoyevski    Russia   Fyodor
Pushkin        Russia
Shelley        England  Percy Bysshe
Flaubert       France   Gustave
Hugo           France
Eichendorff    Germany  Josef Freiherr von
Byron          England  Lord
Zola           France   Emile
Keller                  Gottfried
Balzac                  Honoré de

このシナリオに怖がっているすべての人に:これが間違ったやり方であると知っています。選択肢があれば、Excelを使用しません。ただし、実用的な解決策が必要な状況は十分にあり、stat、およびより良い(ITの観点から)ソリューションを適用できません。


両方のリストを並べ替えて並べると、目的の列を手動で簡単に一致させることができます。大量のデータがある場合は、2つの範囲を取り、これを行う関数を作成できます。
ダン

@Danが言ったように、私は関数を書かずにこれを行うこと求めています。私がそれを書くことができる状況では、解決策は些細なことです(少なくとも私にとっては、以前にVBAを書いたことがあるため)
-rumtscho

Excelは、データ接続を介したSQLクエリをサポートしています。私はそれがひどいので、残念ながらこれ以上のアドバイスを提供することはできませんが、あなたのために調べる価値があるかもしれません。
カイル

@Kyle私は答えにそのオプションを追加しました。それは気弱な人のためではなく、これは遊ぶのが面倒だし、過剰なやりすぎをするかもしれませんが、そうではありません!
エンダーランド

回答:


43

簡単なアプローチ-標準のExcel操作

まず、両方のテーブルから両方のキー列を単一の列として単一の新しいシートにコピーして貼り付けます。

「重複の削除」を使用して、すべての一意のキーの単一のリストを取得します。

次に、2つの列(この場合)を追加します。各テーブルのデータ列ごとに1つです。数式をより見栄えよくするため、この形式をテーブルオプションとして使用することもお勧めします。vlookupを使用して、次の式を使用します。

=IFERROR(VLOOKUP([@ID],Sheet4!A:B,2,FALSE),"")

where Sheet4!A:Bは、それぞれの値に対するソーステーブルのデータテーブルを表します。IFERRORは、vlookupが成功しない場合に表示される#い#N / A結果を防ぎ、この場合は空白のセルを返します。

これにより、結果のテーブルが得られます。


Sheet3:

ここに画像の説明を入力してください

Sheet4:

ここに画像の説明を入力してください

結果データ:

ここに画像の説明を入力してください

結果式(Ctrl+ ~はこれを切り替えます):

ここに画像の説明を入力してください


組み込みのSQLクエリ

組み込みのSQLクエリを使用してこれを行うこともできます。それは...ユーザーフレンドリーではありませんが、おそらくより良いユースケースになるでしょう。これには、おそらく「ソース」データをテーブルとしてフォーマットする必要があります。

  1. 新しいシートのセルをクリックします
  2. データに移動->他のソースから-> Microsoft Queryから
  3. [データベース]タブでExcelファイル*を選択し、[OK]をクリックします
  4. ワークブックを選択してください
  5. 次の4つのフィールドを選択します。
    • ここに画像の説明を入力してください
  6. 表示されている素敵な1990年代の警告で「次へ」と「OK」をクリックします
  7. 以下の手順に従って参加最初のLEFT OUTERを作成します。私の場合、左のソースとして「国」テーブルを使用し、右の「名前」テーブルを使用しています。
    • ここに画像の説明を入力してください
    • これは一部の行のみを提供します(IDで結合するため)
  8. 「減算結合を作成し、それを結合として追加する」部分はより複雑です。

    • 減算結合の構成は次のとおりです。 ここに画像の説明を入力してください
    • この結合のSQLを[SQL]ボタンからコピーします。
    • SELECT countries$.ID、countries$.Val1、names$.ID 、names$. Val2 FROM {oj C:\Users\Username\Desktop\Book2.xlsxcountries$ countries$LEFT OUTER JOIN C:\Users\Username\Desktop\Book2.xlsxnames$ names$ON countries$.ID = names$.ID} WHERE(names$.IDはヌル)

  9. 作成した最初の外部結合に戻ります。SQLを手動で編集し、

    • Union一番下に追加
    • 上記の減算結合テキストを結合の下部に追加します
  10. [SQL]ボタンのすぐ左にある[データを返す]ボタンをクリックします
    • この時点で必要な特定のデータのみを選択するようにSQLを編集できます。結果の列を非表示にする方が簡単だと思います。
  11. クエリをどこかに配置し、その場所を確認します
    • ここに画像の説明を入力してください

気弱な人向けではありません。しかし、Officeの更新されていない可能性のある部分をOfficeで表示する絶好のチャンスが必要な場合は、絶好のチャンスです。


1
[@ID]表記のリファレンスはありますか?私はそれが機能することを疑いませんが、私はそれを前に見たことがなく、私はExcelで多くの仕事をします。
TJL

1
@TJLテーブルをテーブルとしてフォーマットする場合、他の列を参照するためにそのような表記法を使用します。セル参照よりもはるかに明確です。2010+の機能ですか?よく分かりません。私は..前に2010年までの十分なテーブルとして書式設定の魔法を使用していませんでした
enderland


元のクエリで単語LEFTを単語FULLに変更することはできませんか?ACE OLEDBドライバーを使用してクエリを実行しているだけで、FULL JOIN構文をサポートしていると確信しています。
カイル・ヘイル

14

代替ソリューションとして、Power Queryを提案できますか?これは、基本的にまさにこのようなことを実行するためのMicrosoftの無料のExcelアドインです。その機能は、実際にはExcel 2016にも直接組み込まれるため、将来にわたって使用できます。

とにかく、Power Queryを使用すると、手順は非常に簡単です。

  1. 両方のテーブルをクエリとしてPower Query Editorにインポートします。
  2. それらに対してマージクエリ変換を実行し、適切な結合列を設定し、結合タイプを完全外部として設定します。
  3. 結果テーブルを新しいシートにロードします。

これの便利な点は、一度設定すると、ベースデータテーブルに変更を加えた場合、[データ]> [すべて更新]を押すだけで、Power Query結果シートも更新されます。


本当に面白いです。レストランを所有している私の友人がMS Officeについて尋ねてきて、MS Accessを含まない彼の2016スイートを見せてくれました。なぜそうなったのかがわかりました。Excelには多くの制限がありました。2003年以降に購入した機能はどれも価値がなく、新しい外観も好きではなかったためです。2010以降。Accessはこれ以上のことをすべて行うので、質問があります。なぜAccessがこれを達成する方法なのに、Excelでデータベースを操作しようとする人が非常に多いのでしょうか。私が見ることができる唯一のことは、おそらく優れたAccess DBを動作させるためには、優れたVB経験も必要だということです。
ejbytes

@ejbytesほとんどの人はスプレッドシートの概念を理解しています。ほとんどの人は...データベースの概念を理解していません。私は、データベースへのスプレッドシートとして、データベースプロジェクトを変換するプロジェクトを持っていたユーザーはまだ「スプレッドシート」と呼んだ-でも、どのようにデータベースの作品のための大規模な説明の後に!
エンダーランド

@enderlandあなたは正しいと思います。厳密ではないルールと不連続な柔軟性を備えたスプレッドシート...およびフィルターに偽装されたクエリ。仮のテーブルとリストのためのプラットフォーム。
ejbytes

@ejbytes tldrバージョンは、MSがExcelの列ストアメモリエンジンをテストして、より多くの行を追加することを望んでいました。現在、すべてのツールをPowerBIとしてロールアップしています。
カイル・ヘイル

@KyleHale Office 2010を使用しており、FULL OUTER JOINを実行しようとしていますが、Power Queryは、最初のテーブルにない2番目のテーブルのIDを無視します。
-GeMir

0

(外部結合)を半シミュレーションする簡単な方法は、2番目のリストを取得して、最初のリストの下に直接貼り付けることです。つまり、(プライマリキー)がすべて同じ(プライマリ)列になります。次に、そのプライマリ列を並べ替え、インターリーブされたリストになり、転置されたIF方程式を実行します(スーパーユーザーがテーブルレイアウトビューを台無しにします)。

listA listB


サムブルーティム32874ティムレッドマリー5710クリスグリーングスタフ047フレッドブルー
マリーブラック

コピー/貼り付け/並べ替え、結果は次のようになります。ABクリスグリーンフレッドブルーgustav 047メアリー5710メアリーブラックサムブルーティム32874ティムレッド

セルc1の式:(c1)= if(A1 = A2、B2)

結果は次のようになります。

ABC chris green FALSE fred blue FALSE gustav 047 FALSE mary 5710 black mary black FALSE sam blue FALSE tim 32874 red tim red FALSE

Cをソートして、偽などを取り除きます。これはアイデアの基本バージョンであり、さらにデータが必要な場合は展開します。-wag770310


これを何らかの方法でフォーマットして読みやすくできますか?
davidbaumann
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.