【VBAリファレンス】Power Queryで別ブックの最終シートを自動取得するM言語の極意

スポンサーリンク

概要:Excel業務の自動化における「シート名変動」の壁

日々の業務で、外部から送られてくるExcelファイルを取り込む際、このような悩みはありませんか。「シート名は毎回変わるが、常に一番右にあるシートを読み込みたい」。従来のVBAであれば、Worksheets.Countでインデックスを取得し、ループ処理で最終シートを特定するのが定石でした。しかし、昨今のExcelモダンワークフローにおいて、Power Query(M言語)を活用しない手はありません。

Power Queryは一度構築すればメンテナンスフリーで動作する強力なツールですが、標準機能の「フォルダから取り込み」や「ファイル取り込み」だけでは、シート名の固定を求められる場面が多く、動的なシート選択にはM言語の深い理解が不可欠です。本稿では、Power Queryのソース読み込みの仕組みを解剖し、M言語を駆使して「ブック内の最後尾にあるシート」を自動特定して取り込むための実践的なテクニックを解説します。

詳細解説:M言語によるExcelブックの構造解析

Power QueryでExcelブックを読み込む際、内部的には「Excel.Workbook」関数が使用されています。この関数は、ブック内のすべてのシート、テーブル、名前付き範囲を「テーブル形式」で返します。

通常、Power QueryのGUIで「シートの選択」を行うと、M言語の数式バーには以下のようなコードが生成されます。
= Excel.Workbook(File.Contents(“C:\Data\Target.xlsx”), null, true)

ここで重要なのは、この関数の戻り値が「レコードのリスト」であるという点です。返されたテーブルには「Name(シート名)」「Data(内容)」「Item(項目名)」「Kind(種類)」「Hidden(非表示かどうか)」といった列が含まれています。

「最終シートを取得する」というロジックをM言語で実現するためには、以下の3つのステップを踏む必要があります。
1. Excel.Workbookでブック全体を読み込む。
2. 「Kind」列をフィルタリングし、「Sheet」であるものだけを抽出する。
3. リストの順序を維持したまま、最後の行(レコード)を特定する。

この際、M言語の強力なインデックス処理関数である「Table.LastN」や、レコードの順序を決定付ける「Position」の概念を組み合わせることで、特定のシート名に依存しない柔軟なクエリが完成します。

サンプルコード:最終シートを動的に取得するM言語スクリプト

以下に、指定したパスのExcelファイルから、常に最後尾のシートを抽出するためのM言語コードを提示します。これをクエリの詳細エディタにコピー&ペーストして活用してください。

let
    // 1. ファイルパスの定義
    SourceFile = "C:\YourPath\TargetBook.xlsx",
    
    // 2. ブック全体を読み込み
    Source = Excel.Workbook(File.Contents(SourceFile), null, true),
    
    // 3. 種類が"Sheet"であるものだけに絞り込む
    OnlySheets = Table.SelectRows(Source, each ([Kind] = "Sheet")),
    
    // 4. 最後尾の行だけを取得する(Table.LastNを使用)
    LastSheetRecord = Table.LastN(OnlySheets, 1),
    
    // 5. 取得したレコードの「Data」列を展開して内容を表示
    TargetData = LastSheetRecord{0}[Data],
    
    // 6. 1行目をヘッダーとして昇格させる(必要に応じて)
    PromotedHeaders = Table.PromoteHeaders(TargetData, [PromoteAllScalars=true])
in
    PromotedHeaders

このコードの肝は、`Table.LastN(OnlySheets, 1)`という記述にあります。これにより、シートの増減に関わらず、常に物理的なリストの最後尾にあるオブジェクトを抽出することが可能となります。また、`{0}`というインデックス指定で、リスト形式からレコード形式へ変換する手法は、M言語におけるデータ操作の定石です。

実務アドバイス:エラーハンドリングと運用の注意点

この手法を実務に導入する際、注意すべき点がいくつかあります。

まず、「隠しシート」の扱いです。Excelにはユーザーが作成したシート以外にも、Excel本体が保持する内部シートが存在する場合があります。もし読み込みエラーが発生する場合は、`Table.SelectRows`の条件式に「かつ、Hiddenがfalseであること」という条件を追加してください。

また、シートが1枚しかない場合や、逆に空のシートが末尾にある場合、取り込みデータが想定と異なる可能性があります。これを防ぐためには、データのクレンジング処理(`Table.Skip`や`Table.RemoveRows`)を最後尾の取得後に加えることで、より堅牢なクエリになります。

さらに、VBAとの併用についても触れておきます。もしPower Queryの更新をVBAで制御したい場合は、`ActiveWorkbook.Connections(“Query – 〇〇”).Refresh`を使用します。これにより、「VBAでファイルをダウンロード・保存し、Power Queryで最新の最終シートを取り込む」という完全自動化パイプラインの構築が可能になります。

まとめ:モダンExcelの自動化へ向けて

Power Queryにおける「最終シートの取り込み」は、単なる技術的なTipsに留まりません。これは「固定観念(シート名を指定しなければならない)」からの脱却を意味します。M言語を理解し、Excelブックを「テーブルの集合体」として捉える視点を持つことで、あなたの業務自動化レベルは格段に向上するでしょう。

今回紹介した`Table.LastN`を用いた手法は、メンテナンスが非常に容易です。将来的にシート名が変更されても、ファイルが更新されても、クエリが壊れることはありません。これが「ベテランが選ぶ自動化」の理由です。ぜひ明日からの業務で、この動的なシート取得ロジックを実装し、手作業の転記やシート名変更に伴う修正から解放されてください。

Power Queryの世界は、一度学べば一生使える強力な武器となります。M言語の構文に慣れ、より高度なデータ加工の世界へと足を踏み入れていきましょう。

タイトルとURLをコピーしました