「行番号と列番号からセル番地を作りたい」
「シート名を動的に切り替えて値を取得したい」
こんな場面で手が止まったことはありませんか?
手動でセル番地を書き換えていると、
シートが増えるたびに修正の手間が増えていきます。
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 |
| FALSE | R1C1形式 | 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ステップで進みます。
- ADDRESS関数がセル番地の文字列を生成する
- INDIRECT関数が文字列をセル参照に変換する
- セル参照を通じてセルの値を取得する
実際の数式
セル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))
処理の流れは次のとおりです。
MATCH(D1, A:A, 0)→ A列で「3月」の行番号を取得ADDRESS(..., 2)→ その行の2列目のセル番地を生成INDIRECT(...)→ セル番地から実際の値を取得
D1の値を「4月」「5月」と変えるだけで,
取得先が自動的に切り替わります。
ちょっと複雑に見えますが,
やっていることは
「探す→番地を作る→値を取る」の3ステップです。
ただし,同じシート内ならこの処理は
INDEX関数と
MATCH関数の組み合わせでも実現できます。
パフォーマンスを考えると,
同一シートではINDEX+MATCHがおすすめですよ。
ADDRESS関数で列番号をアルファベットに変換する方法
「列番号はわかるけどアルファベットで表示したい」
という場面ではSUBSTITUTE関数が活躍します。
=SUBSTITUTE(ADDRESS(1, 5, 4), "1", "")
この数式は E を返します。
仕組みはシンプルです。
ADDRESS(1, 5, 4)→E1(相対参照)を生成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との基本パターンを試してみてください。
動的なセル参照の仕組みがわかると,
月別集計やシート横断の処理がぐっと楽になりますよ。
