OFFSET関数の使い方|基準セルからずらして範囲を取り出す

執筆者:

カテゴリ:

OFFSETは、基準セルから指定した行数・列数だけずらした場所を参照する関数です。

さらに「高さ」と「幅」を指定すると、1セルではなく範囲を返せます。この性質を使うと、行数が増減する表の集計範囲を自動で追従させられます。

書式

=OFFSET(基準, 行数, 列数, [高さ], [幅])
引数 内容
基準 起点となるセル
行数 下方向にずらす数。マイナスで上方向
列数 右方向にずらす数。マイナスで左方向
高さ 返す範囲の行数。省略時は1
返す範囲の列数。省略時は1

基本の動き

=OFFSET(A1, 2, 1)

A1から下に2・右に1ずらした B3セル を参照します。

ずらす数が 0 なら、そのセル自身です。

=OFFSET(A1, 0, 0)   → A1と同じ

範囲として返す

高さと幅を指定すると、単一セルではなく範囲になります。

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

A1の1つ下(A2)から5行×1列 = A2:A6 の合計です。

範囲を返す関数なので、OFFSET単体をセルに入れても意味のある表示にはなりません。SUMAVERAGE など、範囲を受け取る関数の中で使うのが基本です。

実用例1:データが増えても自動で追従する集計

行数が変わる表の合計を、範囲を書き換えずに出したい場合。

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

COUNTA で入力済みの行数を数え、その行数ぶんの範囲を作っています。データを追記すれば範囲が自動で伸びます。

ただし、単に合計するだけなら =SUM(A2:A1000)=SUM(A:A) で十分です。空白セルは無視されるためです。OFFSETが要るのは、グラフの参照範囲など「範囲そのものを正確に渡す必要がある」場面に限られます。

実用例2:最新N件を取り出す

追記型の表から、下から5件を取り出す例です。

=AVERAGE(OFFSET(A1, COUNTA(A:A)-5, 0, 5, 1))

COUNTA(A:A) で最終行を求め、そこから5行戻った位置を起点にしています。直近の推移だけを見たいダッシュボードでよく使う形です。

見出し行の有無で1行ずれるので、実際に作るときは結果を目で確かめてください。

実用例3:横方向にずらしてコピーする

数式を下方向にコピーしながら、参照は右方向に進めたい、という場面。

=OFFSET($B$1, 0, ROW()-1)

ROW() は自分の行番号を返すので、下にコピーするたびに列が1つずつ右に進みます。行と列を入れ替えて取り出す用途です。

なお、単純な行列入れ替えなら TRANSPOSE のほうが簡単です。

注意点:揮発性関数である

OFFSETは INDIRECT と同じく揮発性関数です。シートのどこかが変更されるたびに再計算が走ります。

  • – 数十個なら問題になりません
  • – 数百個を超えると、ファイル全体が目に見えて重くなります

重いと感じたら、まずOFFSETとINDIRECTの数を疑ってください。

多くの場合、INDEX で置き換えられます。INDEXは揮発性ではありません。

=SUM(INDEX(A:A, 2) : INDEX(A:A, 6))

INDEXは範囲の一部として : で連結でき、この書き方なら可変範囲を揮発性なしで作れます。

エラーの対処

#REF! が出る

ずらした先がシートの外に出ています。A1から上にずらす、A列から左にずらす、といった指定です。COUNTA の結果が想定より小さく、マイナス方向に行き過ぎているケースが多いです。

#VALUE! が出る

高さや幅に 0 以下を指定しています。高さ・幅は1以上でなければなりません。

結果が1つずれる

基準セルを含むかどうかの数え間違いです。OFFSET(A1, 0, 0, 5, 1) は A1:A5(A1を含む)、OFFSET(A1, 1, 0, 5, 1) は A2:A6(A1を含まない)です。見出し行を含めるかで結果が変わります。

まとめ

  • – 書式は =OFFSET(基準, 行数, 列数, 高さ, 幅)
  • – 高さ・幅を指定すると範囲を返せる
  • COUNTA と組み合わせると可変範囲が作れる
  • 揮発性関数なので多用すると重い
  • – 置き換えられるなら INDEX を使う

関連する関数

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です