VBA-数组公式:即使公式看起来正确,公式阵列上也会出现运行时错误1004。内部例子

时间:2018-11-08 08:17:43

标签: excel vba excel-formula formula

编辑: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]中查看的范围的最后一行

Daten!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"

如果任何人都可以看一下,那就太好了。到目前为止,我找不到原因

最好的问候 詹斯

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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