ExcelでPowerQueryを使ってデータを結合して出力する

ExcelでPowerQueryを使って複数のデータソースから収集したデータを結合して出力する方法を説明します。
Excelの関数ではVLOOKUPに相当し、PowerQueryではそれ以上のことが簡単な手順で実現できます。

# PowerQueryが対応する結合方法

共通のキーでデータAにデータBを結合する場合、下記の通りの結合方法が選択できます。

* 左外部結合
  * データAのすべての行にデータBにあるキーが同じ行を結合して出力します
  * VLOOKUPに近い使い方であり、デフォルトの結合方法です。
* 右外部結合
  * データBのすべての行にデータAにあるキーが同じ行を結合して出力します
* 完全外部結合
  * データAとデータBをすべて出力し、キーが同じ行を結合して出力します
* 内部結合
  * データAとデータBに同じキーがある行を結合して出力します
* 左反外部結合
  * データAのうちデータBに同じキーがない行を結合して出力します
* 右反外部結合
 * データBのうちデータAに同じキーがない行を結合して出力します

# 結合手順

PowerQueryでは結合をマージと呼びます。
デフォルトの結合方式である **左外部結合** を例に説明します。

## 用意したサンプルデータ

* user_mail.xls : 氏名とメールアドレスが記載されたExcelファイルです
* user_tel.csv : 氏名と電話番号が記載されたcsvファイルです

両方のファイルに氏名が記載されており、氏名をもとに結合できるデータです。
両方に存在する氏名、片方だけの氏名が存在しています。

## 手順

