如何利用Excel函数输出数组

zxlwwiss  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(298)

我想在sumproduct中使用一个不接受数组的函数,例如,我有这样一个数据集:

+---------+----------------------------------------------+--------+-----+
|  Topic  |                      Eq                      | Weight | Val |
+---------+----------------------------------------------+--------+-----+
| Topic 1 | LOGNORM.DIST(val,2.4,0.4, FALSE)*10.2027*D50 |     13 |   5 |
| Topic 2 | val/10                                       |     10 |   4 |
| Topic 3 | val^2                                        |      5 |   2 |
+---------+----------------------------------------------+--------+-----+

我写了一个Visual Basic模块来计算这些方程:

Public Function eval(s As String) As Variant
    eval = Evaluate(s)
End Function

基本上,我只希望能够在等式中插入"val"列,然后乘以权重,得到一个总和数组。
我试过这个:

=SUMPRODUCT(IF(ISNUMBER(H$7:H$31),Dist(H$7:H$31,$D$7:$D$31,$E$7:$E$31))

其中Dist是lambda函数:

LAMBDA(val,eq,weight,eval(CONCAT("=",SUBSTITUTE(eq,"val",val))))

但是每当我的表超过一行时,它就会向我发出#N/A或#VALUE错误,大概是因为LOGNORM.DIST函数不喜欢值超过一个。
有没有办法强制excel函数接受数组?

vfh0ocws

vfh0ocws1#

感谢大家的评论,我用MAP函数解决了这个问题。发布了一个可见性的答案。我导航到公式〉名称管理器,创建了一个名为Dist的新公式:

=LAMBDA(val,eq,MAP(val,eq,LAMBDA(val,eq,eval(CONCAT("=",SUBSTITUTE(eq,"val",val))))))

现在,我发布的SUMPRODUCT公式基本上是这样的(伪代码):

=SUMPRODUCT(IF(ISNUMBER(ValsColumn),Dist(ValsCol,EqColumn), ...if false), WeightCol)

这将正确地输入值到我的每个方程中,而不会因为它是一个数组而大喊大叫,因为我认为Map是逐行的。

相关问题