先日、別の人が作ったマクロの調整依頼を受けてコードを眺めていたときに見慣れないコードがあって、どゆこと?と思ったら実は目から鱗だったお話。
R1C1形式
R1C1形式はRに行方向、Cに列方向の位置を指定してセルを指定する方法です。
例えばこのような表の下に合計を求める数式を設定したい。
そのような時にR1C1形式を使用する場合はこのように指定していました。
Range("A4").FormulaR1C1 = "=sum(R[-3]C:R[-1]C)"
R[-3]C。これはA4セルから上に3つ(横に0)に移動したセル、つまりA1。
R[-1]C。これはA4セルから上に1つ(横に0)移動したセル、つまりA3セル。
2つ併せて「A1:A3」というセル範囲を指定しています。
指定したセル(今回はA4セル)からの相対的な位置を指示してセルを指定しています。
上記のコードを実行すると下記のようになります。
私はR1C1形式はこのような基準となるセルからの相対的な位置指定しか出来ないものと思い込んでいました。
R1C1形式の絶対参照
ところがR1C1形式でも絶対参照で位置を指定することが出来るのです。
それがこちら。
Range("A4").FormulaR1C1 = "=sum(R1C:R3C)"
なんだか最初に紹介した式とSUM関数の引数の範囲指定が左右入れ替わっているだけに見えるかもしれません。
これが今回遭遇した見慣れないコードです。
よく見ると、最初に紹介した相対参照の式は数値を[ ]で括っています。
ところが後で紹介した絶対参照の式は[ ]で括っていません。
実はこうすることでR1C1形式で絶対参照で指定することが出来ます。
「R1C」のR1は1行目。
Cは1列目。
RやCのあとに数字がない場合は数式が入力されるセルと同じ位置になります。
A4セルに数式を設定しているので「C」はA列を表します。
R1の1行目とCのA列。
2つを併せてA4セルに対してのR1CはA1列を表します。
このコードを実行すると下記のようになります。
相対参照で指定したときと同じセル範囲が指定されています。
数式で位置を指定した行方向は参照位置を固定する $ が付いていますね。
絶対参照で指定が出来ることで、例えば数式の参照の始まりの位置が決まっている時は、絶対参照で決め打ちすることが出来ます。
これで数式の指定がより柔軟に行えるようになる気がします。