Power Query 実務テンプレ | データ取込・更新系:Excel特定セル範囲取込

Excel VBA PowerQuery
スポンサーリンク

ゴールのイメージを先にそろえる

今回のテーマは「Excelブックの中から、シート全体ではなく“特定のセル範囲だけ”を Power Query で安定して取り込む実務テンプレ」です。
たとえば「B3:F20 だけを読みたい」「毎回同じ位置の表だけを取り込みたい」「タイトルや注釈は無視して、表の部分だけ欲しい」といった場面を想定します。

ここでは、プログラミング初心者でも扱えるように、次の順番でかみ砕いていきます。
まずは「一番おすすめのやり方(名前付き範囲・テーブル化)」、次に「どうしてもセル番地で取りたい場合の考え方」という流れで説明します。


基本の考え方:Power Queryは「表」を読むのが得意

いきなり「B3:F20」を指定しない方がいい理由

Power Queryは「セルの座標」を直接指定するよりも、「表(テーブル)」「名前付き範囲」「シート全体」など、少し大きめの単位で読み込んでから、そこから不要な行や列を削る、という使い方が得意です。

いきなり「B3:F20」と番地で指定してしまうと、次のような問題が起きやすくなります。

行が1行増えたら範囲を変えないといけない。
列が1列増えたらまた修正が必要になる。
別のファイルに適用したときに、微妙なズレで壊れやすい。

なので、実務テンプレとしては「Excel側で“範囲に名前を付ける”か“テーブル化する”→Power Queryではその名前を指定して読む」という形が一番安定します。


パターン1:名前付き範囲を使って特定セル範囲を取込む

Excel側での準備イメージ

まずはExcel側で、取り込みたい範囲を選択して「名前付き範囲」にします。

たとえば、B3:F20 を選択して「売上範囲」という名前を付けるイメージです。
数式バーの左にある「名前ボックス」に「売上範囲」と入力して Enter、でもOKです。

こうしておくと、そのブックの中に「売上範囲」という“オブジェクト”が1つ増えます。
Power Queryからは、この名前付き範囲を「Kind = DefinedName」として認識できます。

外部ブックから「名前付き範囲」を読む M コード

たとえば、C:\Data\SalesRange.xlsx の中に「売上範囲」という名前付き範囲があるとします。
その範囲だけを Power Query で読みたい場合のテンプレは、次のようになります。

let
    // 1) ブック全体を読み込む
    XlFile = File.Contents("C:\Data\SalesRange.xlsx"),
    Source = Excel.Workbook(XlFile, true, true),

    // 2) 名前付き範囲「売上範囲」を特定
    NamedRow = Source{[Name = "売上範囲", Kind = "DefinedName"]},

    // 3) その Data 列(中身のテーブル)を取り出す
    NamedTable = NamedRow[Data],

    // 4) 必要なら先頭行をヘッダーに昇格
    Promoted = Table.PromoteHeaders(
        NamedTable,
        [PromoteAllScalars = true]
    )
in
    Promoted

ここで一番重要なのは、この行です。

NamedRow = Source{[Name = "売上範囲", Kind = "DefinedName"]},

これは「Excel.Workbook の結果テーブルの中から、Name が ‘売上範囲’ で Kind が ‘DefinedName’ の行を1つだけ取り出す」という意味です。
その行の Data 列が、まさに B3:F20 の中身(表)になっています。

名前付き範囲を使うメリットは、「範囲が変わっても名前さえ同じなら Power Query 側は一切修正不要」という点です。
行が増えたり列が増えたりしても、Excel側で名前付き範囲を広げるだけで済みます。


パターン2:テーブル化して特定セル範囲を取込む

Excel側で「テーブルとして書式設定」を使う

もう一つの王道パターンが、「範囲をテーブル化する」方法です。
Excelで B3:F20 を選択して、「挿入」タブの「テーブル」または「ホーム」タブの「テーブルとして書式設定」を使います。

テーブルには「テーブル名」が付きます。
たとえば「tblSales」という名前にしておくと、Power Queryからは「Kind = Table」として認識できます。

テーブルの良いところは、行が増えたときに自動で範囲が広がることです。
毎月行数が増えていくようなデータには、テーブル化が非常に相性が良いです。

外部ブックから「テーブル」を読む M コード

C:\Data\SalesTable.xlsx の中に「tblSales」というテーブルがあるとします。
そのテーブルだけを読み込むテンプレは、次のようになります。

