ADVERTISEMENT

【Googleスプレッドシート】セル範囲を式の中で動的に生成!ADDRESS関数の活用

【Googleスプレッドシート】セル範囲を式の中で動的に生成!ADDRESS関数の活用
🛡️ 超解決

Googleスプレッドシートでセル参照を動的に扱いたいと思ったことはありませんか。たとえば行番号や列番号を変数として指定し、その位置のセルを参照したい場面です。そのようなときに役立つのがADDRESS関数です。この関数を使えば、数式の中でセル番地を文字列として生成できます。本記事ではADDRESS関数の基本から、INDIRECT関数と組み合わせた実践的な活用方法までを詳しく解説します。

【要点】ADDRESS関数をマスターして柔軟なセル参照を実現します

  • =ADDRESS(行番号, 列番号, 参照タイプ, A1形式, シート名): 指定した行と列のセル番地を文字列として返します。参照タイプで絶対参照や相対参照を切り替えられます。
  • INDIRECT関数との組み合わせ: ADDRESSで生成した文字列をINDIRECTで実際のセル参照に変換します。これにより、可変のセル範囲を数式内で動的に指定できます。
  • ROW関数・COLUMN関数との組み合わせ: 数式が配置されているセルの位置を基準に、相対的なセル参照を生成できます。複数のセルに同じ数式をコピーする際に便利です。

ADVERTISEMENT

ADDRESS関数とは?基本構文と動作

ADDRESS関数は、指定した行番号と列番号からセル番地の文字列を生成する関数です。たとえば =ADDRESS(3, 2) と入力すると、3行目・2列目のセル、つまり「B3」という文字列が返ります。この戻り値はあくまで文字列であり、直接セル参照として使えるわけではありません。そのため、実際にセルの値を取得するには、INDIRECT関数で文字列を参照に変換する必要があります。

ADDRESS関数の構文は次のとおりです。
=ADDRESS(行番号, 列番号, [参照タイプ], [A1形式], [シート名])

  • 行番号: セルの行番号を数値で指定します。1から始まります。
  • 列番号: セルの列番号を数値で指定します。1がA列、2がB列、26がZ列、27がAA列となります。
  • 参照タイプ: 省略可能です。1(デフォルト)は絶対参照($A$1)、2は行のみ絶対(A$1)、3は列のみ絶対($A1)、4は相対参照(A1)となります。
  • A1形式: 省略可能です。TRUE(デフォルト)はA1形式、FALSEはR1C1形式となります。
  • シート名: 省略可能です。文字列でシート名を指定すると、そのシートのセル番地を返します。

たとえば =ADDRESS(5, 1, 4) は「A5」を返します。=ADDRESS(5, 1, 1) は「$A$5」、=ADDRESS(5, 1, 4, TRUE, “Sheet2”) は「Sheet2!A5」を返します。

この関数の最大の特徴は、行番号や列番号を別の数式で指定できることです。たとえばROW関数やCOLUMN関数、MATCH関数などと組み合わせれば、動的に変化するセル参照を生成できます。

ADDRESS関数を活用する具体的な手順

INDIRECT関数と組み合わせて参照先を動的に変更する

ADDRESS関数の真価は、INDIRECT関数と組み合わせたときに発揮されます。INDIRECT関数は、文字列で指定されたセル参照を実際の参照に変換します。これにより、数式の中でセル番地を動的に生成できるようになります。

  1. 基本的な組み合わせ方を理解する
    たとえば =INDIRECT(ADDRESS(3, 2)) と入力します。この数式は、3行目2列目(B3)の値を取得します。ADDRESSが文字列「B3」を返し、INDIRECTがそれを参照に変換する仕組みです。
  2. 行番号や列番号に変数を使う
    セルA1に行番号、セルB1に列番号を入力したとします。その場合、=INDIRECT(ADDRESS(A1, B1)) と書けば、A1とB1の値を変更するだけで参照先を自由に変えられます。これが動的参照の基本です。
  3. 複数のセル範囲をまとめて参照する
    ADDRESSとINDIRECTを組み合わせれば、範囲の開始セルと終了セルを動的に指定できます。たとえば、=SUM(INDIRECT(ADDRESS(2,1)&”:”&ADDRESS(10,1))) は、A2からA10までの合計を計算します。各ADDRESSで文字列を生成し、&で連結して範囲文字列を作っています。

