VBAでセルの数式を取得・設定

中級VBA

数式を扱うFormula・FormulaR1C1プロパティ

 RangeやCellsなどは、プロパティを指定しないで扱うと、Valueを指定したのと同じことになり、値として扱われます。
 もし、セルの数式を取得・設定したい場合は、Formula、または FormulaR1C1プロパティを指定します。

 Formulaプロパティでは、”A1” などと A1形式で指定し、
 FormulaR1C1プロパティでは、”R1C1” などと R1C1形式で指定します。

 FormulaR1C1プロパティは、数値で絶対的、相対的な位置関係を指定できるので、プログラミングの繰り返し処理で使う時に便利です。
 Rは行、Cは列を示しています。

Formulaプロパティ

 Formulaプロパティでは、セルに入力された数式がそのまま返されます。

 青文字がセル内の数式になります。

Sub testFormula()
    Debug.Print Range("A1").Formula     '=B3
    Debug.Print Range("A2").Formula     '=$B$3
    Debug.Print Range("A3").Formula     '=$B2
    Debug.Print Range("A4").Formula     '=B$3
    Debug.Print Range("A5").Formula     '(数式が無い場合は値が返される)
End Sub

 セルに数式ではなく、値が入っている場合はエラーとはならず値が返されるようです。
 ただ、この特性を利用してしまうのは得策とは言えないでしょう。

 セルに数式が入っているかを判断するには、HasFormulaプロパティを使って調べます。

Sub testHasFormula()
    If Range("A5").HasFormula Then
        Debug.Print Range("A5").Formula
    Else
        Debug.Print "A5には数式が入っていません。"
    End If
End Sub

入力する際にはエスケープシーケンスに注意

 プログラムコード中に文字列として数式を指定する際、(ダブルクォーテーション)を使うケースではエスケープシーケンスに注意しましょう。( “” とする。)

Sub testFormula2()
    Debug.Print Range("D1").Formula             '=IF(B3="基準","○","×")
    
    '直接代入する時は大丈夫だが、
    Range("D2").Formula = Range("D1").Formula
    
    '文字列を入力する時はエスケープシーケンスに注意
    Range("D3").Formula = "=IF(B3=""基準"",""○"",""×"")"
    
End Sub

FormulaR1C1プロパティ

 FormulaR1C1プロパティは、絶対的、相対的な位置関係を数値指定できるので、繰り返し処理などプログラミングで使う時に便利です。使い方の基本は、以下の通りです。

 ・ [ ] を付けると相対位置
 ・ 数値をそのまま書くと絶対位置
 ・ 数値を書かない場合は基準セルと同じ位置

 基準セルが B3 の場合、RC1 なら A3。 RC[1] なら C3。となります。
 尚、絶対位置をしてした場合は、$ が付きます。
 以下の例を参考にしてください。

’B3で色々なセルを参照するコード
Sub test()
    Range("B3").FormulaR1C1 = "=R[-2]C[-1]"     '=A1
    Range("B3").FormulaR1C1 = "=R2C1"           '=$A$2
    Range("B3").FormulaR1C1 = "=RC1"            '=$A3
    Range("B3").FormulaR1C1 = "=R[1]C1"         '=$A4
    
    Range("B3").FormulaR1C1 = "=R1C"        '=B$1
    Range("B3").FormulaR1C1 = "=R[-1]C"     '=B2
    ’基準セル
    Range("B3").FormulaR1C1 = "=R[1]C2"     '=$B4
    
    Range("B3").FormulaR1C1 = "=R1C[1]"     '=C$1
    Range("B3").FormulaR1C1 = "=R[-1]C[1]"  '=C2
    Range("B3").FormulaR1C1 = "=RC[1]"      '=C3
    Range("B3").FormulaR1C1 = "=R[1]C3"     '=$C4
End Sub

 R1C1形式で値を受け取ることもできます。

Sub test2()
    Debug.Print Range("A1").FormulaR1C1     '=B3   →     =R[2]C[1]
    Debug.Print Range("A2").FormulaR1C1     '=$B$3 →     =R3C2
    Debug.Print Range("A3").FormulaR1C1     '=$B2  →     =RC2
    Debug.Print Range("A4").FormulaR1C1     '=B$3  →     =R3C[1]
    Debug.Print Range("A5").FormulaR1C1     '(数式が無い場合は値が返される)
End Sub

 数式が入っていない場合は、Formulaプロパティの時と同じように値が返されるようです。
 必要に応じて、HasFormulaプロパティを使って調べるようにします。

繰返し処理を使ったプログラミング例

 FormulaR1C1を使ったプログラミング例を示します。
 B列に日付、C列に値、D列は前月末の値との差E列は前日との差を計算するように数式を入れていくプログラムです。
 C3に計算の基準となる月末の値が入っています。

Sub sampleFormulaR1C1()
    Dim i As Long
    For i = 4 To 34
        Cells(i, "D").FormulaR1C1 = "=RC3-R3C3"
        Cells(i, "E").FormulaR1C1 = "=RC3-R[-1]C3"
    Next i
End Sub

 特に難しくないと思いますが一応解説します。
 RC3 は同じ行の3列目という意味になります。C3は絶対位置ですので $ が付きます。
 R3C3 は、C3(月末の値)を絶対位置で指定しています。行列ともに $ が付きます。
 R[-1]C3 は、行が相対指定で一つ前の行。列はC列指定で絶対指定です。。

タイトルとURLをコピーしました