なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

Power Query:ソースの読み込みを条件式で切り替える

ソースの読み込みを条件式で切り替えた場合、該当しないほうのデータは読み込まれるか。答えはノー。つまり読み込む情報を小分けにしておいて、必要に応じて切り替えて使ったほうが処理は断然早くなる。

例えば A列が1行、B列が100万行のテーブルがあるとする。ここからクエリを作成し、

クエリ1
Table.FromColumns(     {{"A"}, List.Repeat({"あ", "い", "う", "え", "お"}, 1000000)},     type table [列1=text, 列2=text] )

さらにそれを参照するクエリを2つ作成する。

クエリ1a
let     ソース = クエリ1,     列の選択 = Table.SelectColumns(ソース,{"A列"}),     上位行の保持 = Table.FirstN(列の選択, each [A列]<>null),     行のグループ化 = Table.Group(         上位行の保持, {"A列"},         {{"カウント", each _, type table [A列=nullable number]}}     ) in     行のグループ化

もういっこのクエリにはわざと重くなる処理を入れる。

クエリ1b
let     ソース = クエリ1,     列の選択 = Table.SelectColumns(ソース,{"列2"}),     上位行の保持 = Table.SelectRows(列の選択, each [列2]<>null),     クエリのマージ = Table.NestedJoin(         上位行の保持, {"列2"},         クエリ1, {"列2"},         "マージ", JoinKind.LeftOuter     ),     マージ列の編集 = Table.TransformColumns(         クエリのマージ, {"マージ", each [列1]{0}}     ),     行の抽出 = Table.SelectRows(マージ列の編集, each [マージ]=null),     行のグループ化 = Table.Group(         行の抽出, {"列2"},         {{"カウント", each Table.RowCount(_), Int64.Type}}     ) in     行のグループ化

この2つのクエリを ifで条件を指定して別のクエリで呼び出す。

クエリ1b
let     ソース = if 1=1 then クエリ1a else クエリ1b in     ソース

このクエリをシートの適当なセルにテーブルとして読み込んで更新。すると間をおかずに「クエリ1a」の結果が表示される。反対に、条件の「1=1」を「1=0」に変えると、いつまで経っても読み込まれない状態になる。

ということは条件に一致しないほうのクエリは更新されていないってことだから、必要に応じてソースを切り替える工夫があってもいいかもしれない。