Switch off R1C1 reference style for recorded VBA macros

时间秒杀一切 提交于 2020-01-13 06:13:49

问题


In recorded VBA macros, it seems that their formulas use R1C1 reference style. For instance, to fill in B4 with B2+1:

Range("B4").Select
ActiveCell.FormulaR1C1 = "=R[-2]C+1"

Does anyone know if it is possible to switch off this mode? For instance, let recorded macro look like:

Range("B4").Select
ActiveCell.Formula = "=B2+1"

回答1:


I believe you cannot do that. The macro will always record in R1C1 style.

You can always switch the style but it will only be applied to the worksheet and if you record a macro it will still show R1C1 reference style.

It is very easy to understand the R1C1 style

In R1C1 reference style, the range is referred by how far the cells are located from the cell you are calling. For example, if you have 5 values from R1C1 to R5C1 and the range is called from R7C2, then the range would be R[-6]C[-1]:R[-2]C[-1]. Here the first cell in the range is 6 rows before the cell R7C2 and 1 column before the cell R7C2 and similarly for the last cell in the range.

If I take your example then "=R[-2]C+1" means that the formula is referring to a row which is two rows up (-2) and in the same column (0). Your formula is same as "=R[-2]C[0]+1"

EDIT

Here is a small function that I wrote which can help you convert R1C1 to A1 string

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

Note: I have not done any error handling here. I am sure you can incorporate that if needed.




回答2:


There used to be a facility to toggle relative reference when recording a macro.

When you have started recording, in the macro toolbar - near the stop button - there was a button to toggle relative reference; is this not the same as toggling R1C1 ? or isn't this available anymore?

I never bothered toggling it myself as like Siddharth says the R1C1 isn't too tricky to understand plus, irrespective of whatever you do, the VBA will need some editing so at the same time if you wish to use other syntax it's easy enough to change.

I've just played around with the following but it doesn't seem to help so maybe I'm mixing up the use of this button with R1C1...



来源:https://stackoverflow.com/questions/11707033/switch-off-r1c1-reference-style-for-recorded-vba-macros

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!