ExcelのOFFSET関数の使い方|動的な範囲指定で集計を自動化する方法

スポンサーリンク

「基準のセルから何行・何列ずれた場所を参照したい」。そんな場面で活躍するのがOFFSET関数です。

単体でも便利ですが、SUM関数やCOUNTA関数と組み合わせるのが本領です。データが増えても自動で集計範囲が広がる仕組みを作れます。基本の書き方から実務で使える動的範囲の作り方まで解説します。

この記事は次のような人におすすめ

  • OFFSET関数の基本的な使い方を知りたい
  • データが増減しても自動で対応する集計式を作りたい
  • MATCH関数やSUM関数との組み合わせ方を知りたい

OFFSET関数とは?

OFFSET関数は、基準のセルから指定した行数・列数だけ移動した位置にあるセルやセル範囲を返す関数です。

読み方は「オフセット関数」です。英語の offset は「ずらす」という意味で、基準点からの「ずれ」を表します。

最大の特徴は、第4・第5引数で「高さ」と「幅」を指定できる点です。任意のサイズの範囲を動的に生成できます。SUM関数やAVERAGE関数の引数に入れれば、データの増減に自動対応します。

NOTE

OFFSET関数は「揮発性関数」です。ブック内のどこかのセルが変更されるたびに再計算されるため、大量に使うとファイルが重くなることがあります。固定範囲で済む場面では通常のセル参照を使いましょう。

OFFSET関数の書き方(構文と引数)

基本構文

=OFFSET(基準, 行数, 列数, [高さ], [幅])

引数の説明

引数必須/省略可説明
基準必須移動の起点となるセルまたはセル範囲
行数必須基準から下方向に移動する行数。負の数で上方向
列数必須基準から右方向に移動する列数。負の数で左方向
高さ省略可返す範囲の行数。省略時は基準と同じ行数
省略可返す範囲の列数。省略時は基準と同じ列数

TIP

行数・列数に 0 を指定すると、その方向には移動しません。「行だけずらしたい」「列だけずらしたい」場合は、動かさない方を 0 にします。

OFFSET関数の基本的な使い方

単一セルを参照する

セルA1を基準に、2行下・1列右のセルを参照するには次のように書きます。

=OFFSET(A1, 2, 1)

A1から2行下・1列右なので、B3の値が返ります。

上方向・左方向に移動する

行数や列数に負の数を指定すると、上方向・左方向に移動できます。

=OFFSET(C5, -2, -1)

C5から2行上・1列左なので、B3の値が返ります。

セル参照で移動量を指定する

行数・列数を直接入力せず、セルの値で指定することもできます。

=OFFSET(A1, B1, B2)

B1に 3、B2に 2 が入っていれば、C4を参照します。値を変えるだけで参照先を切り替えられるのが便利です。

範囲を返す(高さ・幅の指定)

第4・第5引数を指定すると、OFFSET関数は複数セルの範囲を返します。

=SUM(OFFSET(A1, 0, 0, 5, 1))

A1を起点に、高さ5行・幅1列の範囲(A1:A5)の合計を返します。この「範囲を返す」使い方が実務では最も重要です。

OFFSET関数の実務活用パターン

SUM + OFFSET + COUNTAで動的合計

売上データが随時追加される表で、常に最新の合計を出したい場面はよくありますよね。OFFSET関数とCOUNTA関数を組み合わせましょう。データが増えても自動で範囲が広がります。

B列に売上金額が入っていて、B1が見出し行だとします。

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

この数式の動きを分解すると次のようになります。

  • COUNTA(B:B)-1 でB列のデータ件数を取得(見出し行を除く)
  • OFFSET(B1, 1, 0, ...) でB2を起点にデータ件数分の高さを持つ範囲を生成
  • SUM関数でその範囲を合計

データを1行追加すると、COUNTAの結果が1つ増え、OFFSETの高さも自動的に1行広がります。

AVERAGE + OFFSETで直近N件の平均

直近の売上データだけを対象に平均を取りたい場合も、OFFSET関数が便利です。

B列に売上金額、E1に「直近何件分か」の件数を入力するとします。

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

E1に 5 と入力すれば、最新5件の平均が計算されます。値を変えるだけで件数を切り替えられるのがポイントです。