まずは[過去の記事](http://qiita.com/mosugi/items/71df310b35db81722d1e)と同様の手順でファイルを読み込んでいきます。

### Excelファイルの読み込み

**Excelから** をクリックします。

![2017-06-24 10_38_24.png](https://qiita-image-store.s3.amazonaws.com/0/24602/0328c4f0-b3b1-4770-a3de-5e238ef17c12.png)

ファイルを選択してOKをクリックします。

![2017-06-24 10_39_04.png](https://qiita-image-store.s3.amazonaws.com/0/24602/0373b568-a23a-d438-8a79-a43975fab21a.png)

読み込む対象のシートを選択して **編集** をクリックします。

![2017-06-24 10_40_19.png](https://qiita-image-store.s3.amazonaws.com/0/24602/169ca006-4442-f919-b795-4081f71e509e.png)

**先頭の行を見出しとして使用** をクリックします。
先頭行がテーブルの項目名に変換されます。

![2017-06-24 10_47_00.png](https://qiita-image-store.s3.amazonaws.com/0/24602/e44e4ab1-b454-e32d-3c5c-96b893498934.png)

編集手順が追加されたので、**閉じて読み込む** をクリックします。

![2017-06-24 10_47_27.png](https://qiita-image-store.s3.amazonaws.com/0/24602/2344d12c-9306-5163-52d6-b715a6710dbb.png)

データが読み込まれました。

![2017-06-24 11_27_17.png](https://qiita-image-store.s3.amazonaws.com/0/24602/06c28f5c-3b51-87bf-e039-3e1d48bc2d23.png)

### CSVファイルの読み込み

テキスト/CSVファイルからをクリックします。

![2017-06-24 10_27_05.png](https://qiita-image-store.s3.amazonaws.com/0/24602/c64cf481-dcf9-ee26-5cb4-e0f99c3859fe.png)

対象のファイルを選択します。

![2017-06-24 10_34_36.png](https://qiita-image-store.s3.amazonaws.com/0/24602/4e035b61-a3f4-5a14-66ce-893f613ee800.png)

プレビューを確認して **編集** をクリックします。
文字コードは自動認識されますが、認識されない場合は元のファイルの値を変更してください。

![2017-06-24 10_35_02.png](https://qiita-image-store.s3.amazonaws.com/0/24602/f5f3e28d-350b-dbe3-dd72-9697a9bb9d84.png)

**先頭の行を見出しとして使用** をクリックします。
先頭行がテーブルの項目名に変換されます。

![2017-06-24 10_36_11.png](https://qiita-image-store.s3.amazonaws.com/0/24602/3b3d698c-0f8f-885d-4444-4f482ae4e3de.png)

編集手順が追加されたので、**閉じて読み込む** をクリックします。

![2017-06-24 10_36_36.png](https://qiita-image-store.s3.amazonaws.com/0/24602/5e040276-02e3-d324-08ea-32036d667013.png)

データが読み込まれました。

![2017-06-24 10_37_16.png](https://qiita-image-store.s3.amazonaws.com/0/24602/df51c7db-c716-9924-ec2e-561b7944eae4.png)

### ExcelファイルとCSVファイルを結合

読み込んだ2つのデータを結合していきます。
例ではメールアドレスの表に電話番号の表を結合していきます。
両方のデータに共通する氏名をキーにして結合します。

メールアドレスの表を表示して、**クエリ**タブの**マージ**をクリックします。

![2017-06-24 10_48_21.png](https://qiita-image-store.s3.amazonaws.com/0/24602/a8e1d528-aef9-64ed-44e2-a0b8e4e2f31f.png)

マージのプレビューが表示されるので、user_telを結合する表として選択します。

![2017-06-24 10_48_59.png](https://qiita-image-store.s3.amazonaws.com/0/24602/60981369-57ff-53c7-dfd1-ca4aa6e0df61.png)

表が読み込まれキーを選択する準備ができました。

![2017-06-24 10_49_01.png](https://qiita-image-store.s3.amazonaws.com/0/24602/f93896e8-d02b-9d0f-2366-3cc82aba9789.png)

結合元のキー、結合先のキーをクリックし、OKをクリックします。
結合の種類のデフォルトは左外部結合です。
例では2件のデータのキーが一致したことが表示されています。

![2017-06-24 10_49_37.png](https://qiita-image-store.s3.amazonaws.com/0/24602/fd9939d1-3ee4-6bb6-50fb-cb3edfeadf58.png)

クエリエディターが起動するので、[過去の記事](http://qiita.com/mosugi/items/71df310b35db81722d1e)と同様の手順で展開します。

![2017-06-24 10_52_59.png](https://qiita-image-store.s3.amazonaws.com/0/24602/7e8d7593-c9ff-0ed2-bd51-d07327085bbf.png)

展開する列を選択します。
※氏名は重複する列なのでチェック不要ですが、他の結合の場合の例をわかりやすくするために残しています。

![2017-06-24 10_53_31.png](https://qiita-image-store.s3.amazonaws.com/0/24602/6c41ef48-5bce-cf47-1491-6d1c13d3e10f.png)

テーブルが展開されたので、**閉じて読み込む** をクリックしてシートに読み込みます。
例では一人一つの電話番号ですが、一人が複数の電話番号を持っている場合は行が追加されて展開されます。

![2017-06-24 11_05_30.png](https://qiita-image-store.s3.amazonaws.com/0/24602/79ed07a3-a998-b1b9-f6f1-a93e9ff8637e.png)

左外部結合なので、電話番号の無い氏名は電話番号の列が空欄になっています。

![2017-06-24 12_33_57.png](https://qiita-image-store.s3.amazonaws.com/0/24602/1c1e3090-b05c-a1ec-aed5-e59377242ad2.png)

## 他の結合方法を選択した場合の例

同じデータで左外部以外の結合方法を選択したときの例を説明します。

## 結合方法の選択

結合の種類はマージのプレビュー画面で選択できます。

![2017-06-24 11_45_14.png](https://qiita-image-store.s3.amazonaws.com/0/24602/9d2f8f70-0736-df1c-00c4-4e870569bb2f.png)

### 右外部の場合

メールアドレスのない氏名は空欄になります。

![2017-06-24 11_46_35.png](https://qiita-image-store.s3.amazonaws.com/0/24602/6bbbc49e-d1f8-1ab9-e92b-4a41fb494703.png)

### 完全外部の場合

全ての氏名が表示され欠けた部分が空欄になります。

![2017-06-24 11_47_34.png](https://qiita-image-store.s3.amazonaws.com/0/24602/38a93f0f-4592-e9c6-1dc4-cd779f559702.png)

### 内部の場合

両方に存在する氏名のみが表示されます。

![2017-06-24 11_48_12.png](https://qiita-image-store.s3.amazonaws.com/0/24602/1ed0a0a8-ec1c-130f-327a-589c6e6068c5.png)

### 左反の場合

電話番号の無い氏名のみが表示されます。

![2017-06-24 11_48_53.png](https://qiita-image-store.s3.amazonaws.com/0/24602/f4960ca2-5cf9-672f-0f49-2b56ed5d5554.png)

### 右反の場合

メールアドレスの無い氏名のみが表示されます。

![2017-06-24 11_49_25.png](https://qiita-image-store.s3.amazonaws.com/0/24602/4d74f400-444c-a2c3-787c-f67cfbdecc7e.png)

# 中間データを読み込まない方法

最終の出力結果のみが必要な場合、中間のデータをシートに出力しなければ処理を軽量化できます。

## 読み込んだシートを削除する

シートを右クリックして削除をクリックします。
右側のクエリペインには**4行読み込まれました。**とあり、データがシートに読み込まれた状態です。

![2017-06-24 12_01_00.png](https://qiita-image-store.s3.amazonaws.com/0/24602/7534567f-9ff8-8a71-71dc-3fd5d14d6c2b.png)

**削除**をクリックします。

![2017-06-24 12_08_18.png](https://qiita-image-store.s3.amazonaws.com/0/24602/6d8868a4-9274-bc5a-c861-d454a2273e17.png)

PowerQueryのクエリが含まれるシートを削除すると、選択肢が表示されます。
**ロードを無効にする** をクリックすると、クエリの接続情報を保持したままにできます。

![2017-06-24 12_01_47.png](https://qiita-image-store.s3.amazonaws.com/0/24602/934cf642-cc0a-b259-3a21-43be91fe49c4.png)

右側のクエリペインの表示が**接続専用。**となり、接続情報のみを保持した状態になりました。

![2017-06-24 12_02_31.png](https://qiita-image-store.s3.amazonaws.com/0/24602/33b9a9e4-4bdd-7ec9-f015-b0acfeaa9105.png)

## クエリの設定を変更する

右側のクエリペインから対象のクエリを右クリックし、**読み込み先**をクリックします。

![2017-06-24 12_03_51.png](https://qiita-image-store.s3.amazonaws.com/0/24602/ce058087-a0ce-1d73-9df2-6edd00aed6b1.png)

**接続の作成のみ** を選択して読み込みをクリックします。

![2017-06-24 12_04_37.png](https://qiita-image-store.s3.amazonaws.com/0/24602/b7c1987a-d768-a347-c823-e890b88ef6d7.png)

**続行**をクリックします。

![2017-06-24 12_05_05.png](https://qiita-image-store.s3.amazonaws.com/0/24602/2705737f-e1d9-78bd-0485-cf597439ba9b.png)

右側のクエリペインの表示が**接続専用。**となり、接続情報のみを保持した状態になりました。

![2017-06-24 12_07_02.png](https://qiita-image-store.s3.amazonaws.com/0/24602/0f51da74-ac81-c159-9757-eb27ca2a9910.png)

# クエリの依存関係を図で表示する

例は2つのファイルを読み込むシンプルな結合でしたが、実際の現場では多数のファイルを読み込むことがあります
クエリが複雑化するとどこから何を読み込んでいるか、どのクエリが関係しているかがわからなくなってきます。
クエリの依存関係を図で表示する機能を使って、依存関係を確認します。

**クエリエディター**を起動します。

![2017-06-24 12_18_02.png](https://qiita-image-store.s3.amazonaws.com/0/24602/5d010944-4342-6f41-67e7-66780c878dba.png)

**表示**タブの**クエリの依存関係**をクリックします。

![2017-06-24 12_18_33.png](https://qiita-image-store.s3.amazonaws.com/0/24602/7de27af7-c06b-1e41-d444-221123044ea6.png)

クエリの依存関係が図で表示されます。
クエリが読み込んでいるファイル、参照先のクエリが矢印で表示されます。
右下のツールを使えば拡大縮小などが行なえます。

![2017-06-24 12_19_04.png](https://qiita-image-store.s3.amazonaws.com/0/24602/3b87e3c9-31f4-0c26-3357-bbbbb758608f.png)

# 参考にしたページ

[複数のデータ ソースからデータを結合する (Power Query)](https://support.office.com/ja-jp/article/%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF-%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B-Power-Query-70cfe661-5a2a-4d9d-a4fe-586cc7878c7d)