要点(TL;DR) —
OFFSETは、アンカーセルから始まり、指定した行数だけ下へ、 列数だけ右へ歩き、必要なら指定した高さと幅のブロックをつかむ参照を返します。 構文は=OFFSET(reference, rows, cols, [height], [width])。=OFFSET(A1, 2, 1)は A1 から 2 行下・1 列右のセル(つまり B3)です。 値ではなく 参照 を返すので、SUM・AVERAGE・COUNTで包むことができ、 必要に応じてサイズが変わります。注意点が 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 だけ右へ歩いて新しいセルに
着地し、そして — height と width を与えれば — その着地セルから
そのサイズのブロックへ広がります。
=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!)
正の数は下と右へ、負の数は上と左へ動きます。height と width を省略すると、
結果はアンカーと同じサイズ(通常は 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 列右のセルです。
参照を返すので、通常は SUM・AVERAGE・COUNT で包みます。
なぜ 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