MATCH + OFFSETで検索結果のずれた列を取得

MATCH関数で見つけた行位置を使い、隣の列の値を取得するパターンです。

A列に商品名、B列に価格が入っている表で、商品名から価格を取得します。

=OFFSET(A1, MATCH("りんご", A:A, 0)-1, 1)

MATCH関数が「りんご」の行番号を返し、OFFSET関数がA1からその行数分だけ下にずれた隣の列(B列)を参照します。

TIP

この用途ではINDEX関数とMATCH関数の組み合わせが一般的です。OFFSETを使うケースは、行と列の両方を動的に動かしたい場合に向いています。

名前定義と組み合わせた動的な入力規則

OFFSET関数を名前定義に使うと、ドロップダウンリストの選択肢を自動で増減できます。

  1. A列にリストの選択肢を入力(A1が見出し)
  2. 「数式」タブ →「名前の管理」→「新規作成」
  3. 名前を「商品リスト」、参照範囲に次の数式を入力
=OFFSET(Sheet1!$A$2, 0, 0, COUNTA(Sheet1!$A:$A)-1, 1)
  1. データの入力規則で「リスト」を選び、元の値に =商品リスト と入力

A列にデータを追加するだけで、ドロップダウンの選択肢が自動的に増えます。

よくあるエラーと対処法

エラー主な原因対処法
#REF!移動先がシートの範囲外になっている行数・列数の値を確認する。基準セルから上方向にシートの外まで移動していないかチェック
#VALUE!引数に数値以外(文字列など)が入っている行数・列数・高さ・幅にはすべて数値を指定する
#REF!高さまたは幅に0を指定した高さ・幅は1以上の正の数を指定する。省略するか基準と同じサイズにする
結果が0OFFSET単体の結果を確認しようとしているOFFSET関数は範囲を返すだけなので、SUM等と組み合わせるか、Ctrl+Shift+Enterで配列数式にする
ファイルが重いOFFSET関数を大量に使っているOFFSET関数は揮発性関数のため、不要なセルでは通常の参照やINDEX関数に置き換える

NOTE

OFFSET関数の結果を確認したいときは、数式バーで数式を選択して F9 キーを押すと、計算結果をプレビューできます。確認後は Esc キーでキャンセルしてください。

似た関数との違い・使い分け

OFFSET関数 と INDEX関数

比較項目OFFSET関数INDEX関数
参照方法基準セルからの相対移動範囲内の行番号・列番号で指定
範囲の返却高さ・幅を指定して範囲を返せる単一セルを返す(配列数式で範囲も可)
揮発性揮発性関数(再計算が多い)非揮発性(パフォーマンスに優しい)
使い分け動的範囲の生成(SUM+OFFSET等)固定範囲からの値取得(INDEX+MATCH等)

単一セルの値を取得するだけなら、INDEX関数が有利です。高さ・幅を動的に変えて範囲を生成する場面がOFFSETの出番です。

OFFSET関数 と INDIRECT関数

比較項目OFFSET関数INDIRECT関数
参照の指定方法基準セル+行数・列数の数値文字列で参照先を指定
範囲の返却高さ・幅で範囲サイズを指定文字列で”A1:A10″のように範囲を指定
揮発性揮発性揮発性
使い分け相対位置で動的範囲を作るシート名やセルアドレスを文字列で組み立てる

OFFSETは数値で位置を指定し、INDIRECTは文字列で参照先を組み立てます。別シートの参照ならINDIRECT関数が向いています。データ件数に応じた範囲変更ならOFFSET関数の出番です。

まとめ

OFFSET関数は、基準セルからの相対位置で参照先を動的に変えられる関数です。

  • 基本は =OFFSET(基準, 行数, 列数) の3引数
  • 第4・第5引数で高さ・幅を指定すると範囲を返せる
  • SUM関数+COUNTA関数と組み合わせると、データ追加に自動対応する集計式が作れる
  • 揮発性関数のため、大量使用は避けてINDEX関数やテーブル機能を検討する

「数式を直す手間」をなくせるのがOFFSET関数の強みです。まずはSUM+OFFSET+COUNTAの動的合計から試してみてください。

関連記事

タイトルとURLをコピーしました