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

OFFSET関数について①

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

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

OFFSET関数について①

ここからは LEVEL 8 の最終盤、上級者の領域 に踏み込んでいきます。

第1弾は OFFSET関数(オフセット関数) です。「オフセット」は英語で「ずらす、相殺する」という意味があります。

文字通り、基準のセルから「○行○列ずらした位置」を指し示す関数 です。

これだけ聞くと「何の役に立つのか」と思われるかもしれません。実際、初級・中級ではほぼ登場しない関数です。

けれども、OFFSET を理解すると、Excel の表現力が一気に跳ね上がります。

  • 表のサイズが変わっても 自動で追随する集計範囲
  • データを入力するたびに 勝手に伸びるドロップダウンリスト
  • 月を切り替えると 参照範囲が動くグラフ

こうした「動的な仕組み」の根っこにあるのが OFFSET です。最初は構文に戸惑いやすい関数ですが、丁寧に分解していきましょう。

関数ライブラリ
関数ライブラリ


OFFSET関数の構文

=OFFSET(参照, 行数, 列数, 高さ, 幅)

引数は5つあります。

  • 参照 :スタート地点になるセル(または範囲)
  • 行数 :基準から 下方向 へ何行ずらすか(マイナスなら上)
  • 列数 :基準から 右方向 へ何列ずらすか(マイナスなら左)
  • 高さ :返す範囲の 行数(省略すると基準と同じ高さ)
  • :返す範囲の 列数(省略すると基準と同じ幅)

参照セルから、行と列をずらして、その先の範囲を取ってくる」── これがOFFSETの仕事です。

引数ダイアログ
引数ダイアログ


まずは一番シンプルな使い方

引数を全部使うと混乱するので、前半3つだけ で動かしてみます。

:::excel
A1=商品コード
B1=商品名
C1=単価
A2=P001
B2=コーヒー
C2=400
A3=P002
B3=紅茶
C3=350
A4=P003
B4=ケーキ
C4=500
A5=P004
B5=プリン
C5=300
:::

E1セルに、

=OFFSET(A1, 2, 1)

結果:紅茶

「A1 から 下に2行、右に1列 ずれたセル」── つまり B3 のセル を指しています。

OFFSETで位置をずらす
OFFSETで位置をずらす

OFFSET の動きは、Excel の中で 「指差し」をしている ような感覚で捉えると分かりやすいです。「A1 を基準に、ここから下に2、右に1。そこを見てね」── そう Excel に伝えているわけです。


マイナス指定で「上方向・左方向」へ

行数・列数には マイナスの値 も入れられます。

=OFFSET(C5, -1, -2)

C5 から 上に1行、左に2列 ずれた位置 ── A4 を指します。結果:P003

今いる場所からの相対位置」で考えられるのが、OFFSET の柔軟さです。


「範囲」を返すこともできる

ここから OFFSET の真価です。引数の 4番目(高さ)と5番目(幅) を指定すると、「点(セル1つ)」ではなく「範囲(セルの塊)」を返す ようになります。

=OFFSET(A1, 1, 2, 4, 1)

  • A1 を基準に、
  • 下に1行、右に2列 ずれた位置(= C2 セル)から、
  • 高さ4行、幅1列 の範囲

つまり C2:C5 という範囲を返します。

これを SUM 関数で囲うと、

=SUM(OFFSET(A1, 1, 2, 4, 1))

→ C2:C5 の合計 = 1550(=400+350+500+300)

OFFSETで範囲を返す
OFFSETで範囲を返す

OFFSET で動く範囲を作って、別の関数で集計する」── これが OFFSET の使い道の中心です。


単独では結果が見えにくい

OFFSET をセルに単独で入れて「範囲」を返すと、スピル対応の Excel では範囲が広がって表示 されますが、それ以前のバージョンでは #VALUE! などのエラーになることがあります。

OFFSET は「範囲を作る関数」と理解して、SUM や COUNTA、AVERAGE など、範囲を引数に取る関数と組み合わせて使う のが基本スタイルです。


