PowerQuery データソースの列やシート名に依存しないで読み込む

# はじめに
Excelの「データの取得変換（PowerQuery）」を使って定期的に外部のExcelブックなどで集計作業などをする場合、相手のフォーマットがばらばらなケースがあります。

* 余計な列が入っている
* 非表示に設定された列構成が違う
* シート名が年月（202011）のようなフォーマット

こうなるとPowerQueryはすぐにエラーを吐いてしまいます。ほしい列は常にあるのに、余計な列がついたりつかなかったりしているためにエラーになってしまいます。

## 手順概要
以下の手順でこれらを解決します。

前提として、毎月受領するブックのファイル名は毎回「受注データ.xlsx」にリネームしてから読み込ませます。

1. シートを指定しないで読み込む
1. 必要列を選択した状態で``他の列の削除を実行``（`Table.SelectColumn`が使用される）

## サンプルのExcelブック
以下のような構成です。
![2020-11-15_22h53_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/eb69dd39-28b7-8d57-1eec-0e095a897a87.png)
ファイル名：受注データ10月.xlsx、シート名：2020OCT

![2020-11-15_22h04_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/ee598f83-9009-3025-9270-2f4a3ca6e388.png "受注データ11月.xlsx")
ファイル名：受注データ11月.xlsx、シート名：Sheet1、「原産地」という前月にはない列があります。


# シートを指定しないで読み込む
1. 「データの取得」から「ブックから」を選択
![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/9050a306-7902-b711-996b-68da1e843a66.png)

1. シートを選択せずにフォルダを選択
1. 「データ変換」」を選択
![2020-11-15_22h22_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/b0019744-0f50-de3b-591c-d4f6ea06e02c.png)

1. 「Data」以外は不要なので削除
![2020-11-15_22h27_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/d04d45bb-2ca9-51c9-a882-e682e38c6489.png)
↓
![2020-11-15_22h29_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/f8c5497f-3bed-d688-4f01-296e9f7debcc.png)

1. 「Data」列を展開。「元の列名をプレフィックスとして使用します」はチェックオフ。
![2020-11-15_22h29_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/1259b6c3-0f9e-a1b4-907f-25c74ede7d64.png)

1. この時点では列名が「Column1」などの汎用的な名前になっているので「1行目をヘッダーとして使用」をクリック
![2020-11-15_22h34_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/8303329a-5ddc-0b6c-13fc-741e088a8e1c.png)

1. 「昇格されたヘッダー数」「変更された型」のクエリ―が追加される。**「変更された型」は列名に依存してしまっているため削除する（ここがポイント）**。
![2020-11-15_22h35_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/af53ddf8-a00e-3de9-315a-3fcc7366e04b.png)
↓
![2020-11-15_22h37_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/8166a769-7374-0cfa-46e2-de2a34a1e69e.png)

1. 残す列を選択する
![2020-11-21_10h42_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/94334258-77cc-c56e-7a1b-d7061307bd09.png)

1. ホーム ＞ 列の削除 ＞ 他の列の削除 
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/da9168f2-47aa-a0e2-cbb4-a7613b5cd370.png)

<details><summary>コード詳細</summary><div>

`Table.SelectColumn`関数で選択した列が引数に渡されている。

```JavaScript:列削除前
let
    ソース = Excel.Workbook(File.Contents("C:\Users\User1\Documents\受注データ.xlsx"), null, true),
    削除された列 = Table.RemoveColumns(ソース,{"Name", "Item", "Kind", "Hidden"}),
    #"展開された Data" = Table.ExpandTableColumn(削除された列, "Data", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12"}),
    昇格されたヘッダー数 = Table.PromoteHeaders(#"展開された Data", [PromoteAllScalars=true])
in
    昇格されたヘッダー数
```

```JavaScript:列削除後
let
    ソース = Excel.Workbook(File.Contents("C:\Users\User1\Documents\受注データ.xlsx"), null, true),
    削除された列 = Table.RemoveColumns(ソース,{"Name", "Item", "Kind", "Hidden"}),
    #"展開された Data" = Table.ExpandTableColumn(削除された列, "Data", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12"}),
    昇格されたヘッダー数 = Table.PromoteHeaders(#"展開された Data", [PromoteAllScalars=true]),
    削除された列=Table.SelectColumns(昇格されたヘッダー数,{"客先発注番号","単価","数量","客先指定納期"})
 in
    削除された列
```
</details></div>


これで必要な列だけ抽出されます。
![2020-11-21_10h44_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/4a8d7982-a44d-b3ab-20d1-085b3b4070a7.png)

クエリを保存すると以下のようになります。
![2020-11-15_22h50_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/87eeeff7-be96-46cc-4dee-96f6c8c2668e.png)

では、違う月のデータを読み込ませてみます。
先ほどは「受注データ11月.xlsx」⇒「受注データ.xlsx」にリネームして読み込みました。
「受注データ10月.xlsx」⇒「受注データ.xlsx」にリネームして読み込みます。（「すべて更新」のショートカットCtrl+Alt+F5）

![2020-11-15_22h56_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178603/fd88e155-81a9-c6bd-e1b3-e923e4e85604.png)

エラーなく読み込めました！

（2020/11/21修正）
``Table.SelectColumns``をコード操作する部分をGUI操作に修正しました。