List型を使った列の動的選択
今日のテーマはList型のデータを用いた列の動的列選択です。
PowerQueryでは、列の削除を行うことで、データソースから読み込んだデータのうち必要な列だけを残すことができます。
今回のゴールは、元表として以下のような5つの列があった場合、
以下のような列選択テーブルでYesと設定された列を元にして
選択された列だけ拾ってくることです。(動的選択)
技術的なポイント
- Table.SelectColumnsで残す列を選ぶ
- 選択テーブルをList型に変換する
- { } で囲まれたList部分を差し替える
実践
いったん通常の手順で列を選択した後、List部分のみを差し替えます。
通常の手順で列を選ぶ
まずは動的選択によらず、通常の手順で列を選択します。
元となるテーブル上にカーソルを置きます。
データーデータの取得と変換-テーブルまはた範囲からをクリック。
PowerQueryエディターが開くので、Ctrlキーを押しながら残したい列を選びます。
列の削除ー他の列の削除を選択します。
すると、以下のように選択された列だけが残ります。
Table.SelectColumns関数について
この時、数式バーは以下の通りです。
= Table.SelectColumns(変更された型,{"列A", "列B", "列C"})
Table.SelectColumns - PowerQuery M | Microsoft Docs
Table.SelectColumnsは文字通り「列を選択する」、つまり残す列を選ぶときに使われます。今回は、列A、列B、列Cを残したかったので、数式の後半の変数部分にこれらの列が指定されています。
なお、列の削除を行ったときはTable.RemoveColumns関数が呼ばれます。
Table.RemoveColumns - PowerQuery M | Microsoft Docs
これは逆に選択した列を削除するときに使われます。
List型データについて
次に関数の第二引数部分を確認します。
= Table.SelectColumns(変更された型,{"列A", "列B", "列C"})
前半の変更された型は、直前のステップで作成されたテーブルのことで、後半の{"列A", "列B", "列C"}は残す列名を並べている部分です。この { } (中括弧)で囲まれた部分は、PowerQueryでいうところのList型と呼ばれるデータ型の部分です。
List型は複数のデータを並べるときに使用する型で、何があるか?どういう順番か?という2点が重要なポイントとなります。
ワークシートテーブルに読み込む
ここまでできたら、いったん閉じて読み込むを実行します。
これで三つの列が選択されたテーブルが読み込まれました。
別なワークシートテーブルを使って列名を選択する
次に別な管理用ワークシートテーブルを使って、残す列を指定していきます。
選択列名Listを作る
まずは以下のように残す列名を並べたワークシートテーブルを作り、名前を選択列名Listとします。
このテーブルの上にカーソルを置いて、テーブルまたは範囲からをクリックし、PowerQueryエディターを開きます。
次に列名を右クリックし、ドリルダウンを選びます。
すると、テーブルがListに変換されます。
数式バーを見ると、以下のように記載されています。
= 変更された型[列名]
これは直前のステップで作成された「変更された型」テーブルのうち、列名だけにナビゲーション(移動)した記述になります。(ちなみに行を切り出すとRecord型になります。)
これで閉じて読み込む-接続の作成のみを実行します。
クエリと接続ペインで作成された選択列名Listクエリを確認すると元表クエリとは異なるアイコンが表示されていますが、これがList型のアイコンとなります。
Table.SelectColumnsのList部分を差し替える
今度は元表クエリに戻り、Table.SelectColumnsの列名部分を 選択列名Listに差し替えます。
元表クエリをダブルクリックし、PowerQueryエディターを開いたら、削除された他の列のステップの数式の{ } で囲まれた部分をそっくり入れ替えます。
変更前:
= Table.SelectColumns(変更された型,{"列A", "列B", "列C"})
変更後:
= Table.SelectColumns(変更された型,選択列名List)
結果、同じ列が残っていればOKです。
これで選択列をExcelのワークシートで管理することができるようになりました。
試しにワークシートの選択列名Listの最終列を列Eに変更して、元表クエリを再読み込みしてみます。
すると、選択列名Listの内容を反映して、列Cの代わりに列Eが読み込まれました。
選択列名ListからYes/Noで列を選ぶ
今度は、先ほどの手順をもう少し進化させて選択列名ListにYes/Noの選択列を追加して、列の表示/非表示を切り替えます。
まずワークシートテーブルの選択列名Listにすべての列名を追加し、それぞれの選択列にYes/Noの選択値を入力します。
選択列のYes/Noは2択なので、データの入力規則で制限をかけておくとよいでしょう。
選択列の追加とYes, Noの入力が終わったら、選択列名Listクエリをダブルクリックして、PowerQueryエディターを開きます。
List型に変換する前の変更された型ステップに移動し、選択列を右クリック、Yesのみにフィルターします。
ここまで来たら設定完了です。元表クエリに戻り、閉じて読み込むを実行します。結果がYesと選択された列のみになったらOKです。
試しに列選択を変更して、元表クエリを再実行してみましょう。
無事、選択された列のみが読み込まれています。
列名の並び替えもListで管理
おまけですが、列の順番も同じようにワークシートテーブルで管理できます。
以下のように選択列名Listテーブルの行を入れ替えて、列B、列Aの順番にしてから元表クエリを再読み込みします。
すると、元表クエリの結果にも順番が反映されています。
列の順番を変更するには通常、Table.ReorderColumns関数(列の並び替え)を使うのですが、Table.SelectedColumns関数ならばList型データの順番も反映してくれるようです。