Excel:将数组传递给用户定义的函数(VBA)

时间:2013-08-12 10:48:32

标签: arrays excel vba parameter-passing user-defined-functions

编辑:解决方案 - 请参阅下面的原始问题

在将类似{1,2,3}的数组传递给UDF时,我发现需要考虑两件事:

  • 语言环境 - 请参阅答案1.德语系统上的列表分隔符(通常)是“;”因此我需要使用{1 ; 2 ; 3}。

  • 传递的数组在函数中显示为二维数组。因此,它的第n个元素必须以myArray为目标(n, 1 )。无视这个给了我#VALUE!错误。

因此,一个简短的“选择案例”-UDF可能如下所示:

Function SelCase(a1, a2, a3)
    For i = 1 To UBound(a2)
        If a2(i, 1) = a1 Then SelCase = a3(i, 1)
    Next
End Function

调用(德语区域设置!):

=SelCase(A1;{1;2;3};{"a";"b";"c"})

在结果中给出“a”,“b”或“c”取决于A1保持1,2或3。

更详细的“选择案例”-UDF被找到here


原始问题:

我想将像{1,2,3,4}这样的数组传递给Excel 2002中的用户定义函数 - 并且无法找到实现此目的的方法。

我使用的是德语版本,因此“,”是我的小数点分隔符,并且还将水平(1D-)数组中的值分开 - 编辑:这是错误的 - ,wheras“;”在Sheet中调用函数中的参数,并在垂直(1D-)数组中分隔值 - 据我所知。

我试过像

这样的东西
Function test(myArray)
Function test(myArray())

类似

=test({1,2,3,4})
{=test({1,2,3,4})} (with ctrl+shift+enter)

在我的工作表中,但Excel总是要求我更正我的公式,例如“= test({1,234})”这不是我想要的。

如果我尝试类似

的话
=test({1;2;3;4})
=test(1,2,3,4)
=test(1;2;3;4) <- ok this would be for paramArray

作为表格中的公式我得到#VALUE!错误。

我不能使用paramArray'因为最后我必须传递两个数组(可变大小)和一个单值作为3个参数。在工作表和VBA中我需要什么语法来传递数组(未定义为范围)?

提前谢谢! 马丁林登劳夫

修改

我正在尝试构建的是“Select Case”的简写UDF,如:

Function SelCase() As Variant
a1 = "b"
a2 = Array("a","b","c")
a3 = Array("e1","e2","e3")
For i = 0 To UBound(a2)
    If a2(i) = a1 Then SelCase = a3(i)
Next
End Function

a1,a2,a3未在函数中定义,但通过函数调用传递,如

=SelCase(A1;{"a","b","c"};{"e1","e2","e3"})

给予“e1”......“e3”取决于A1 =“a”,“b”或“c”。

我可以通过CHOOSE()和MATCH()来实现这一点,但我经常这样做 - &gt;喜欢有一个漂亮的“短版”,顺便说一句。我想了解我在使用数组和UDF时遇到的问题......谢谢。

编辑2:

我找到了“select case UDF”here的工作方法。一般问题仍然存在:如何将一种{1,2,3}注释中的数组传递给UDF(如果可能的话)。

1 个答案:

答案 0 :(得分:3)

这是你的意思吗?

Excel公式:

=sumArray({1,2,3,4,5},2,{9.5,8.7,7.3,6,5,4,3},D1:D11)

UDF:

Function sumArray(ParamArray arr1() As Variant) As Double

    sumArray = WorksheetFunction.Sum(arr1(0)) + arr1(1) + _
        WorksheetFunction.Average(arr1(2)) + WorksheetFunction.Sum(arr1(3))

End Function

更新

上面的代码和公式肯定可以使用英国语言​​环境以及下面的设置。如果您遇到错误,请替换控制面板中的符号或使用正确的列表分隔符和小数符号更新公式。

enter image description here