LEVEL 8 テーブルとデータベース的思考 上級
Lesson 073

OFFSET関数について②

練習用Excelファイル lesson073-practice.xlsx

練習用ファイルは、パソコンからダウンロードしてください。

OFFSET関数について②

前回はOFFSET関数の基本構文と「範囲を返す」という考え方を学びました。今回は、その応用編 ── 動的な仕組みを作る OFFSET の実用パターン を3つ紹介します。

  • ケース①:追加されたら、自動で集計範囲が伸びる SUM
  • ケース②:入力するたびに勝手に伸びるドロップダウンリスト
  • ケース③:最新N件だけを取り出す「動く範囲」

どれも「OFFSET でしかきれいに書けない」というほどではありませんが、OFFSET を覚えると最短で書ける ──そんな仕事に登場する場面ばかりです。


ケース①:データが追加されると、合計範囲も自動で伸びる

売上記録のように、データが日々追加される表があるとします。

:::excel
A1=日付
B1=金額
A2=2026/5/1
B2=400
A3=2026/5/2
B3=350
A4=2026/5/3
B4=500
A5=2026/5/4
B5=300
A6=2026/5/5
B6=420
:::

B列の金額を、データが追加されても自動で合計したい」というケース。

普通に書くなら、

=SUM(B2:B6)

ですが、これだと7行目に追加されたデータは集計されません。

ここで OFFSET の出番です。

=SUM(OFFSET(B2, 0, 0, COUNTA(B2:B1000), 1))

  • B2 を基準
  • ずれゼロ(B2 のまま開始)
  • 高さは COUNTA(B2:B1000) で「B列のデータ数」を動的に取得
  • 幅は1列

→ データが何行あろうと、入力されている分だけが集計対象 になります。

動的な集計範囲
動的な集計範囲

7行目、8行目、9行目とデータが増えても、数式を書き直す必要がありません


テーブルでもいいのでは?

そう思った方は鋭いです。レッスン070でご紹介したテーブル化(Ctrl+T)でも、同じ「自動範囲拡張」が実現できます。むしろテーブルのほうが手軽で安全です。

OFFSET を使う場面は、テーブル化ができない・したくない場面 に限られます。たとえば、

  • 既存資料のレイアウトを維持したい
  • セル結合や複雑な書式がある
  • 受け取った他人のフォーマットを変えられない
  • ピボットテーブルの データソースとして範囲を動的に与えたい

特に ピボットテーブルや、グラフのデータ系列の範囲を動的にする ときに、OFFSET が活躍します。テーブルでは置き換えが効かない領域があるのです。


ケース②:勝手に伸びるドロップダウンリスト

レッスン015で データの入力規則(リスト) をご紹介しました。決まった選択肢から選ばせる、あの仕組みです。

普通は「リストの元の値」に 固定の範囲 を指定します(例:=$B$2:$B$6)。けれども、選択肢が増えていく可能性があるなら、範囲も自動で広げたい ですよね。

ここで、名前の定義(レッスン055)と OFFSET の組み合わせ が活躍します。

手順

  1. 数式タブ →「名前の定義
  2. 名前:商品リスト
  3. 参照範囲:

=OFFSET($B$2, 0, 0, COUNTA($B$2:$B$1000), 1)

名前の定義
名前の定義

  1. データの入力規則 → リスト → 「元の値」に:

=商品リスト

リスト設定
リスト設定

商品名を1つ追加するたびに、ドロップダウンリストの選択肢も自動で1つ増えます

動的なドロップダウンリスト
動的なドロップダウンリスト

「リストのメンテナンスが面倒」と思っていた業務が楽になる定番パターンです。

社内マスタを共通化したい商品リストを部署横断で使い回したい ── そんな現場で重宝します。


ケース③:最新N件を取り出す

いちばん最近の3件の売上だけ見たい」というケース。

:::excel
A1=日付
B1=金額
A2=2026/5/1
B2=400
A3=2026/5/2
B3=350
A4=2026/5/3
B4=500
A5=2026/5/4
B5=300
A6=2026/5/5
B6=420
A7=2026/5/6
B7=380
A8=2026/5/7
B8=450
:::