let
    // 1) ブック全体を読み込む
    XlFile = File.Contents("C:\Data\SalesTable.xlsx"),
    Source = Excel.Workbook(XlFile, true, true),

    // 2) テーブル「tblSales」を特定
    TblRow = Source{[Name = "tblSales", Kind = "Table"]},

    // 3) その Data 列(中身のテーブル)を取り出す
    Tbl = TblRow[Data]
in
    Tbl

テーブルの場合、通常はすでにヘッダー行が設定されているので、Table.PromoteHeaders は不要なことが多いです。
もし1行目がヘッダーではない場合は、テーブル化の前にExcel側でヘッダーを整えるか、Power Query側で昇格処理を追加します。

ここでも重要なのは、「Name と Kind で行を特定する」というパターンです。
テーブル名を変えない限り、Power Query側のコードはそのまま使い続けられます。


パターン3:どうしてもセル番地で取りたい場合の考え方

シート全体を読み込んでから「行・列を削る」

「名前付き範囲もテーブルも使えない」「でも B3:F20 だけ欲しい」という状況も、現場ではたまにあります。
その場合は、次のような発想で組み立てます。

まずはシート全体を読み込む。
そこから上の行を削る、左の列を削る、必要な行数・列数だけ残す。

たとえば、「Sheet1 の B3:F20 を取りたい」場合のイメージです。

let
    // 1) ブック全体を読み込む
    XlFile = File.Contents("C:\Data\SalesRaw.xlsx"),
    Source = Excel.Workbook(XlFile, true, true),

    // 2) Sheet1 を特定して中身を取得
    SheetRow = Source{[Name = "Sheet1", Kind = "Sheet"]},
    SheetTable = SheetRow[Data],

    // 3) 上から2行を削除(3行目が先頭になる)
    RemovedTopRows = Table.Skip(SheetTable, 2),

    // 4) 左から1列を削除(B列が先頭になる)
    RemovedLeftCols = Table.RemoveColumns(
        RemovedTopRows,
        {"Column1"}
    ),

    // 5) 必要な行数だけ残す(ここでは18行分=3〜20行目)
    KeptRows = Table.FirstN(RemovedLeftCols, 18),

    // 6) 必要な列数だけ残す(ここでは5列分=B〜F)
    KeptCols = Table.FirstN(
        Table.Transpose(KeptRows),
        5
    ),
    Result = Table.Transpose(KeptCols)
in
    Result

この方法は、「行数・列数が固定で変わらない」前提なら使えますが、行が増えたり列が増えたりするとすぐにズレます。
そのため、実務テンプレとしては「最終手段」として覚えておくくらいがちょうどいいです。


重要ポイントの深掘り

なぜ「名前付き範囲」や「テーブル化」が圧倒的におすすめなのか

理由はシンプルで、「Power Query側のコードを変えずに、Excel側だけで柔軟に調整できるから」です。

名前付き範囲なら、範囲を広げたり狭めたりしても、名前さえ同じなら Power Query はそのまま動きます。
テーブルなら、行が増えても自動で範囲が広がるので、「毎月行数が変わる」ようなデータに強いです。

一方、セル番地で固定してしまうと、範囲が変わるたびに M コードを修正する必要が出てきます。
現場で長く使うテンプレとしては、メンテナンスコストが高くなりがちです。

Excel.Workbook の「Data 列」の正体を理解しておく

初心者が最初に戸惑うポイントが、「Data 列の中にさらにテーブルが入っている」という構造です。

Excel.Workbook の結果は、「ブックの中身のカタログ表」です。
各行は「1つのシート」「1つのテーブル」「1つの名前付き範囲」などを表し、その中身が Data 列に入っています。

だからこそ、次の三段階が必要になります。

ブック全体を Excel.Workbook で読み込む。
Name と Kind で欲しい行を1つだけ特定する。
その行の Data 列を取り出すと、中身の表が手に入る。

この構造さえ一度つかめば、「特定シート名」「特定テーブル」「特定名前付き範囲」など、いろいろなパターンに応用できます。


実務テンプレとしてのまとめイメージ

特定セル範囲を取り込みたいときの、実務的な優先順位はこうなります。

まずは Excel 側で「テーブル化」または「名前付き範囲」を検討する。
それが難しい場合だけ、「シート全体を読み込んでから行・列を削る」方式を使う。

Power Query側では、「Excel.Workbook → Name/Kind で行を特定 → Data を取り出す」という型をベースにしておけば、あとは名前だけ変えればどんどん再利用できます。

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