【问题标题】:VBA - Array Formula : Run Time Error 1004 on formulaArray even though the formula looks right. Example insideVBA - 数组公式:formulaArray 上的运行时错误 1004,即使公式看起来正确。里面的例子
【发布时间】:2019-04-11 17:25:18
【问题描述】:

编辑:Chronocidal 的解决方案非常有帮助。我实现了它,它就像一个魅力。感谢您的所有帮助。 Ron Reisenfeld 和 EvR 的评论也帮了我很大的忙,让我朝着正确的方向前进

有人可以帮我解决我想用 formula.local 函数插入一些单元格的数组公式吗?公式中可能有一些不对劲的地方,但我就是找不到原因……如果有人可以测试它,那将是一个很大的帮助,因为我只有德文版的 excel,可能我已经监督了任何语言特定的原因。我附上一个文件来测试公式(xlsx)

如果我 debug.print 公式如下所示:

=(PRODUCT(IF(Daten!B1:B12353=SMALL(IF((Daten!B1:B12353>=$C$25),Daten!B1:B12353,999999),1),Daten!A1:A12353-SUM(0,0),1),IF((Daten!B1:B12353>SMALL(IF((Daten!B1:B12353>=$C$25),Daten!B1:B12353),1))*((Daten!B1:B12353<=$D$33)),Daten!A1:A12353,1))^(1/(DAYS360($C$25,$D$33)/360))-1)*100

我在此示例工作簿中使用了公式:https://drive.google.com/open?id=1xCth5vo6G82lNDsclbj3FpUfYzvXsuEJ

在 VBA 中,公式包含大量变量,它们是:

[edit] b = 我想在公式中查看的范围内的最后一行 [/edit]

日期!B1:B" & b = 日期行

sh_Ov.Cells(int_Ende + 1, Int_links).Address = 最新日期

sh_Ov.Cells(int_Start, 3).Address = 最早日期(但不一定在日期行中——这就是我使用“小”公式的原因)

Daten!A1:A" & b = 我要计算乘积的数字

ThisWorkbook.Sheets(1).Cells(x,y).FormulaArray = "=(PRODUCT(IF(Daten!B1:B" & b & "=SMALL(IF((Daten!B1:B" & b & ">=" & sh_Ov.Cells(int_Start, 3).Address & "),Daten!B1:B" & b & ",999999),1),Daten!A1:A" & b & "-SUM(0,0),1),IF((Daten!B1:B" & b & ">SMALL(IF((Daten!B1:B" & b & ">=" & sh_Ov.Cells(int_Start, 3).Address & "),Daten!B1:B" & b & "),1))*((Daten!B1:B" & b & "<=" & sh_Ov.Cells(int_Ende + 1, Int_links).Address & ")),Daten!A1:A" & b & ",1))^(1/(DAYS360(" & sh_Ov.Cells(int_Start, 3).Address & "," & sh_Ov.Cells(int_Ende + 1, Int_links).Address & ")/360))-1)*100"

如果有人能看看这个就太好了。到目前为止,我无法找到原因

最好的问候 延斯

【问题讨论】:

  • 该死!它应该在标题中说 formula.array.... -.- 对不起
  • .FormulaLocal 与 .FormulaArray 不同。您的意思是整个问题和标题中的 .FormulaArray 吗?您在公式中使用的变量的值是什么,例如乙?
  • 嗨,是的。在整个帖子中应该是 Formulaarray。对不起,我搞砸了。 b 代表我想在公式中查看的范围内的最后一行
  • 您是否已将其用作单元格中的数组公式?您也可以使用edit 更新您的问题,所以这里没有问题!

标签: excel vba excel-formula formula


【解决方案1】:

您的公式超过 255 个字符,因此您不能直接通过 VBA 输入。

要么将其更改为更短(例如使用 EvR suggests 之类的命名范围),要么使用(技术上有效)虚拟代码,然后将其替换为 Range.Replace,如下所示:

With ThisWorkbook.Worksheets(1).Cells(x,y) 'Worksheets instead of Sheets will exclude Chart Sheets
    '214 Characters
    .FormulaArray = "=(PRODUCT(IF(MAX(1)=SMALL(IF((MAX(1)>=" & sh_Ov.Cells(int_Start, 3).Address & "),MAX(1),999999),1),Daten!A1:A" & b & "-SUM(0,0),1),IF((MAX(1)>SMALL(IF((MAX(1)>=" & sh_Ov.Cells(int_Start, 3).Address & "),MAX(1)),1))*((MAX(1)<=" & sh_Ov.Cells(int_Ende + 1, Int_links).Address & ")),Daten!A1:A" & b & ",1))^(1/(DAYS360(" & sh_Ov.Cells(int_Start, 3).Address & "," & sh_Ov.Cells(int_Ende + 1, Int_links).Address & ")/360))-1)*100"

     'Swap all instances of MAX(1) for your range in the Daten sheet
    .Replace("MAX(1)", "Daten!B1:B" & b, LookAt:=xlPart)
End With

【讨论】:

  • 替换的好用
  • 很好用!我正在拆分公式。来自 Chronocidal 的建议方法既好又简单。当我复制它时,它完全有效。谢谢你的帮助!!
【解决方案2】:

将您的数组公式缩短为 255 个字符(借助已定义的名称),然后重试。 (你超过了最大长度)

https://docs.microsoft.com/en-us/office/vba/api/excel.range.formulaarray

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-26
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多