記録されたVBAマクロでは、それらの式はを使用しているようですR1C1 reference style
。たとえば、次のように入力B4
しB2+1
ます。
Range("B4").Select
ActiveCell.FormulaR1C1 = "=R[-2]C+1"
このモードをオフに切り替えることが可能かどうか誰かが知っていますか?たとえば、記録されたマクロを次のようにします。
Range("B4").Select
ActiveCell.Formula = "=B2+1"
あなたにはそれができないと思います。マクロは常に R1C1 スタイルで記録されます。
スタイルはいつでも切り替えることができますが、ワークシートにのみ適用され、マクロを記録した場合でも R1C1 参照スタイルが表示されます。
R1C1スタイルがとてもわかりやすい
R1C1 参照スタイルでは、呼び出しているセルからセルがどれだけ離れているかによって範囲が参照されます。たとえば、R1C1 から R5C1 までの 5 つの値があり、範囲が R7C2 から呼び出される場合、範囲は R[-6]C[-1]:R[-2]C[-1] になります。ここで、範囲の最初のセルはセル R7C2 の 6 行前、セル R7C2 の 1 列前であり、範囲の最後のセルも同様です。
私があなたの例を取る"=R[-2]C+1"
と、式は2行上(-2)で同じ列(0)にある行を参照していることを意味します。あなたの式はと同じです"=R[-2]C[0]+1"
編集
これは、R1C1をA1文字列に変換するのに役立つ、私が書いた小さな関数です
Sub Sample()
'~~> This will give you $B$2
Debug.Print R1C12A1("B4", "R[-2]C")
'~~> This will give you E227
Debug.Print R1C12A1("O9", "R[218]C[-10]", True)
'~~> This will give you $Y$217
Debug.Print R1C12A1("O9", "R[208]C[10]")
End Sub
Function R1C12A1(baseCell As String, sRC As String, Optional RemDollar As Boolean = False) As String
Dim MyArray() As String
Dim r As Long, c As Long
sRC = Replace(sRC, "R", "")
If Left(sRC, 1) = "C" Then
r = 0
Else
r = Replace(Replace(Split(sRC, "C")(0), "[", ""), "]", "")
End If
If Right(sRC, 1) = "C" Then
c = 0
Else
c = Replace(Replace(Split(sRC, "C")(1), "[", ""), "]", "")
End If
If RemDollar = False Then
R1C12A1 = Range(baseCell).Offset(r, c).Address
Else
R1C12A1 = Replace(Range(baseCell).Offset(r, c).Address, "$", "")
End If
End Function
注: ここではエラー処理を行っていません。必要に応じて組み込むことができると確信しています。
以前は、マクロの記録時に相対参照を切り替える機能がありました。
記録を開始すると、マクロ ツールバー (停止ボタンの近く) に、相対参照を切り替えるボタンがありました。これは R1C1 をトグルするのと同じではありませんか? または、これはもう利用できませんか?
Siddharth が言うように、R1C1 は理解するのにそれほどトリッキーではないと言っているように、自分で切り替えることは決してありませんでした。また、何をしても、VBA には編集が必要になるため、同時に他の構文を使用したい場合は、簡単に変更できます。 .
次のことをいじってみましたが、役に立たないようですので、このボタンの使用をR1C1と混同している可能性があります...