在录制的 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) 且在同一列 (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 混淆了......