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

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

Power Query:複数のシートを一括で読み込んで結合する

[データの取得]→[ファイルから]→[Excel ブックから]でファイルを指定した場合、ブックの中でシートが分かれていると、シートの数だけクエリを作らないとといけなくなってしまう。これをマージしようと思ったら更にクエリの追加も必要。というかシートが何十枚もあったらアイテムの選択だけで疲れてしまう。どうせなら一括で処理してしまおう。

そもそもシートを分けるのが間違っているといえば、その通りなんだけど、作ってしまってからぼやいても仕方がないわけで……

こんな感じでシートをひとつずつ選択……するのはやめよう。シートの数だけクエリを作るなんてのは現実的ではないし、シートの追加にも対応しなくなってしまう。

呼び出したテーブルの「Name」列で、いらないシート名を除外してやろう。

この時注意しないといけないのは、抽出した後の式の中身。「[Name] <> "除外するシート名"」のようになっていたら問題ないが、除外するシート数とのバランス次第では、「[Name] = "必要なシート名1" and [Name] = "必要なシート名2" ……」のようになってしまう場合がある。これだとシートの増加に対応しなくなる。「必要なシートを残す」ではなく「いらないシートを除外」になっていることを確認しておこう。

後は「Data」列だけを残して展開するだけ……なんだけど、これも少し待って欲しい。

このまま展開すると、見出しの行が残ってしまう。

このくらい「Column1」列が「列1」の行だけ除外すれば別にいいんだけど、Power Queryでは「抽出」をステップに入れ込むと、パフォーマンスが著しく落ちてしまう。シートのデータ量が多い場合、これだけでも相当な負担になってしまう。本当をいうと、シート名の抽出もやめておいたほうがいいくらいなのだ。

手間を惜しまないなら、先頭行をヘッダーに変換した「Data2」列を作って、そっちを展開するようにしよう。


[列の追加]→[カスタム列] 新しい列名:Data2 カスタム列の式:= Table.PromoteHeaders([Data]) →[OK]

あとは「Data2」列を右クリックして「他の列の削除」を実行してから、展開すればいい。

後の手間も省けるし、処理が無駄に重くなるのも防げる。

「パワークエリ 複数シート 結合」などで検索すると、たくさん記事が引っかかると思うけど、いわれた通りにやってみたら読み込みが重くなった……という場合には、上の「各テーブルの先頭行をヘッダーに変換してから結合」をやってみて欲しい。