0

我有一个在电子表格中运行良好的公式,但是当我尝试使用 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),"""")))))))"
4

1 回答 1

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

在这里,我们首先构造一个表示公式的字符串,但使用tildas代替引号对。我们更换 tildas 并存放公式。

我用它来避免偏头痛。

于 2015-03-31T16:25:05.953 回答