見積書などを作っているとよく各項目の末尾に今までの合計を計算したセルを作ります。
こういった時、大体は =SUM(A2:A83) の様なセル範囲を指定をした合計関数を用います。丁寧にExcelを操作するならばこれで十分なのですが、時折指定範囲が漏れていたり徐に範囲が壊れる操作を行ってしまう時があります。その様な場合、合計を表現するセルの値 = あるセルから合計を表現するセルの一つ上までの合計、の様に相対位置で参照を指定できると便利です。
相対位置の参照は次のイディオムでできます。
=INDIRECT(ADDRESS(ROW()-{上方向のセル数},COLUMN()-{左方向のセル数}))
用いた関数はROW, COLUMN, ADDRESS, INDIRECTです。
ROW, COLUMNはそれぞれ現在地の行、列を数値で返す関数です。例えば、A4で=ROW()とすれば 4 が返り、B3で=COLUMN()とすれば 2 が返ってきます。
ADDRESSは行、列の値からセル参照を文字列で返す関数です。例えば、=ADDRESS(4, 2)とすれば $B$4 が返ってきます。例では行、列の値のみで呼び出しましたが第3引数以降で更に細かい制御ができます。
ROW, COLUMN, ADDRESS, を組み合わせることによって次の様に現在のセルから相対位置のセル参照文字列を得ることができます。
=ADDRESS(ROW(), COLUMN()) // この式のあるセルの文字列表記 =ADDRESS(ROW() - 1, COLUMN()) // この式のあるセルの一つ上のセルの文字列表記
INDIRECTは引数の文字列に合わせた参照を返す関数です。上記の方法で得たセル参照文字列をINDIRECT関数に通すことで次の様に他の関数で参照として扱えるようになります。
=SUM(A1:ADDRESS(ROW(), COLUMN())) // エラー =SUM(A1:INDIRECT(ADDRESS(ROW()-1, COLUMN()))) // A1からこの式のあるセルの上のセルまでの値の合計 =SUM(INDIRECT(ADDRESS(1, COLUMN())):INDIRECT(ADDRESS(ROW()-1, COLUMN()))) // この式のあるセルの列の1行目から一つ上の行までの値の合計
こんな感じでシートの状態に関わらず使用可能な処理を作るとExcelファイルを作るたびに繰り返さなくてもよいことが増えていきます。