鷹尾祥(アキラ)のExcel BI ブログ

Excelの革新的機能であるパワーピボット/パワークエリ/DAXについて紹介します。

List型を使った列の動的選択

List型を使った列の動的選択

今日のテーマはList型のデータを用いた列の動的列選択です。

PowerQueryでは、列の削除を行うことで、データソースから読み込んだデータのうち必要な列だけを残すことができます。

f:id:modernexcel7:20200425140040p:plain


今回のゴールは、元表として以下のような5つの列があった場合、

f:id:modernexcel7:20200425140820p:plain

以下のような列選択テーブルでYesと設定された列を元にして

f:id:modernexcel7:20200425135915p:plain

選択された列だけ拾ってくることです。(動的選択

f:id:modernexcel7:20200425140516p:plain

技術的なポイント

  • Table.SelectColumnsで残す列を選ぶ
  • 選択テーブルをList型に変換する
  • { } で囲まれたList部分を差し替える

実践

いったん通常の手順で列を選択した後、List部分のみを差し替えます。

通常の手順で列を選ぶ

まずは動的選択によらず、通常の手順で列を選択します。

元となるテーブル上にカーソルを置きます。

f:id:modernexcel7:20200425140820p:plain

データーデータの取得と変換-テーブルまはた範囲からをクリック。

f:id:modernexcel7:20200425141122p:plain

PowerQueryエディターが開くので、Ctrlキーを押しながら残したい列を選びます。

f:id:modernexcel7:20200425141358p:plain

列の削除ー他の列の削除を選択します。

f:id:modernexcel7:20200425140040p:plain

すると、以下のように選択された列だけが残ります。

f:id:modernexcel7:20200425141727p:plain

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点が重要なポイントとなります。

ワークシートテーブルに読み込む

ここまでできたら、いったん閉じて読み込むを実行します。

f:id:modernexcel7:20200425143330p:plain

これで三つの列が選択されたテーブルが読み込まれました。

f:id:modernexcel7:20200425143416p:plain

別なワークシートテーブルを使って列名を選択する

次に別な管理用ワークシートテーブルを使って、残す列を指定していきます。

選択列名Listを作る

まずは以下のように残す列名を並べたワークシートテーブルを作り、名前を選択列名Listとします。

f:id:modernexcel7:20200425143618p:plain

このテーブルの上にカーソルを置いて、テーブルまたは範囲からをクリックし、PowerQueryエディターを開きます。

次に列名右クリックし、ドリルダウンを選びます。

f:id:modernexcel7:20200425144055p:plain

すると、テーブルがListに変換されます。

f:id:modernexcel7:20200425144259p:plain

数式バーを見ると、以下のように記載されています。

= 変更された型[列名]

これは直前のステップで作成された「変更された型」テーブルのうち、列名だけにナビゲーション(移動)した記述になります。(ちなみに行を切り出すとRecord型になります。)

これで閉じて読み込む-接続の作成のみを実行します。

クエリと接続ペインで作成された選択列名Listクエリを確認すると元表クエリとは異なるアイコンが表示されていますが、これがList型のアイコンとなります。

f:id:modernexcel7:20200425144600p:plain

Table.SelectColumnsのList部分を差し替える

今度は元表クエリに戻り、Table.SelectColumnsの列名部分を 選択列名Listに差し替えます。

元表クエリダブルクリックし、PowerQueryエディターを開いたら、削除された他の列のステップの数式の{ } で囲まれた部分をそっくり入れ替えます。

変更前:
= Table.SelectColumns(変更された型,{"列A", "列B", "列C"})

変更後:
= Table.SelectColumns(変更された型,選択列名List)

結果、同じ列が残っていればOKです。

f:id:modernexcel7:20200425171416p:plain

これで選択列をExcelのワークシートで管理することができるようになりました。

試しにワークシートの選択列名Listの最終列を列Eに変更して、元表クエリを再読み込みしてみます。

f:id:modernexcel7:20200425171708p:plain

すると、選択列名Listの内容を反映して、列Cの代わりに列Eが読み込まれました。

f:id:modernexcel7:20200425171843p:plain

選択列名ListからYes/Noで列を選ぶ

今度は、先ほどの手順をもう少し進化させて選択列名ListYes/Noの選択列を追加して、列の表示/非表示を切り替えます。

まずワークシートテーブルの選択列名Listにすべての列名を追加し、それぞれの選択列にYes/Noの選択値を入力します。

f:id:modernexcel7:20200425172612p:plain

選択列のYes/Noは2択なので、データの入力規則で制限をかけておくとよいでしょう。

f:id:modernexcel7:20200425172656p:plain

f:id:modernexcel7:20200425172752p:plain

選択列の追加とYes, Noの入力が終わったら、選択列名Listクエリをダブルクリックして、PowerQueryエディターを開きます。

f:id:modernexcel7:20200425172950p:plain

List型に変換する前の変更された型ステップに移動し、選択列を右クリックYesのみにフィルターします。

f:id:modernexcel7:20200425173841p:plain

ここまで来たら設定完了です。元表クエリに戻り、閉じて読み込むを実行します。結果がYesと選択された列のみになったらOKです。

f:id:modernexcel7:20200425174106p:plain

試しに列選択を変更して、元表クエリを再実行してみましょう。

f:id:modernexcel7:20200425174456p:plain

無事、選択された列のみが読み込まれています。

列名の並び替えもListで管理

おまけですが、列の順番も同じようにワークシートテーブルで管理できます。

以下のように選択列名Listテーブルの行を入れ替えて、列B、列Aの順番にしてから元表クエリを再読み込みします。

f:id:modernexcel7:20200425190010p:plain

すると、元表クエリの結果にも順番が反映されています。

列の順番を変更するには通常、Table.ReorderColumns関数(列の並び替え)を使うのですが、Table.SelectedColumns関数ならばList型データの順番も反映してくれるようです。

Table.ReorderColumns - PowerQuery M | Microsoft Docs