データが追加されるたびに「最新3件」が更新されます。

ネストしているCOUNTA関数は列取得をします。

=OFFSET(B1, COUNTA(B:B) - 3, 0, 3, 1)

  • B1 を基準に
  • 下に「B列の入力数 - 3」行ずらす(=末尾3件の手前まで進む)
  • 高さ3行、幅1列

これで、常に「最新3件のB列範囲」を指す ことができます。SUM で囲えば最新3件の合計、AVERAGE で囲えば最新3件の平均が出ます。

=AVERAGE(OFFSET(B1, COUNTA(B:B) - 3, 0, 3, 1))

→ 直近3日の平均売上が 常に最新の状態で計算 されます。

最新N件を取り出す
最新N件を取り出す

直近の動きだけウォッチしたい」KPI管理や、ダッシュボード作り で本当によく使うパターンです。


OFFSET の応用は「動的グラフ」にも効く

ちょっと先取りになりますが、レッスン083以降の グラフ でも、OFFSET は活躍します。

グラフの データ系列に、固定の範囲ではなく「名前の定義 + OFFSET」を指定 すると、データの追加に合わせて グラフの折れ線や棒が自動で伸びていく ── そんな表現も可能です。

伸びるグラフ」── 報告用ダッシュボードで「お、これは何だか動くぞ」と相手の興味を引く効果もあります。


やってはいけないOFFSETの使い方

便利な OFFSET ですが、注意すべきパターンもあります。

① 巨大な範囲で全セルにOFFSETを置く

たとえば1万行ある表の全行に OFFSET を入れる、というのは 絶対に避けて ください。揮発性関数なので、ファイル全体が極端に重くなります

② 普通の VLOOKUP で済む話に持ち出さない

A列の値で検索して、B列を返したい」── これは XLOOKUP(レッスン051)や VLOOKUP(レッスン048)の仕事です。OFFSET でも書けますが、わざわざ OFFSET を使う理由はありません。

③ 入れ子を深くしすぎない

OFFSET の中に OFFSET、その中にさらに OFFSET ── このような 深いネスト は、本人以外には読めない数式になります。他の関数で代用できないか、いったん立ち止まる クセをつけましょう。


OFFSET の代替を考える

最近のバージョンの Excel(Microsoft 365)では、OFFSET の役割を より新しい関数で代用 できる場面が増えています。

  • テーブル + 構造化参照 で「自動拡張する範囲」が作れる
  • FILTER関数(レッスン059)で動的な抽出ができる
  • TAKE関数 / DROP関数 で「先頭N件・末尾N件」を切り出せる(Microsoft 365のみ)

新しい関数で書ける場面は、できるだけそちらを優先する」── これが、揮発性関数とうまく付き合う一番の方法です。OFFSET は 「ここでしか書けない」場面に温存 しておく。これくらいのスタンスがちょうど良いです。

100Excelでは、TAKE関数とDROP関数は触れませんが、ここまで関数を見てくれば、引数ダイアログを見るだけで使えるかなと思います。ぜひ、確認してみてくださいね。


まとめ

  • データの 自動拡張集計 には =SUM(OFFSET(B2, 0, 0, COUNTA(B:B)-1, 1)) パターン
  • 入力規則のリスト を伸ばすときは「名前の定義 × OFFSET
  • 最新N件を取るには OFFSET(基準, COUNTA(...)-N, 0, N, 1)
  • 動的グラフ の元範囲にもOFFSETが活躍
  • 揮発性ゆえに 使いどころを絞る のが上級者の流儀

次回からは、もう1つの強力な動的参照ツール ── INDIRECT関数 に進みます。

OFFSET が「位置の指差し」だとすれば、INDIRECT は「文字列でセルを呼び出す」関数。発想がまた違って、面白い世界が広がります。


ショートカット

※このレッスンに対応するショートカットはありません。

次のLessonへ Lesson 074 INDIRECT関数について①