パワークエリでPDFを取り込む ― 実践・進化編
― 複数テーブル結合・フォルダー一括処理・M言語制御・不規則PDF対応まで全網羅 ―

💡 この記事の位置づけ

この記事はパワークエリ基本編の続きです。基本編では単一テーブルの取り込みと基本整形を扱いました。この実践編では、複数テーブルの結合、フォルダー一括処理、M言語による高度な制御、不規則なPDFへの対応パターンなど、実務で遭遇する複雑なケースを取り上げます。

【2】テクニック① 複数テーブルの自動結合

シナリオ:1つのPDFに3ページ分の同じ構造の表がある

月次レポートPDFで、1ページ目に1月の売上、2ページ目に2月、3ページ目に3月のデータが入っている場合、ナビゲーターには Table001・Table002・Table003 が表示されます。これらを1つのテーブルに統合します。

STEP 1 — ナビゲーターで3つのテーブルすべてにチェックを入れ、「データの変換」をクリック。

STEP 2 — パワークエリエディターの左側に3つのクエリが表示される。Table001をクリックして選択状態にする。

STEP 3 — 「ホーム」タブ →「クエリの追加」→「クエリの追加(3つ以上)」を選択。

STEP 4 — Table002とTable003を「追加するテーブル」に移動して「OK」。3つのテーブルが縦方向に連結される。

STEP 5 — 重複するヘッダー行(2ページ目・3ページ目の先頭にある列名行)をフィルターで除去する。例:「日付」列のフィルターで値が「日付」というテキストの行を除外。

STEP 6 — 「閉じて読み込む」で1つの統合テーブルとしてExcelに出力。

【3】テクニック② ページまたぎの表を1つに統合

パワークエリのPDFコネクタは、ページの区切りで表を分割して検出することがあります。テクニック①と同じ「クエリの追加」で結合しますが、注意点があります。

ページまたぎの注意
ページの境界で行が分割されることがあります(1行のデータが前半と後半で別の行になる)。結合後に「行数が元のPDFと一致しているか」「最後のデータ行が正しいか」を必ず確認してください。

パワークエリの最新版(Microsoft 365の2023年以降の更新)では、同一構造の連続テーブルを自動的に1つのテーブルとして検出する改善が入っています。ナビゲーターで Table001 だけが表示され、すべてのページのデータが含まれているケースが増えています。

【4】テクニック③ フォルダー内の複数PDFを一括取り込み

シナリオ:月ごとの請求書PDF(12ファイル)を一括で取り込む

フォルダー
12個のPDF
パワークエリ
一括読み込み
結合&整形
Excel
年間データ

STEP 1 — 12個のPDFファイルを1つのフォルダーにまとめます(例:C:\請求書\2026\)。ファイル名は何でもOKですが、すべて同じ表構造であることが前提です。

STEP 2 — 「データ」→「データの取得」→「ファイルから」→「フォルダーから」を選択。フォルダーパスを指定して「OK」。

STEP 3 — フォルダー内のファイル一覧が表示される。「データの結合と変換」をクリック。

STEP 4 — 「ファイルの結合」ダイアログで、サンプルファイルのテーブル(例:Table001)を選択して「OK」。

STEP 5 — パワークエリが自動的に12ファイルすべての Table001 を結合し、「Source.Name」列にファイル名が追加される。

STEP 6 — パワークエリエディターで Source.Name 列からファイル名(=月)を抽出する列を追加し、不要な列を削除して「閉じて読み込む」。

新しいPDFが追加されたとき
フォルダーに13ヶ月目のPDFを追加して「すべて更新」を押すだけで、自動的に新しいファイルも含めて再結合されます。

【5】テクニック④ M言語で取り込みを細かく制御する

パワークエリの操作はすべてM言語(Power Query Formula Language)として記録されます。「詳細エディター」でM言語を直接編集すると、GUIでは設定しにくい高度な制御が可能になります。

5-1. PDFから特定のテーブルだけを取得するMコード

M言語(特定テーブル取得)

let // PDFファイルを読み込み Source = Pdf.Tables( File.Contents("C:\データ\売上レポート.pdf") ), // Table002だけを取得 TargetTable = Source{[Id="Table002"]}[Data], // 1行目をヘッダーに PromotedHeaders = Table.PromoteHeaders(TargetTable, [PromoteAllScalars=true]), // データ型を設定 ChangedType = Table.TransformColumnTypes(PromotedHeaders, { {"日付", type date}, {"金額", type number} }) in ChangedType

5-2. 全テーブルを自動結合するMコード

M言語(全テーブル自動結合)

