Home > 即効テクニック > Excel VBA > セル操作関連のテクニック > セルに数式を入力/取得する(Formula/FormulaR1C1プロパティ)

即効テクニック

セル操作関連のテクニック

セルに数式を入力/取得する(Formula/FormulaR1C1プロパティ)

(Excel 2000)
セルに数式を入力したり、入力されている数式を取得するプロパティです。対象がセル範囲の時には取得される結果は2次元の配列になります。

 構文  Object.Formula       A1形式で数式の設定/取得
        Object.FormulaR1C1   R1C1形式で数式の設定/取得

 設定項目        内容
  Object          Rangeオブジェクト
●サンプル1●
Sub FormulaSamp1()

    '----(1)
    Range("C1").Formula = "=A1+B1"
    '----(2)
'   Range("C1").Formula = "=$A$1+$B$1"
    '----(3)
'   Range("C1").FormulaR1C1 = "=R1C1+R1C2"
    '----(4)
'   Range("C1").FormulaR1C1 = "=RC[-2]+RC[-1]"
    MsgBox "A1形式では:" & Range("C1").Formula & Chr(13) & _
           "R1C1形式では:" & Range("C1").FormulaR1C1

End Sub
(1)〜(4)はどれもセルC1にセルA1とB1を足す数式を入力します。(1)がA1形式で相対参照、(2)がA1形式で絶対参照、(3)がR1C1形式で相対参照、(4)がR1C1形式で絶対参照の数式を入力します。セルに入力された数式は、(1)と(3)、(2)と(4)で同じものになります。(5)のステートメントで入力された数式を両方の形式で取得しています。
サンプルの1ような数式では、可読性を考えるとFormulaR1C1プロパティを使用する意味はあまりありません。逆に数式中で参照するセル範囲が、プログラム中で行番号と列番号で特定できるような場合には、列番号に数値を使用できるFormulaR1C1プロパティを使用した方が便利です。
では、データの右端に左端までの値を合計する数式を入力するには、それぞれどのような記述になるでしょうか。なお、データ範囲は可変なものとします。
一例に過ぎませんが、Formuraプロパティを使用した場合はこうなります。
●サンプル2●
Sub FormulaSamp2()

    Dim myLastRow As Long
    Dim myLastCol As Integer
    Dim i As Long

    '----最終行
    myLastRow = Range("A1").End(xlDown).Row
    '----最終列
    myLastCol = Range("A1").End(xlToRight).Column
    For i = 1 To myLastRow
        '----(1)参照範囲の記述
        Cells(i, myLastCol + 1).Formula = "=SUM(A" & i & ":" & _
           Cells(i, myLastCol).Address(False, False) & ")"
    Next i

End Sub
せっかく取得した最終行と最終列が、(1)の参照範囲の記述時に生かせていません。では、FormulaR1C1プロパティを使用するとどうなるでしょうか。
●サンプル3●
Sub FormulaSamp3()

    Dim myLastRow As Long
    Dim myLastCol As Integer
    Dim i As Long

    '----最終行
    myLastRow = Range("A1").End(xlDown).Row
    '----最終列
    myLastCol = Range("A1").End(xlToRight).Column
    For i = 1 To myLastRow
        Cells(i, myLastCol + 1).FormulaR1C1 = _
           "=SUM(RC[" & -myLastCol & "]:RC[-1])"
    Next 

End Sub
サンプル2とサンプル3のどちらが理解しやすいコードか比較してみてください。

●注意●
セルに入力されているのが数式以外の場合には、Valueプロパティと同じ結果を返します。