ExcelのADDRESS関数の使い方|INDIRECT連携で動的セル参照を実現

スポンサーリンク

「行番号と列番号からセル番地を作りたい」
「シート名を動的に切り替えて値を取得したい」
こんな場面で手が止まったことはありませんか?

手動でセル番地を書き換えていると、
シートが増えるたびに修正の手間が増えていきます。

ExcelのADDRESS関数を使えば,
行番号と列番号からセル番地を自動生成できます。
INDIRECT関数と組み合わせれば,
動的にセル参照を切り替える仕組みも作れますよ。

この記事では,ADDRESS関数の基本構文から
MATCH+ADDRESS+INDIRECTとの実務パターンまで,
具体例つきで解説していきます。

ADDRESS関数とは?

読み方・語源

読み方は「アドレス関数」です。
英語の「address(住所・番地)」が語源になっています。
セルの「住所」を文字列で返す関数ですよ。

ADDRESS関数でできること

ADDRESS関数はExcel 2003以降で使えます。
行番号と列番号を指定して,
セル番地を文字列として返す関数です。

たとえば =ADDRESS(3,4) と入力すると,
「$D$3」という文字列が返ります。
ここで大事なポイントがあります。
返るのはあくまで「文字列」です。
セル参照そのものではありません。

そのため,ADDRESS関数だけでは値を取得できません。
値を取り出すには
INDIRECT関数との
組み合わせが必要です。

「文字列しか返せない」という特徴を押さえておくと,
この後の応用パターンが理解しやすくなりますよ。

ADDRESS関数の基本構文と引数

基本構文

=ADDRESS(行番号, 列番号, [参照の種類], [参照形式], [シート名])

必ず指定するのは「行番号」と「列番号」の2つです。
残りの3つは省略できます。

引数の説明

引数必須/省略可説明
行番号必須セルの行番号(1以上の整数)
列番号必須セルの列番号(A列=1、B列=2…)
参照の種類省略可1〜4で参照形式を指定(後述)
参照形式省略可TRUE=A1形式、FALSE=R1C1形式
シート名省略可別シート参照時にシート名を文字列で指定

参照の種類(第3引数)

第3引数で絶対参照・相対参照を切り替えられます。

結果の例
1(既定)絶対絶対$D$3
2絶対相対D$3
3相対絶対$D3
4相対相対D3

省略すると「1」(完全な絶対参照)になります。

参照形式(第4引数)

TRUEまたは省略でA1形式になります。
FALSEを指定するとR1C1形式で返ります。

形式結果の例
TRUE(既定)A1形式$C$5
FALSER1C1形式R3C4

R1C1形式はVBAやマクロで使われる形式です。
通常のワークシートではA1形式を使うため,
この引数は省略するケースがほとんどですよ。

シート名(第5引数)

別シートのセル番地を作りたいときに指定します。

=ADDRESS(3, 4, 1, TRUE, "売上データ")

この数式は 売上データ!$D$3 を返します。
別ブックを参照する場合は
"[Book2.xlsx]Sheet1" のように指定してください。

ADDRESS関数の基本的な使い方

絶対参照でセル番地を取得する

もっとも基本的な使い方を見てみましょう。
3行目・4列目(D列)のセル番地を取得します。

=ADDRESS(3, 4)

結果は $D$3 です。
第3引数を省略すると絶対参照になりますよ。

相対参照・混合参照に切り替える

第3引数の値を変えるだけで切り替えられます。

=ADDRESS(3, 4, 4)

結果は D3(相対参照)です。
混合参照にしたい場合は2または3を指定します。
2なら行だけ絶対(D$3)、3なら列だけ絶対($D3)です。

別シートのセル番地を生成する

第5引数にシート名を指定すると,
シート名つきのセル番地が返ります。

=ADDRESS(1, 1, 1, TRUE, "1月")

結果は '1月'!$A$1 です。
月別シートへの参照を動的に作りたいときに便利ですよ。

ADDRESS関数をINDIRECT関数と組み合わせてセル参照に変換する

ADDRESS関数が返すのは「文字列」です。
セルの値を取得するには
INDIRECT関数
セル参照に変換する必要があります。

データフローのイメージ

処理は3ステップで進みます。

  1. ADDRESS関数がセル番地の文字列を生成する
  2. INDIRECT関数が文字列をセル参照に変換する
  3. セル参照を通じてセルの値を取得する

実際の数式

セルA1に行番号「5」、B1に列番号「3」が
入っているとしましょう。

=INDIRECT(ADDRESS(A1, B1))

この数式はC5セルの値を返します。
ADDRESS関数が $C$5 という文字列を作り,
INDIRECT関数がセル参照に変換しています。

A1やB1の値を変えるだけで,
参照先が自動的に切り替わりますよ。

別シートの値を動的に取得する

シート名をセルに入力しておけば,
参照先のシートも動的に切り替えられます。
セルC1にシート名「1月」が入っている場合です。

=INDIRECT(ADDRESS(A1, B1, 1, TRUE, C1))

この数式は「1月」シートのC5セルの値を返します。
C1を「2月」「3月」と変えるだけで,
取得先シートが自動で切り替わります。

シート名を動的に変更できる点が,
INDIRECT+ADDRESSの組み合わせの真の強みです。

NOTE

INDIRECT関数は揮発性関数です。
ブックを開くたびに再計算されるため,
大量に使うとパフォーマンスが低下します。
目安として,INDIRECT+ADDRESSの組み合わせは
INDEX関数の約5,000倍遅いというデータもあります。
数百セル程度なら問題ありませんが,
数千セル以上で使う場合は注意してください。