let Source = Pdf.Tables( File.Contents("C:\データ\売上レポート.pdf") ), // Tableで始まるIDだけをフィルター FilteredTables = Table.SelectRows(Source, each Text.StartsWith([Id], "Table") ), // Data列(各テーブルの中身)をすべて結合 CombinedData = Table.Combine(FilteredTables[Data]), // ヘッダー昇格 PromotedHeaders = Table.PromoteHeaders(CombinedData, [PromoteAllScalars=true]), // ヘッダー行の重複を除去 RemovedDuplicateHeaders = Table.SelectRows(PromotedHeaders, each [日付] <> "日付" ) in RemovedDuplicateHeaders
Mコードの確認・編集方法
パワークエリエディターで「ホーム」→「詳細エディター」をクリックすると、現在のクエリのMコードが表示されます。直接編集して「完了」を押すと反映されます。

【6】テクニック⑤ パラメータクエリでファイルパスを動的に変更

取り込むPDFファイルのパスをExcelのセルから読み取るようにすると、ファイルを切り替えるたびにMコードを編集する必要がなくなります。

STEP 1 — Excelシートのセル(例:A1)にPDFファイルのフルパスを入力します:C:\データ\売上レポート_2026Q1.pdf

STEP 2 — A1セルを含む範囲をテーブル化し、名前を「設定テーブル」にします。

STEP 3 — パワークエリで新しい空のクエリを作成し、詳細エディターで以下のMコードを入力します:

M言語(パラメータクエリ)

let // Excelの設定テーブルからファイルパスを取得 設定 = Excel.CurrentWorkbook(){[Name="設定テーブル"]}[Content], ファイルパス = 設定{0}[パス], // 取得したパスでPDFを読み込み Source = Pdf.Tables(File.Contents(ファイルパス)), TargetTable = Source{[Id="Table001"]}[Data], PromotedHeaders = Table.PromoteHeaders(TargetTable) in PromotedHeaders

これでExcelのA1セルのパスを変更して「すべて更新」を押すだけで、異なるPDFファイルを同じ加工フローで取り込めます。四半期ごとのレポートPDFを処理する場合などに便利です。

【7】テクニック⑥ 不規則なPDFへの対応パターン

パターンA:テーブルの上にタイトル行がある

PDFの表の上に「○○株式会社 売上明細」のようなタイトルが入っていると、それがテーブルの1行目として取り込まれます。パワークエリエディターで「行の削除」→「先頭の行の削除」→ 行数=1 としてタイトル行を除去した後、「1行目をヘッダーとして使用」を適用します。

パターンB:合計行・小計行が混在する

表の途中に「小計」行や末尾に「合計」行がある場合、データ行と混在して取り込まれます。フィルターで特定のキーワード(「小計」「合計」「計」)を含む行を除外します。

列「品名」のフィルター → テキストフィルター → 「次を含まない」→「合計」 同様に「小計」「計」も除外

パターンC:横長の表が列落ちする

A4横向きの広い表が、PDF変換時に右端の列が切れて別テーブルとして検出されることがあります。この場合は「クエリのマージ」(横結合)で結合します。Table001とTable002を共通キー列(行番号や日付)で左外部結合し、1つのワイドテーブルにします。

パターンD:表が検出されず Page のみ

罫線のないテキスト整列のテーブルは Table として検出されないことがあります。Page を取り込んで以下の手順で整形します。

STEP 1 — Page001 を選択して「データの変換」でパワークエリエディターを開く。Column1 に全テキストが1列で入っている状態。

STEP 2 — 「変換」タブ →「列の分割」→「区切り記号による分割」→ 区切り記号に「スペース」を選択。ただし複数スペースでの区切りが必要な場合は「詳細設定オプション」→「特殊文字を使用した分割」で連続スペース(2つ以上)を指定する。

STEP 3 — 分割後の列数が元のPDFと一致しているか確認。列が多すぎる場合は不要列を削除、少なすぎる場合は区切り条件を「固定幅」に変えて再試行する。

STEP 4 — 表の前後にあるタイトル行・フッター行をフィルターで除去し、1行目をヘッダーに昇格させる。

固定幅分割のコツ
官公庁の統計PDFなど「各列が固定文字数で揃えられている」場合は、「列の分割」→「文字数による分割」で各列の文字数を指定すると正確に分割できます。最初の数行を目視確認して文字数を数えてください。

【8】パワークエリPDFコネクタの進化の歴史

パワークエリのPDFコネクタは登場以来、継続的に改善されてきました。バージョンによる精度や機能の違いを知っておくと、トラブルシューティングに役立ちます。

