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

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

Power Query:複数ファイルの1つ目のシートを読み込んで結合する

多分一番要望として多いからだと思うんですが、複数のファイルを一括で読み込むクエリの質問が増えてきています。

ただ、ヘルパークエリどころかパワークエリがどんなものかすら、よくわからないまま使っている人が多い印象です。

どうもネットを検索してみると、「手順通りにボタンを押していけばできる」みたいな記事がたくさん見つかります。確かにマウス操作だけで解決できるのが「検索している側の理想」なんでしょうけど、そういうやり方の多くは、応用が利かなかったり、エラー対策が不充分だったりしがちです。「ノーコードでできる方法」は甘い罠と心得るべきです。

結局意味が分からないまま操作を丸覚えするのなら、「コピペすれば動くマクロ」と変わりませんし、それならいっそ「コピペしたら動くクエリ」を作ってみようかと思い立ちました。どうせメンテナンスできないのなら「コードを貼り付けたら動く」でもいいじゃないですか。お手軽ですし、なによりエラーも起きにくいです。


ではやってみましょう。まずは空のクエリを作成します。新規クエリの作り方が分からない方は、「新規クエリを作成する」を参照してください。

新規クエリを作成したら、続いて[ホーム]→[詳細エディタ]を開いて元のコードを削除し、下記のコードを丸ごと貼り付けます

「★」のところに参照するフォルダパス(「C:\...\...\フォルダ名」のようなもの)を記載してください

複数ファイルの1つ目のシートを読み込んで結合するクエリ
let     ソース = Folder.Files("★)", //★にフォルダパスを入力してください。     列の追加 = Table.AddColumn(         ソース, "x",         each Table.PromoteHeaders(             Excel.Workbook([Content]){0}[Data]         ),         type table     ),     列の選択 = Table.SelectColumns(         列の追加,{"Name", "x"}     ),     列の展開 = Table.ExpandTableColumn(         列の選択, "x", Table.ColumnNames(列の選択{0}[x])     ) in     列の展開

これで「完了」を押せば完成です(超簡単!)。後は「ホーム」の「閉じて読み込む」を押せば、ブックにデータが表示されます。


ただし、上記のコードでは1行目が見出し行であることを前提としています。見出しがなく、1行目からデータがある場合は「Table.PromoteHeaders(...)」を取り除いてください。

元のブックの1行目からデータがある場合
let     ソース = Folder.Files("★)", //★にフォルダパスを入力してください。     列の追加 = Table.AddColumn(         ソース, "x",         each Excel.Workbook([Content]){0}[Data]),         type table     ),     列の選択 = Table.SelectColumns(         列の追加,{"Name", "x"}     ),     列の展開 = Table.ExpandTableColumn(         列の選択, "x", Table.ColumnNames(列の選択{0}[x])     ) in     列の展開

反対に頭に空白行が何行かある場合は「上位行の削除」をコードに追加する必要があります。

元のブックの先頭に空白行が3行ある場合
let     ソース = Folder.Files("★)", //★にフォルダパスを入力してください。     列の追加 = Table.AddColumn(         ソース, "x",         each Table.PromoteHeaders(             Table.Skip(Excel.Workbook([Content]){0}[Data], 3)         ),         type table     ),     列の選択 = Table.SelectColumns(         列の追加,{"Name", "x"}     ),     列の展開 = Table.ExpandTableColumn(         列の選択, "x", Table.ColumnNames(列の選択{0}[x])     ) in     列の展開

他にも何かやらないといけない処理(Excelファイル以外を除外するとか)があるなら、別途ステップを追加してください。「Excel.Workbook([Content]){0}[Data]」に対してカスタム関数を作ってやってもいいです。そこまできたらヘルパークエリを作るほうがいいとは思いますが……

上記は元のファイルが Excelファイル(ブック)という前提です。対象が CSVファイルの時は、下処理が多いので別の方法でやってください。