🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel OFFSET 関数 — 動く参照(そして INDEX の方が良い場面)

|

Excel OFFSET 関数 — 動く参照(そして INDEX の方が良い場面)

要点(TL;DR)OFFSET は、アンカーセルから始まり、指定した行数だけ下へ、 列数だけ右へ歩き、必要なら指定した高さと幅のブロックをつかむ参照を返します。 構文は =OFFSET(reference, rows, cols, [height], [width])=OFFSET(A1, 2, 1) は A1 から 2 行下・1 列右のセル(つまり B3)です。 値ではなく 参照 を返すので、SUMAVERAGECOUNT で包むことができ、 必要に応じてサイズが変わります。注意点が 2 つ。この関数は 揮発性(編集のたびに再計算される)であり、単に位置でセルを選ぶだけなら、 非揮発性の INDEX がパフォーマンスの代償なしに 同じ仕事をします。OFFSET は本当に動く窓のために取っておきましょう。

=SUM(OFFSET(A1, 0, 0, COUNTA(A:A), 1))   ' A 列がどれだけ伸びても列全体を合計
=SUM(OFFSET(B2, COUNT(B:B)-3, 0, 3, 1))  ' B 列の最後の 3 つの数値を合計

多くの人が OFFSET に出会うのは「動的範囲」のエンジンとして — 行が追加されると自動で拡張する名前付き範囲やグラフのデータ元です。それは 得意とするところで、他の何ものもこれほど整然とは表せない、いくつかの動く窓の 問題も得意です。しかし同時に揮発性で行き過ぎやすく、そして現代の Excel は その古い用途の半分を静かに時代遅れにしました。このガイドでは、考え方の軸、 落とし穴、そしていつ代わりに INDEX へ切り替えるべきかの明確な線引きを示します。

このガイドで学べること

  • 考え方の軸: アンカーから始まり、動き、そして必要ならブロックをつかむ
  • なぜ OFFSET参照を返すのか — そしてそれが SUM で包める理由
  • 揮発性という代償と、端を越えると #REF! になる罠
  • 定番の動的名前付き範囲 — そしてテーブルやスピル範囲が今やそれに勝る理由
  • 本当に置き換えづらいニッチ: 動く窓とローリング合計
  • 判断の分かれ目: OFFSET 対 非揮発性の INDEX

考え方の軸: ここから始め、これだけ歩き、これだけつかむ

OFFSET には 5 つの引数がありますが、語る物語は 1 つのシンプルなものです。 アンカーから始まり、rows だけ下へ、cols だけ右へ歩いて新しいセルに 着地し、そして — heightwidth を与えれば — その着地セルから そのサイズのブロックへ広がります。

=OFFSET(A1, 2, 1)         ' B3 に着地(2 下、1 右)、1 セル
=OFFSET(A1, 2, 1, 3, 2)   ' B3 から始まる 3 行 × 2 列のブロック  ->  B3:C5
=OFFSET(A1, -1, 0)        ' 負の数は上へ歩く -> A1 の上の行(ここでは #REF!)

正の数は下と右へ、負の数は上と左へ動きます。heightwidth を省略すると、 結果はアンカーと同じサイズ(通常は 1 セル)になります。これで関数のすべてです — 長方形にも伸びられる動くポインターです。

なぜ値ではなく参照を返すのか

これが OFFSET を便利にし、初心者を混乱させる性質です。OFFSET はブロックの 中身 を返すのではなく、ブロックへの参照を返します。セル内に単独で置くと、 =OFFSET(A1,2,1,3,2) はスピルするか先頭の値を表示しますが、その本当の目的は 別の関数に渡されることです。

=SUM(OFFSET(A1, 0, 0, 12, 1))     ' A1 を起点とする 12 行のブロックを合計
=AVERAGE(OFFSET(A1, 0, 0, 12, 1)) ' 同じブロックを平均

ブロックの高さは引数なので、それを数式にできます — COUNTA(A:A)MATCH(...)、ユーザーが入力するセルなど — すると範囲は 自分でサイズを変えます。それが OFFSET に基づくあらゆる「動的範囲」の 土台のすべてです。

定番の動的範囲 — そして現代の置き換え

長年、グラフやドロップダウンをデータとともに伸ばす標準的な方法は、 OFFSET の名前付き範囲でした。

' 名前 "SalesData" =  OFFSET($A$1, 0, 0, COUNTA($A:$A), 1)
' A 列に現在ある行数へ自動で拡張する

機能はします。しかし現行のどの Excel でも、これは 2 つの理由から 間違った既定です。第一に、OFFSET揮発性です — これで埋め尽くされた ブックはキー入力のたびに再計算し、遅く感じ始めます。第二に、Excel には今や 同じことをもっと読みやすくこなす非揮発性の道具があります。

  • Excel テーブルCtrl+T)は自動で伸び、Table1[Sales] と参照すれば、 それを指すすべてのグラフ・SUMIFS・ドロップダウンが自ら拡張します — 数式なし、揮発性なし。
  • 動的配列数式からのスピル範囲# 演算子を使います。=FILTER(...) が E2 からスピルするなら、E2# こそ が生きた範囲で、常に正しいサイズです。

結論。2026 年に OFFSET の動的名前付き範囲へ手を伸ばそうとしているなら、 代わりにテーブルかスピル参照へ手を伸ばしてください。 OFFSET の範囲は、 新規ではなく、保守中のレガシーブックのためだけに残しましょう。

罠: 端を越えて歩くと #REF! を返す

