长嵌套IF语句在Excel VBA中创建运行时错误1004

时间:2015-03-31 15:54:48

标签: excel vba excel-vba nested-if

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

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

我认为克服这个问题的简单方法是记录我将这个公式粘贴到一个单元格中的宏,这将生成我可以调整的所需VBA代码,但即使使用此方法也会导致1004错误。 / p>

我想知道公式的长度是否是问题所在?我尝试用& 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),"""")))))))"

1 个答案:

答案 0 :(得分:0)

考虑:

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 代替双引号的。我们更换了tildas并存放了公式。

我用它来避免偏头痛。