時期 バージョン 主な変化・改善点
2019年 Excel 2019 / 365 初期 PDFコネクタ初搭載。罫線のある表のテーブル検出に対応。日本語PDFでの文字化けが一部発生。
2020年前半 365 月次更新 テーブル検出アルゴリズムが改善され、罫線のない表でも空白パターンから列を推定する精度が向上。
2020年後半 365 月次更新 ナビゲーターUIが改善。テーブルとページの区別が視覚的にわかりやすくなった。複数テーブル選択のチェックボックスが追加。
2021年 365 月次更新 ページまたぎの表の検出が改善。連続する同一構造の表を1つの Table として統合するケースが増加。
2022年 365 月次更新 Pdf.Tables 関数のオプションパラメータが拡充。M言語からテーブル検出の挙動を制御しやすくなった。
2023年 365 月次更新 日本語帳票(請求書・見積書など縦書き混在レイアウト)への対応精度が向上したとの報告あり。
2024年〜 365 最新版 Copilot(AI アシスト)との連携が進み、パワークエリの操作を自然言語で指示する機能が段階的に追加されている。
バージョンの確認方法
Excelで「ファイル」→「アカウント」→「Excel のバージョン情報」でビルド番号を確認できます。Microsoft 365は自動更新のため、常に最新のPDFコネクタが利用可能です。Excel 2019は購入時のバージョンから更新されないため、PDFコネクタの精度は初期版のままです。

【9】パワークエリの限界と代替手段

パワークエリはPDFデータ取得の最有力手段ですが、万能ではありません。以下のケースでは別の手段を検討する必要があります。

ケースパワークエリの状況代替手段
画像PDF(スキャン文書) テキスト情報がないため取り込み不可 Adobe Acrobat ProのOCR → テキストPDFに変換してからパワークエリで取り込み。または Google ドキュメントのOCR機能。
パスワード保護されたPDF 開けないため取り込み不可 パスワードを入力してAdobe Readerで開き、「印刷」→「Microsoft Print to PDF」で無保護PDFとして再保存。
極めて複雑なレイアウト テーブル検出が大幅にズレる Adobe Acrobat Pro の「Excelにエクスポート」、またはPython(tabula-py、camelot)での取り込み。
数百ページの大量PDF 処理が非常に遅くなる場合がある PDFを事前にページ分割してから処理。またはPython/Rスクリプトでバッチ処理。
Excel 2016 以前の環境 PDFコネクタ非搭載 Word経由の変換を使用。

📝 まとめ

パワークエリのPDFコネクタは、Excel 2019/Microsoft 365で使えるPDFデータ取得の決定版です。基本編で扱った単一テーブルの取り込みに加え、この実践編では以下のテクニックを紹介しました。

複数テーブルの自動結合(クエリの追加)、ページまたぎの表の統合、フォルダー内の複数PDFの一括取り込み(フォルダーから)、M言語による特定テーブルの指定や全テーブルの自動結合、パラメータクエリによるファイルパスの動的切り替え、そして不規則なPDF(タイトル行混在、合計行、横長の表、テーブル未検出)への対応パターンです。

PDFコネクタは2019年の初搭載から継続的に改善されており、特にMicrosoft 365では最新の検出アルゴリズムが自動適用されます。ただし、画像PDFやパスワード保護PDF、極端に複雑なレイアウトには対応できないため、これらのケースではOCR処理やサードパーティツールとの組み合わせが必要になります。

テクニック早見表

テクニック用途操作レベル
① 複数テーブル結合ページ別のテーブルを1つに統合基本
② ページまたぎ統合ページ境界で分割された表を結合基本
③ フォルダー一括取り込み月次PDFなど複数ファイルの一括処理中級
④ M言語での制御特定テーブルの指定、自動結合ロジック中級〜上級
⑤ パラメータクエリファイルパスの動的切り替え中級
⑥ 不規則PDF対応テーブル未検出、タイトル行、合計行の処理中級〜上級

M言語リファレンス

M関数用途
Pdf.Tables(binary)PDFのバイナリからテーブル一覧を取得
File.Contents(path)ファイルパスからバイナリを取得
Table.Combine(tables)複数テーブルを縦結合
Table.PromoteHeaders(table)1行目をヘッダーに昇格
Table.SelectRows(table, condition)行のフィルター
Table.TransformColumnTypes(table, types)データ型の変更
Text.StartsWith(text, prefix)テキストの前方一致判定
Excel.CurrentWorkbook()現在のブック内のテーブルを取得

パワークエリの基本操作は → GUIマスターシリーズ①〜⑥
応用操作は → 応用編⑦〜⑪