スプレッドシートのADDRESS関数とは?
「行番号と列番号はわかるけど、セル番地の文字列が欲しい」――そんな場面はありませんか?
たとえばVLOOKUPやINDEX関数の結果をもとに、「どのセルを見ているか」を表示したい。でもセル番地を手入力で管理するのは面倒ですよね。
スプレッドシートのADDRESS関数を使えば、行番号と列番号を指定するだけでセル番地の文字列を自動生成できます。INDIRECT関数(文字列をセル参照に変換する関数)と組み合わせれば、動的なセル参照の仕組みも作れますよ。
読み方・語源
ADDRESS関数は「アドレス関数」と読みます。英語の「address」は「住所・番地」という意味です。
セルの「住所」にあたる番地文字列を返す関数、と覚えるとわかりやすいですね。
ADDRESS関数でできること
ADDRESS関数を使うと、次のようなことができます。
- 行番号と列番号からセル番地の文字列(例:
$A$1)を生成する - 絶対参照・相対参照・複合参照を切り替えて出力する
- A1形式とR1C1形式を選んで出力する
- 別シートのセル番地(例:
Sheet2!$A$1)を生成する - INDIRECT関数と組み合わせて、番地から実際の値を取得する
ポイントは「文字列を返す」ことです。ADDRESS関数だけではセルの値は取得できません。値が欲しいときはINDIRECT関数と組み合わせます。
スプレッドシートのADDRESS関数の書き方(構文・引数)
基本構文
=ADDRESS(行, 列, [参照の型], [A1形式], [シート名])
引数の説明
| 引数 | 必須/省略可 | 説明 |
|---|---|---|
| 行 | 必須 | セルの行番号(1以上の整数) |
| 列 | 必須 | セルの列番号(1以上の整数。A列=1、B列=2…) |
| 参照の型 | 省略可 | 参照形式の種類(下表参照)。省略時は1(絶対参照) |
| A1形式 | 省略可 | TRUE=A1形式(デフォルト)、FALSE=R1C1形式 |
| シート名 | 省略可 | シート名を文字列で指定。出力にシート名が付く |
参照の型(第3引数)の一覧
| 値 | 参照形式 | 出力例 |
|---|---|---|
| 1 | 絶対参照(行・列とも固定) | $A$1 |
| 2 | 行だけ絶対参照 | A$1 |
| 3 | 列だけ絶対参照 | $A1 |
| 4 | 相対参照(固定なし) | A1 |
実務では「1(絶対参照)」か「4(相対参照)」を使うことがほとんどです。迷ったら省略して絶対参照にしておけばOKです。
ADDRESS関数の基本的な使い方
もっともシンプルな使い方は、行番号と列番号を直接指定するパターンです。
=ADDRESS(3, 2)
結果は $B$3 です。3行目・2列目(B列)のセル番地が、絶対参照の文字列として返されます。
相対参照で取得したい場合は、第3引数に4を指定します。
=ADDRESS(3, 2, 4)
結果は B3 です。$ 記号のない相対参照になります。
R1C1形式で出力したいときは、第4引数をFALSEにします。
=ADDRESS(3, 2, 1, FALSE)
結果は R3C2 です。「R=Row(行)3、C=Column(列)2」という意味で、A1形式とは異なる表記になります。
NOTE
R1C1形式はGoogleスプレッドシートの標準設定ではありません。通常はA1形式(デフォルト)のまま使えば問題ありません。
別シートのセル番地を取得するには、第5引数にシート名を指定します。
=ADDRESS(1, 1, 1, TRUE, "売上データ")
結果は '売上データ'!$A$1 です。シート名がシングルクォーテーションで囲まれた形式になります。
ADDRESS関数の実践的な使い方・応用例
ADDRESS+INDIRECTで動的セル参照を作る
ADDRESS関数は「文字列」を返すだけなので、そのままでは値を取得できません。INDIRECT関数と組み合わせると、セルの値を取り出せます。
たとえばA1セルに行番号「5」、B1セルに列番号「3」が入っているとします。
=INDIRECT(ADDRESS(A1, B1))
ADDRESS(A1, B1)が $C$5 を返します。INDIRECT関数がこれをセル参照に変換して、C5セルの値を取得します。
行番号や列番号をセルで管理すれば、参照先を自由に切り替えられます。プルダウンや入力欄と連動させると、見たいデータをすばやく表示できますよ。
ROW・COLUMNと組み合わせて位置を動的に取得する
ROW関数(セルの行番号を返す関数)やCOLUMN関数(セルの列番号を返す関数)との組み合わせも便利です。現在位置を基準にしたセル番地を生成できます。
たとえば「2行上のセル番地」を取得するには、次のように書きます。
=ADDRESS(ROW()-2, COLUMN())
ROW()が現在の行番号を返し、そこから2を引いた行と同じ列のセル番地が生成されます。
このパターンは数式の動作確認やデバッグに便利です。「この数式はどのセルを見ているのか」を隣のセルに表示して確認できます。
別シートから動的にデータを取得する
ADDRESS関数のシート名引数を活用して、別シートのデータを動的に取得するパターンです。
A1セルに「1月」というシート名が入っているとします。
=INDIRECT(ADDRESS(2, 3, 1, TRUE, A1))
ADDRESS関数が '1月'!$C$2 を返します。INDIRECT関数がこの文字列をセル参照に変換し、「1月」シートのC2セルの値を取得します。
A1セルを「2月」に変えれば、参照先は自動的に「2月」シートに切り替わります。
月次レポートの集計や、部署別シートの切り替えなど、同じ構成のシートを横断するときに重宝します。
MATCH関数と組み合わせて検索結果の位置を表示する
MATCH関数(検索値の位置を返す関数)の結果をADDRESS関数に渡すと、検索結果がどのセルにあるかを番地で表示できます。
A列に商品名が入っているとします。
=ADDRESS(MATCH("りんご", A:A, 0), 1)
MATCH関数が「りんご」の行番号を返します。ADDRESS関数がその行のA列のセル番地を生成します。結果は $A$5 のような文字列です。
「検索した値がどこにあるか」を別セルに表示したいとき、このパターンが使えます。
よくあるエラーと対処法
ADDRESS関数で発生するエラーとその対処法をまとめます。
| エラー | 主な原因 | 対処法 |
|---|---|---|
#VALUE! | 行番号に0以下の値を指定した | 行番号が1以上の整数になっているか確認する |
#VALUE! | 列番号に0以下の値を指定した | 列番号が1以上の整数になっているか確認する |
#VALUE! | 引数に文字列を指定した | 行・列番号が数値であることを確認する |
#REF! | INDIRECTと組み合わせたとき、存在しないシート名を指定した | シート名のスペルを確認する |
ADDRESS関数自体はエラーが起きにくい関数です。行番号と列番号に正の整数を渡せば、ほぼ確実に動作します。
エラーが出るのは多くの場合、INDIRECT関数と組み合わせたときです。ADDRESS関数が生成した文字列をINDIRECT関数に渡す場面で、参照先が存在しないと#REF!になります。
デバッグするときは、まずADDRESS関数だけの結果を確認してみてください。出力された文字列が正しいセル番地になっているかを目視で確認するのが早いです。
似た関数との違い・使い分け
| 関数 | 特徴 | 使いどころ |
|---|---|---|
| ADDRESS | 行番号・列番号からセル番地の文字列を返す | セル番地の文字列を生成したいとき |
| INDIRECT | 文字列をセル参照に変換して値を取得する | ADDRESS等で作った番地文字列から値を取り出すとき |
| INDEX | 範囲から行番号・列番号で直接値を取得する | 「セル番地の文字列」が不要で値だけ欲しいとき |
| ROW / COLUMN | セルの行番号・列番号を数値で返す | ADDRESS関数に渡す行・列番号を取得するとき |
ADDRESS関数とINDEX関数の使い分けがポイントです。
INDEX関数は、行番号と列番号から直接値を取得します。「値だけ欲しい」なら、ADDRESS+INDIRECTの2段階を踏むよりINDEX関数のほうがシンプルです。
ADDRESS関数が活きるのは「セル番地そのもの」が必要な場面です。参照先の番地を表示したいとき、文字列操作でセル番地を組み立てたいとき、シート名付きの参照文字列を作りたいとき。こうした場面ではADDRESS関数が適しています。
まとめ
スプレッドシートのADDRESS関数は、行番号と列番号からセル番地の文字列を生成する関数です。
この記事のポイントをおさらいします。
- 構文は
=ADDRESS(行, 列, [参照の型], [A1形式], [シート名]) - 行番号と列番号を指定するだけでセル番地の文字列を返す
- 第3引数で絶対参照・相対参照・複合参照を切り替えられる
- INDIRECT関数と組み合わせることで、動的なセル参照が実現できる
- INDEX関数で値だけ取得できる場面では、ADDRESS+INDIRECTは不要
- エラーは少ないが、行・列番号には1以上の整数を指定すること
「セル番地を数式で自動生成したい」「参照先を動的に切り替えたい」――そんなときはADDRESS関数を活用してみてください。
