如何在公式中使用 R1C1 格式的文本

How to use R1C1 formatted text in a formula

为了通过 VBA 开发动态公式,我不得不使用 INDIRECT(ADDRESS(。我现在被几十个看起来像这样的公式所困:

=INDIRECT(ADDRESS(37,10),1)*(INDIRECT(ADDRESS(37,7),1)+(INDIRECT(ADDRESS(69,10),1)*INDIRECT(ADDRESS(77,10),1))+(INDIRECT(ADDRESS(70,10),1)*INDIRECT(ADDRESS(78,10),1))+(INDIRECT(ADDRESS(71,10),1)*INDIRECT(ADDRESS(79,10),1))+(INDIRECT(ADDRESS(72,10),1)*INDIRECT(ADDRESS(80,10),1))+(INDIRECT(ADDRESS(73,10),1)*INDIRECT(ADDRESS(81,10),1))+(INDIRECT(ADDRESS(74,10),1)*INDIRECT(ADDRESS(82,10),1))+(INDIRECT(ADDRESS(75,10),1)*INDIRECT(ADDRESS(83,10),1)))

我不能将这些公式与求解器一起使用,因为它对求解器来说太多了。当我手动将公式转换为 "A1" 格式时,Solver 就会工作。我需要自动翻译,因为这是一个模板。

我希望用 "Cells" 替换 "INDIRECT(ADDRESS" 可能会奏效。没运气。有没有我可以使用的表达式可以替换 "INDIRECT(ADDRESS" 来读取 R1C1 格式?或者您有更好的解决方案吗?

谢谢!

 r = 0
    Do Until r = 6
        i = 0
        Do Until i = DCShipFrom
        Cells(70 + r, 7 + DCShipFrom + i).Select
        Selection.FormulaR1C1 = "=IF(AND(INDIRECT(ADDRESS(" & 67 & "," & 7 + DCShipFrom + i & "),1)<=" & "INDIRECT(ADDRESS(" & 70 + r & "," & 6 & "),1)," & "INDIRECT(ADDRESS(" & 67 & "," & 7 + DCShipFrom + i & "),1)>" & "INDIRECT(ADDRESS(" & 69 + r & "," & 6 & "),1)),1,0)"
        i = i + 1
        Loop
    r = r + 1
    Loop
    enter code here

使用ADDRESS(37, 10)返回$J$37,

INDIRECT(ADDRESS(37, 10), 1)  'or INDIRECT(ADDRESS(37,10)) since xlA1 is default

ADDRESS(37, 10, 1, 0)回归R37C10使用,

INDIRECT(ADDRESS(37, 10, 1, 0), 0)  'the zeroes denote xlR1C1 addressing

您可能需要考虑以下其中一项,

INDEX($J:$J, 37)
INDEX($A:$Z, 37, 10)

INDEX 是非易失性的。 INDIRECT 和 ADDRESS 都是易变的。

您可以通过在间接语句末尾添加 ,FALSE 将 INDIRECT 与 R1C1 格式一起使用,并使其动态化,您可以创建行和列变量,例如

INDIRECT("R" & myrow & "C" & mycol,FALSE)

试试这个,它使公式动态化,但更简单:

For r = 0 To 6
    For i = 0 To DCShipFrom
        With ActiveSheet
            .Cells(70 + r, 7 + DCShipFrom + i).Formula = "=IF(AND(" & .Cells(67, 7 + DCShipFrom + i).Address(0, 0) & "<=" & .Cells(70 + r, 6).Address(0, 0) & "," & .Cells(67, 7 + DCShipFrom + i).Address & " >" & .Cells(69 + r, 6).Address & "),1,0)"
        End With
    Next i
next r

或者如果你想要 R1C1:

For r = 0 To 6
    For i = 0 To DCShipFrom
        With ActiveSheet
            .Cells(70 + r, 7 + DCShipFrom + i).FormulaR1C1 = "=IF(AND(R" & 67 & "C" & 7 + DCShipFrom + i & " <= R" & 70 + r & "C" & 6 & ",R" & 67 & "C" & 7 + DCShipFrom + i & " > R" & 69 + r & "C" & 6 & "),1,0)"
        End With
    Next i
Next r