ROW関数・COLUMN関数と組み合わせて相対参照を実現する

ROW関数は数式が入力されている行番号を、COLUMN関数は列番号を返します。これらをADDRESS関数と組み合わせると、数式の位置を基準とした相対的なセル参照を作れます。

  1. 同じ列の1つ上のセルを参照する
    =INDIRECT(ADDRESS(ROW()-1, COLUMN())) と入力します。この数式は、自分より1行上の同じ列のセルの値を返します。行番号を動的に計算しているため、どこにコピーしても正しく動作します。
  2. 別のシートの同じ行を参照する
    シート名を指定して、=INDIRECT(ADDRESS(ROW(), COLUMN(), 4, TRUE, “Sheet2”)) と書けば、Sheet2の同じセルを参照できます。ROWとCOLUMNによって現在位置を取得しているので、複数のセルに数式をコピーしても相対的な参照が維持されます。
  3. 行と列のオフセットを自由に指定する
    =INDIRECT(ADDRESS(ROW()+5, COLUMN()-2)) のように、ROWやCOLUMNに数値を加減することで、任意の相対位置を指定できます。たとえば5行下、2列左のセルを参照するといった動作です。

ADDRESS関数を使う際の注意点と制限

文字列として返されるため直接セル参照には使えない

先述のとおり、ADDRESS関数が返すのは文字列です。そのまま数式の中で =ADDRESS(3,2)+5 のようにしても、文字列と数値の加算となりエラーになります。必ずINDIRECT関数で参照に変換するか、文字列操作関数と組み合わせて使用する必要があります。この仕組みを理解せずに使うと、意図しない結果になりがちです。

シート名にスペースが含まれる場合の引用符処理

シート名にスペースや特殊文字が含まれている場合、ADDRESS関数は自動的にそのシート名を一重引用符で囲んで返します。たとえばシート名が「Sales Data」の場合、=ADDRESS(1,1,4,TRUE,”Sales Data”) は「’Sales Data’!A1」という文字列を返します。この引用符があることで、INDIRECT関数は正しく参照を解釈します。ただし、手動でシート名を生成する際には、引用符の有無に注意してください。

大量のセルでINDIRECTと組み合わせるとパフォーマンスが低下する

INDIRECT関数は揮発性関数であり、ワークシートが再計算されるたびに評価されます。ADDRESSとINDIRECTを組み合わせた数式を大量のセルで使うと、再計算に時間がかかり、スプレッドシートの動作が遅くなる可能性があります。どうしても必要な場合を除き、代替案としてINDEX関数やOFFSET関数の使用を検討することをおすすめします。

ADVERTISEMENT

ADDRESS関数と他のセル参照関数の比較

関数 返す値 動的生成の可否 揮発性
ADDRESS セル番地の文字列 行・列を数式で指定可能 揮発性(引数に変数を使うと再計算時に更新)
INDIRECT 文字列参照の実際の値 可(引数に文字列を指定) 揮発性
INDEX 範囲内の指定位置の値 可(行・列を数式で指定) 非揮発性(引数によっては揮発性になることも)
OFFSET 基準セルからの相対位置の値 可(オフセットを数式で指定) 揮発性

ADDRESS関数は、他の関数では得られない「セル番地の文字列」を生成できる点で独自の役割を持ちます。一方、INDIRECT関数と組み合わせると揮発性が高まるため、大規模なシートではINDEX関数の方がパフォーマンス面で優れることがあります。用途に応じて最適な関数を選びましょう。

まとめ

ADDRESS関数とINDIRECT関数の組み合わせにより、スプレッドシート上で動的なセル参照を実現できます。このテクニックを使えば、行番号や列番号を変数化して、数式を柔軟に設計できます。また、ROW関数やCOLUMN関数と併用すれば、相対参照の自動調整も可能です。ただし、揮発性によるパフォーマンス低下には注意が必要です。大量のデータを扱う場合は、INDEX関数やQUERY関数など他の方法も検討してみてください。ぜひADDRESS関数を活用して、より効率的なスプレッドシート操作を目指しましょう。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。