MATCH+ADDRESS+INDIRECTで行を動的に特定する

実務では「検索値から該当行を見つけて値を取得する」
というパターンがよく出てきますよね。
MATCH関数
加えた3関数の組み合わせで実現できます。

3関数の役割

関数役割
MATCH検索値が何行目にあるかを返す
ADDRESS行番号と列番号からセル番地を作る
INDIRECT文字列をセル参照に変換して値を取得する

月次集計表から当月データを抽出する例

A列に月名(1月〜12月)、B列に売上が
入った集計表があるとします。
セルD1に「3月」と入力して,
対応する売上を取得してみましょう。

=INDIRECT(ADDRESS(MATCH(D1, A:A, 0), 2))

処理の流れは次のとおりです。

  1. MATCH(D1, A:A, 0) → A列で「3月」の行番号を取得
  2. ADDRESS(..., 2) → その行の2列目のセル番地を生成
  3. INDIRECT(...) → セル番地から実際の値を取得

D1の値を「4月」「5月」と変えるだけで,
取得先が自動的に切り替わります。

ちょっと複雑に見えますが,
やっていることは
「探す→番地を作る→値を取る」の3ステップです。

ただし,同じシート内ならこの処理は
INDEX関数
MATCH関数の組み合わせでも実現できます。
パフォーマンスを考えると,
同一シートではINDEX+MATCHがおすすめですよ。

ADDRESS関数で列番号をアルファベットに変換する方法

「列番号はわかるけどアルファベットで表示したい」
という場面ではSUBSTITUTE関数が活躍します。

=SUBSTITUTE(ADDRESS(1, 5, 4), "1", "")

この数式は E を返します。
仕組みはシンプルです。

  1. ADDRESS(1, 5, 4)E1(相対参照)を生成
  2. SUBSTITUTE(..., "1", "") → 「1」を除去して列名だけ残す

第1引数を「1」に固定しているのがポイントです。
行番号「1」のセル番地を作ることで,
SUBSTITUTEで数字部分を確実に除去できます。

2桁以上の列でも対応できます。
たとえば列番号28なら AB が返りますよ。

=SUBSTITUTE(ADDRESS(1, 28, 4), "1", "")

現在のセルの列名を知りたい場合は,
COLUMN関数
組み合わせてみてください。

=SUBSTITUTE(ADDRESS(1, COLUMN(), 4), "1", "")

列番号のアルファベット変換については
列番号をアルファベットに変換する方法
さらに詳しく解説しています。

ADDRESS関数とINDEX関数の使い分け

「行番号と列番号から値を取得する」という目的なら,
INDEX関数でも
実現できます。
では,どちらを使うべきでしょうか?

判断基準

観点INDEX関数INDIRECT+ADDRESS
処理速度高速(約0.001秒)低速(約5.2秒)
別シート動的参照不可可能
数式の読みやすさシンプルやや複雑
推奨場面同一シート内のデータ取得シート名を動的に切り替えたい場合

処理速度には約5,000倍の差があります。
同じシート内で値を取得するだけなら,
INDEX関数を使うのが正解です。

一方,シート名をセルの値で切り替えたい場合は
INDEX関数では対応できません。
この場面がINDIRECT+ADDRESSの出番です。

迷ったときの判断はシンプルですよ。
「シート名を動的に変えたいか?」がYesなら
INDIRECT+ADDRESS、NoならINDEXを選んでください。

ADDRESS関数のよくあるエラーと対処法

#VALUE!エラー

行番号または列番号に問題がある場合に発生します。

原因対処法
行番号・列番号が0以下1以上の整数を指定する
行番号・列番号が数値でない文字列が混入していないか確認する
参照の種類が1〜4以外1〜4の整数を指定する
=ADDRESS(0, 3)

この数式は #VALUE! エラーになります。
行番号は1以上の整数を指定してくださいね。

INDIRECT連携時の#REF!エラー

ADDRESS関数自体は正しくても,
INDIRECT関数と組み合わせたときに
#REF!エラーが出ることがあります。

主な原因は次の2つです。

  • 存在しないシート名を指定している

シート名のスペルミスや,
削除済みシートの参照が原因です。
シート名を正確に確認してください。

  • シート名に特殊文字が含まれている

スペースや記号を含むシート名は,
シングルクォーテーションで囲む必要があります。
ADDRESS関数の第5引数で指定すれば自動で付きます。
ただし手動で文字列結合している場合は
自分で付ける必要があるので注意してくださいね。

まとめ

ADDRESS関数は,行番号と列番号から
セル番地の文字列を生成するExcel関数です。

この記事のポイントをおさらいしましょう。

  • ADDRESS関数が返すのは「文字列」であり,セル参照ではない
  • 値を取得するにはINDIRECT関数との組み合わせが必須
  • MATCH+ADDRESS+INDIRECTで検索値から動的にデータを取得できる
  • 列番号→アルファベット変換にも使える
  • 同一シート内のデータ取得にはINDEX関数のほうが高速
  • INDIRECT+ADDRESSの出番はシート名を動的に切り替えたい場面

ADDRESS関数は単体で使うことはあまりありません。
INDIRECT関数
MATCH関数
組み合わせることで真価を発揮します。

まずはINDIRECTとの基本パターンを試してみてください。
動的なセル参照の仕組みがわかると,
月別集計やシート横断の処理がぐっと楽になりますよ。

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