ゴールのイメージを先にそろえる
今回のテーマは「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 を取り出す」という型をベースにしておけば、あとは名前だけ変えればどんどん再利用できます。

