这里没什么好看的,尽管我需要将公式拆分为2,因为它超过255个字符(来源:http://www.dicks-blog.com/archives/2005/01/10/entering-long-array-formulas-in-vba/ http://support.microsoft.com/kb/213181)。
f1 = "=SI(1=1,SOMME(SI(mySheet!$R:$R = ""something"",SI(mySheet!$AQ:$AQ = AM$1, NBCAR(Incidents!$AP:$AP)-NBCAR(SUBSTITUE(mySheet!$AP:$AP,$B2,"""")))))/NBCAR($B2)-X_X_X())"
f2 = "SOMME(SI(mySheet!$R:$R = """",SI(mySheet!$AQ:$AQ = AM$1, SI(mySheet!$AM:$AM = $A2,SI(DROITE(mySheet!$AP:$AP,6) = $B2,1))))),"""""
.Range("AM2").FormulaArray = f1
.Range("AM2").Replace "X_X_X()", f2
公式是法语,这不应该是真的重要。公式在单元格AM2中正确返回,因此结果如下:
={SOMME(SI(1=1;SI(mySheet!$R:$R = "something";SI(mySheet!$AQ:$AQ = AM$1; NBCAR(mySheet!$AP:$AP)-NBCAR(SUBSTITUE(mySheet!$AP:$AP;$B2;"")))))/NBCAR($B2)-SOMME(SI(mySheet!$R:$R = "something";SI(mySheet!$AQ:$AQ = AM$1; SI(mySheet!$AM:$AM = $A2;SI(DROITE(mySheet!$AP:$AP;6) = $B2;1)))));"")}
然而,我得到一个#NAME!错误。如果我查看公式调试,错误来自我的第一个函数,Excel无法解释SI()
(这是IF()
的法语)。我尝试完全删除IF()
子句,但Excel无法解释现在为SOMME()
(SUM()
)的第一个函数。
如果我只是点击公式栏并按CTRL + Shift + Enter(不更改任何内容),它将返回正确的值。
为什么在VBA设置数组公式后Excel没有给我正确的数字?如果我只是重新提交 Excel中的公式,为什么它会起作用?为什么它总是遇到第一个功能的问题?我想还有其他一些我不知道的限制。
我在浏览网页时发现了另一个类似问题但没有解决方案。
答案 0 :(得分:4)
因为Excel对于英语公式有.Formula
,对于Excel界面语言的公式有.FormulaLocal
。
您需要本地版本,但没有数组版本。你必须用英语提供数组公式。
你可以,例如将此法语公式设置为临时(隐藏)范围的.FormulaLocal
,然后从同一范围读回.Formula
并将其设置为所需范围内的.FormulaArray
。但是你不应该这样做,因为你的代码不适用于法语之外的任何Excel版本。最便携的是在代码中始终使用英语公式。