OFFSET は存在しない場所へ送ると派手に失敗します。1 行目より上や A 列より左へ 動いたり — あるいはシートの最終行を越えるブロックのサイズを指定したり — すると #REF! になります。

=OFFSET(A1, -1, 0)          ' #REF!  — A1 の上に行はない
=OFFSET(A1, 0, 0, 0, 1)     ' #REF!  — ブロックの高さは 0 にできない

厄介なのは動的範囲で噛みつく版です。COUNTA($A:$A) が列のはるか下にある 迷子の値を数えたり、空の列で 0 を数えたりすると、高さ引数が狂って、 範囲全体がつぶれるかエラーになります。データの本当の先頭にアンカーを置き、 サイズ計算式が 0 を返し得ないことを確かめてください。

OFFSET が守り続けるニッチ: 動く窓

ここが OFFSET がまだ居場所を勝ち取るところです — 開始位置とサイズが一緒に動く、 スライドする窓です。ローリング合計と「最後の N 行」がその代表例です。

' B 列の直近 3 件のローリング合計
=SUM(OFFSET(B2, COUNT(B2:B1000)-3, 0, 3, 1))

' 一致したヘッダーから N 行下の値(動く読み取り点)
=OFFSET($A$1, MATCH("Total", $A:$A, 0)-1, 1)

「アンカーし、数式が計算した位置へジャンプし、その周りの窓を読む」という動きは、 他のどんな方法でも表すのが本当にぎこちないのです。ここでも、日付ベースの ローリング合計はしばしば ">="&cutoff 条件を使う SUMIFS の方が明快です — しかし位置的な行数ベースの窓には、OFFSET がなお最も引き締まった 道具です。

判断の分かれ目: OFFSET 対 INDEX

OFFSET の乱用のほとんどを直す唯一のルール。範囲へのインデックス取り出し — 「この位置のセルをちょうだい」 — に OFFSET を使っているなら、INDEX に 切り替えてください。 INDEX も参照を返し、同じ位置指定の取り出しをし、そして 揮発性ではありません

=OFFSET($A$1, n, 0)     ' A 列の (n+1) 番目のセルを得る揮発性のやり方
=INDEX($A:$A, n+1)      ' 同じセル、非揮発性、Excel がトレースできる
  • 位置でセル/行/列を選ぶINDEX。非揮発性、トレース可能、より明快に 読めます。人が OFFSET を使う用途の大多数はこれで賄えます。
  • データが追加されるにつれ範囲を伸ばすテーブルまたは スピル # 参照
  • 本当に動く窓(ローリング合計、最後の N 行、一致点の周りを読む) → OFFSET がなお正しい選択です。意図的に、少数だけ残しましょう。

強い意見。OFFSET は専門家であって定番の主役ではありません。INDEX・ テーブル・スピル範囲に置き換えるすべての揮発性 OFFSET が、ブックを速くし、 次の人がトレースしやすくします — そして失うのは再計算の遅延だけです。

ExcelMaster はどう役立つか

OFFSET の数式は、スプレッドシートが遅く読みづらくなる場所です — ネストした COUNTA、1 つずれた高さ、そしてファイルが這うまで誰も気づかない揮発性。 ExcelMaster はゴール — データとともに伸びるグラフ3 か月のローリング合計「合計」という行の隣の値 — を読み取り、現代的なやり方で書きます。ただ伸ばしたい だけならテーブルかスピル範囲、位置でインデックスするなら INDEX、そして本当に 動く窓が求めるときにだけ引き締まった OFFSET を。あなたは、子守りすべき 揮発性の数式を受け継ぐことなく、動的な挙動を手に入れられます。

よくある質問

Excel の OFFSET 関数は何をするのですか?

起点となるアンカーから決まった行数・列数だけ離れた参照を返し、必要なら ブロックにリサイズします: =OFFSET(A1, 2, 1) は A1 から 2 行下・1 列右のセルです。 参照を返すので、通常は SUMAVERAGECOUNT で包みます。

なぜ OFFSET は揮発性とみなされるのですか?

Excel は計算するまで OFFSET がどのセルを指すか予測できないため、入力が 変わったときだけでなくすべての再計算で再評価します。少数なら無害ですが、 何千個もあるとブックは目立って遅くなります。それが、できるところで INDEX や テーブルを選ぶ主な理由です。

OFFSET 対 INDEX — どちらを使うべきですか?

位置でセルを選ぶなら INDEX を使ってください — OFFSET と同じく参照を返しますが、 非揮発性でトレース可能です。OFFSET は、開始位置とサイズが一緒に動く本当に 動く窓(ローリング合計、「最後の N 行」)のために取っておきましょう。

OFFSET で動的範囲を作るには?

定番のパターンは、名前付き範囲の中の =OFFSET($A$1, 0, 0, COUNTA($A:$A), 1) で、 A 列が埋まるにつれ伸びます。現代の Excel では、代わりに Excel テーブルスピル参照A2#)を選んでください — どちらも揮発性なしに自動拡張します。

なぜ私の OFFSET は #REF! を返すのですか?

シートの端を越えて動いた(1 行目より上の負の行、最終列より先)か、ブロックに 高さや幅 0 を与えたかです。動的範囲では、これはたいてい高さの数式(COUNTA など) が 0 か予想外の数を返したことを意味します。アンカーとサイズ引数を確認してください。

検証環境

検証環境: Excel 365 (Windows 11) — 最終確認 2026-07-01。

関連ガイド: Excel INDIRECT · Excel ADDRESS · Excel SUMIFS · Excel FILTER · Excel XLOOKUP