Excel/VBA - 如何创建一个 returns 列表的函数

Excel/VBA - How to create a function which returns a list

我正在尝试在 Excel 中创建一个函数,其中 return 是一个列表。背后的原因是:

在我的工作簿中,我使用的是 SUMIFS。用户可以在下拉列表中选择标准,然后将其作为参数传递给 SUMIFS。举个例子,假设我在单元格 A1 中有一个下拉列表,可能的值为:"A", "B", "C", "D", "E", "F"。我的公式是:

=SUMIFS(sumRange,criteriaRange,A1)

假设我想在下拉列表中再添加两个项目:"All vowels"(所以 "A""E")和 "All consonants"(所以 "B", "C", "D", "F").我找到了一种在 SUMIFS 中提供替代条件的方法,方法是用 SUM 将其包装起来并提供 SUMIFS 中的元素列表,如下例所示:

=SUM(SUMIFS(sumRange,criteriaRange,{"A","E"})  
=SUM(SUMIFS(sumRange,criteriaRange,{"B", "C", "D", "F"})

现在我想用一个函数 (f) 替换上面的列表,该函数将 A1 的值作为参数并且 return: {"A","E"} - 当 A1 为 "All vowels" {"B", "C", "D", "F"} - 当 A1 为 "All consonants" 在所有其他情况下的身份。 最后我希望下面的公式起作用:

=SUM(SUMIFS(sumRange,criteriaRange,f(A1)}

A1 任意选择。可能吗?
我尝试了不同的方法,比如 returning 数组,或 returning 字符串 "{"A","E"}"。 None 人完成了这项工作。

您只需要添加额外的计算级别。这可以通过使用 Ctrl+Shift+Enter↵[= 输入您的 SUM(SUMIFS(...)) 作为数组公式来完成45=] 或替换 SUMPRODUCT function for the SUM function wrapper that totals the iterations as the SUMIFS function 循环遍历条件中的 OR 元素。

示例 UDF:

Function ma(sCRIT As String)
    Select Case LCase(sCRIT)
        Case "all vowels"
            ma = Array("A", "E")
        Case "all consonants"
            ma = Array("B", "C", "D", "F")
        Case Else
            ma = sCRIT 
    End Select
End Function

示例工作表:

F5中的数组公式returns正确的结果是,

=SUM(SUMIFS(D1:D6, C1:C6, ma(A1)))

数组公式需要用Ctrl+Shift+Enter↵完成。正确输入后,可以将它们复制或填充 right/down 到其他位置,就像任何其他公式一样(取决于 relative/absolute 单元格范围寻址)。

F6中的标准公式returns正确的结果是,

=SUMPRODUCT(SUMIFS(D1:D6, C1:C6, ma(A1)))

SUMPRODUCT 函数无需使用 CSE 即可提供公式所需的额外处理层。

带 CSE 的数组公式和 SUMPRODUCT 仍然可以使用 non-array,如果扩展 UDF 的 Select Case,则没有惩罚的单一条件..