高さと幅は「動的に決められる」

ここがいちばん大事なポイント。

OFFSET の 「高さ」「幅」も、固定の数字ではなく、関数で動的に計算できる のです。

たとえば、COUNTA関数(レッスン034)で「A列に入力されているセルの数」を数えて、それを OFFSET の高さに渡せば、

=SUM(OFFSET(C2, 0, 0, COUNTA(A2:A1000), 1))

  • C2 を基準に
  • ずれゼロ(C2のまま)
  • 高さは「A2:A1000 の入力数」← データが増えれば自動で増える
  • 幅は1列

データの追加に合わせて、合計範囲も自動で伸びる仕組み が作れます。

これがテーブル(レッスン070)の 自動範囲拡張 に近い動きを、テーブル化せずに実現する方法です。

詳しい応用例は次回のレッスン073でじっくり扱いますが、「範囲を動的にできる」というイメージだけ、いま持っておいてください。


OFFSET vs INDEX

ここで、似た役割の関数 INDEX関数(レッスン054) との違いをひと言。

  • INDEX :あらかじめ範囲を渡しておいて、その 何行目・何列目 を取り出す
  • OFFSET :基準セルから 何行・何列ずらして、そこから 指定サイズの範囲 を作る

INDEX は「既にある範囲の中の1点を指す」のに対し、OFFSET は「範囲そのものを作る」関数です。役割が違うのですね。

「集計関数の 範囲指定 を動的にしたい」ときは OFFSET、「ルックアップ的に1つの値を取り出したい」ときは INDEX、という使い分けが基本です。


OFFSET は「揮発性関数」

OFFSET を使うにあたって、必ず知っておいてほしい注意点 が1つあります。

OFFSET は 揮発性関数(volatile function) と呼ばれる、特殊なタイプの関数です。

「揮発性」というのは、ファイル内のどこかのセルが少しでも変更されると、OFFSET を含むすべての数式が再計算される という性質。

通常の関数(SUMやVLOOKUP)は、参照しているセルが変わったときだけ 再計算されます。一方、OFFSET(TODAY、NOW、RAND、および後に学ぶ INDIRECT など)は、自分が直接関係していないセルの編集でも、毎回計算し直されます

少数なら問題ありませんが、

  • 大量のセルで OFFSET を使う
  • 巨大な表で何度も OFFSET を呼び出す

このようなケースでは、Excel が重くなる原因 になります。

一番わかりやすい例でいうと、NOW関数です。入力をするごとに、関数が再読み込みされて動的に動きます。

NOW関数で毎回リロード
NOW関数で毎回リロード

NOW関数で毎回リロード
NOW関数で毎回リロード

NOW関数で毎回リロード
NOW関数で毎回リロード

ですから、OFFSET は 「動的な仕組みが必要な場所だけ」に絞って使う、というのが上級者の流儀です。「テーブル化で済むなら、まずはテーブルで」── これが第一原則です。

とはいえ、どんなシーンで使えるのか、なかなかイメージができない人のほうが多いでしょう。

事例を次のレッスンで取り上げますので、ひとまずこちらでは OFFSET関数なんて不思議な関数があるんだー とだけ理解していただければ十分です。


まとめ

  • OFFSETは 基準セルから○行○列ずらした位置・範囲を返す 関数
  • 構文:=OFFSET(基準, 行数, 列数, 高さ, 幅)
  • 行数・列数は マイナス も可(上方向・左方向)
  • 高さ・幅を指定すれば 範囲 を返せる
  • SUM・COUNTA など 範囲を取る関数と組み合わせる のが基本
  • INDEX が「点を指す」、OFFSET が「範囲を作る」
  • OFFSET は 揮発性関数。使いすぎるとファイルが重くなる

次回は、OFFSET の本領発揮編。動的な集計範囲・連動ドロップダウン・伸びるグラフ など、「これは凄い」と思わず唸る実例を紹介します。


ショートカット

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

次のLessonへ Lesson 073 OFFSET関数について②