【问题标题】:Long nested IF statement creates runtime error 1004 in Excel VBA长嵌套 IF 语句在 Excel VBA 中创建运行时错误 1004
【发布时间】:2015-04-04 20:00:47
【问题描述】:

我有一个在电子表格中运行良好的公式,但是当我尝试使用 VBA 自动创建公式时,我收到 1004 运行时错误。

我有一个 3 个阶段的过程,每个阶段都有一个开始和结束日期(所以 6 个单独的日期列)。此公式查看系列日期并使用 NETWORKDAYS 函数计算每个阶段之间的时间损失。

我认为解决此问题的简单方法是将我粘贴此公式的宏记录到单元格中,这将生成所需的 VBA 代码,然后我可以对其进行调整,但即使使用此方法也会导致 1004 错误。

我想知道问题是否出在公式的长度上?我尝试用& Chr(34) & Chr(34) & 替换双引号,并尝试将公式分配给变量。如果我使用 .value 而不是 .formulaR1C1 将其作为文本添加,或者在公式字符串的开头添加撇号,我可以让它工作。这似乎是一个导致问题的公式。非常感谢任何帮助。

电子表格单元格中的公式:

=IF(AND(I2="",J2="",K2="",L2=""),"",IF(AND(G2="",H2="",K2="",L2=""),"",IF(AND(G2="",H2="",I2="",J2=""),"",IF(AND(H2<>"",I2<>"",J2<>"",K2<>""),IF(NETWORKDAYS(H2,I2)-2+NETWORKDAYS(J2,K2)-2<1,"",NETWORKDAYS(H2,I2)-2+NETWORKDAYS(J2,K2)-2),IF(AND(H2<>"",I2<>""),IF(NETWORKDAYS(H2,I2)-2<1,"",NETWORKDAYS(H2,I2)-2),IF(AND(H2<>"",K2<>""),IF(NETWORKDAYS(H2,K2)-2<1,"",NETWORKDAYS(H2,K2)-2),IF(AND(J2<>"",K2<>""),IF(NETWORKDAYS(J2,K2)-2<1,"",NETWORKDAYS(J2,K2)-2),"")))))))

我在单元格中输入公式时宏记录的代码:

ActiveCell.FormulaR1C1 = _
        "=IF(AND(RC[-10]="""",RC[-9]="""",RC[-8]="""",RC[-7]=""""),"""",IF(AND(RC[-12]="""",RC[-11]="""",RC[-8]="""",RC[-7]=""""),"""",IF(AND(RC[-12]="""",RC[-11]="""",RC[-10]="""",RC[-9]=""""),"""",IF(AND(RC[-11]<>"""",RC[-10]<>"""",RC[-9]<>"""",RC[-8]<>""""),IF(NETWORKDAYS(RC[-11],RC[-10])-2+NETWORKDAYS(RC[-9],RC[-8])-2<1,"""",NETWORKDAYS(RC[-11],RC[-10])-2+NETWORKDAYS(RC[" & _
        "8])-2),IF(AND(RC[-11]<>"""",RC[-10]<>""""),IF(NETWORKDAYS(RC[-11],RC[-10])-2<1,"""",NETWORKDAYS(RC[-11],RC[-10])-2),IF(AND(RC[-11]<>"""",RC[-8]<>""""),IF(NETWORKDAYS(RC[-11],RC[-8])-2<1,"""",NETWORKDAYS(RC[-11],RC[-8])-2),IF(AND(RC[-9]<>"""",RC[-8]<>""""),IF(NETWORKDAYS(RC[-9],RC[-8])-2<1,"""",NETWORKDAYS(RC[-9],RC[-8])-2),"""")))))))"

【问题讨论】:

  • 请用代码格式修改...
  • 另外,请指明您要在哪个单元格中粘贴此公式。
  • 抱歉,我不知道如何对格式进行排序(这是我的第一篇文章),但感谢修复它的人。
  • 公式进入哪个单元格无关紧要,问题在于VBA执行此操作的过程。我打算将公式放在包含 1,000 行数据的列中。
  • 哦,但由于偏移量,公式可能引用无效范围等,这确实很重要。 Fwiw,我输入了公式,它在任何单元格中都会出错,所以问题似乎出在 formyla 字符串本身。无论如何,看起来你已经有了解决方案,干杯。

标签: vba excel nested-if


【解决方案1】:

考虑:

Sub EvilFormula()
    Dim st As String, DQ As String
    DQ = Chr(34) & Chr(34)
    st = "=IF(AND(I2=~,J2=~,K2=~,L2=~),~,IF(AND(G2=~,H2=~,K2=~,L2=~),~,IF(AND(G2=~,H2=~,I2=~,J2=~),~,IF(AND(H2<>~,I2<>~,J2<>~,K2<>~),IF(NETWORKDAYS(H2,I2)-2+NETWORKDAYS(J2,K2)-2<1,~,NETWORKDAYS(H2,I2)-2+NETWORKDAYS(J2,K2)-2),IF(AND(H2<>~,I2<>~),IF(NETWORKDAYS(H2,I2)-2<1,~,NETWORKDAYS(H2,I2)-2),IF(AND(H2<>~,K2<>~),IF(NETWORKDAYS(H2,K2)-2<1,~,NETWORKDAYS(H2,K2)-2),IF(AND(J2<>~,K2<>~),IF(NETWORKDAYS(J2,K2)-2<1,~,NETWORKDAYS(J2,K2)-2),~)))))))"
    st = Replace(st, "~", DQ)
    ActiveCell.Formula = st
End Sub

这里我们首先构造一个 String 来表示公式,但使用 tildas 代替 pairs 的双引号。我们更换 tildas 并存放配方。

我用它来避免偏头痛。

【讨论】:

  • 感谢您的这个小宝石,它完美无缺!!!当我试图将它分配给一个字符串并替换双引号时,知道我在正确的树上吠叫也让人放心。这无疑是一种有效的偏头痛缓解方法 :) 非常感谢您花时间研究这个。
猜你喜欢
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多