对象'Range'的方法'FormulaR1C1'失败

时间:2017-07-18 21:19:50

标签: excel vba if-statement excel-vba-mac

我在Excel中运行宏时遇到问题(Mac上的第15版365)。它在这一部分失败了:

Dim LastRow2 As Long
LastRow2 = Range("A65000").End(xlUp).Row

Range("AV2").Select
ActiveCell.FormulaR1C1 = _
    "=IF(OR(AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-40]<1),AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-39]<1),AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-38]<1),AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-34]<1),AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-33]<1),AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-32]<1),AND(RC[" & _
    "ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-31]<1),AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-30]<1),AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-29]<1),AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-28]<1)),""Error"",""Good"")"
Selection.AutoFill Destination:=Range("AV2:AV" & LastRow2)

我无法弄清楚为什么......我没有看到任何错误。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:1)

分解你的公式可以大大减少!

原始分解:

"=IF(
OR(
    AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-40]<1), 
    AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-39]<1),
    AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-38]<1),
    AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-34]<1),
    AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-33]<1),
    AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-32]<1),
    AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-31]<1),
    AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-30]<1),
    AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-29]<1),
    AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"",RC[-28]<1)
),
""Error"",""Good"")"

可以实现:

"=IF(
    AND(
        RC[-41]<>""ZZ"",
        RC[-27]=""I"",
        RC[-26]=""n"",
        OR(
            RC[-40]<1,
            RC[-39]<1,
            RC[-38]<1,
            RC[-34]<1,
            RC[-33]<1,
            RC[-32]<1,
            RC[-31]<1,
            RC[-30]<1,
            RC[-29]<1,
            RC[-28]<1
        )
    ),""Error"",""Good"")"

将此项设置为模块顶部的Private Const,以便于维护。

Option Explicit

Private Const AV_ErrOrGood As String = "=IF(AND(RC[-41]<>""ZZ"",RC[-27]=""I"",RC[-26]=""n"", OR(RC[-40]<1,RC[-39]<1,RC[-38]<1,RC[-34]<1,RC[-33]<1,RC[-32]<1,RC[-31]<1,RC[-30]<1,RC[-29]<1,RC[-28]<1)),""Error"",""Good"")"

Sub SO45177305()
    Dim LastRow2 As Long
    LastRow2 = Range("A" & Rows.Count).End(xlUp).Row
    Range("AV2:AV" & LastRow2).FormulaR1C1 = AV_ErrOrGood
End Sub