Excel / VBA - 如何创建返回列表的函数

时间:2015-04-03 10:08:06

标签: vba excel-vba excel-formula excel

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

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

=SUMIFS(sumRange,criteriaRange,A1)

假设我想在下拉列表中再添加两个项目:“所有元音”(所以"A""E")和“所有辅音”(所以"B", "C", "D", "F")。我找到了一种在SUMIFS中提供替代条件的方法,方法是用SUM包装它并在SUMIFS中提供元素列表,如下例所示:

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

现在我想用上面的列表替换一个函数(f),它将A1的值作为参数并返回: {"A","E"} - 当A1为“所有元音”时 {"B", "C", "D", "F"} - 当A1是“所有辅音”时 在所有其他情况下的身份。 最后,我希望以下公式起作用:

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

A1中的任何选择。有可能吗?
我尝试了不同的方法,比如返回一个数组,或者返回一个字符串"{"A","E"}"。没有人做过这项工作。

1 个答案:

答案 0 :(得分:1)

您只需添加额外的计算级别即可。这可以通过输入SUM(SUMIFS(...))作为数组公式来完成,其中 Ctrl + Shift + Enter↵或替换{{3对于SUMPRODUCT function包装器,总计迭代,因为SUM 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

示例工作表:

UDF returning an array

F5中返回正确结果的数组公式

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

需要使用 Ctrl + Shift + Enter↵来最终确定数组公式。一旦输入正确,它们可以像其他公式一样被复制或填充到其他位置(取决于相对/绝对单元格范围寻址)。

F6中返回正确结果的标准公式

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

SUMPRODUCT功能提供了公式所需的额外处理层,而无需使用CSE。

如果扩展UDF的Select Case,阵列公式w / CSE和SUMPRODUCT仍然可以使用非数组,单一标准而不会受到惩罚。