Sof*_*mur 2 excel vba excel-vba
在录制的VBA宏中,似乎他们的公式使用R1C1 reference style.例如,填写B4有B2+1:
Range("B4").Select
ActiveCell.FormulaR1C1 = "=R[-2]C+1"
Run Code Online (Sandbox Code Playgroud)
有谁知道是否可以关闭此模式?例如,让录制的宏看起来像:
Range("B4").Select
ActiveCell.Formula = "=B2+1"
Run Code Online (Sandbox Code Playgroud)
我相信你做不到.宏将始终以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
Run Code Online (Sandbox Code Playgroud)
注意:我这里没有做任何错误处理.我相信如果需要你可以加入.