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

5

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

在将类似于 {1,2,3} 的数组传递给UDF时,需要考虑以下两点:

  • 本地化 - 见答案1。德语系统上的列表分隔符(通常)是“;”,因此我需要使用 {1;2;3}。

  • 传递的数组在函数内部显示为二维数组。因此,其第n个元素必须被定位为myArray(n,1)。如果忽略这一点,则会导致#VALUE!错误。

因此,“select case”-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"})

根据A1的值为1、2或3,返回结果中给出“a”、“b”或“c”。

更详细的“select case”-UDF可以在这里找到。


原问题:

我想将类似{1, 2, 3, 4}的数组传递给Excel 2002中的用户定义函数,但我无法找到方法。

我使用的是德语版本,所以“,”是我的小数分隔符,并且也将水平(1D)数组的值分隔为值- 编辑:这是错误的 -,而“;”则在从工作表调用的公式中分隔参数并在垂直(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!错误。由于最后我必须传递两个数组(大小可变)和一个单一值作为3个参数,所以我无法使用paramArray。在表格和VBA中,我需要什么语法来传递不被定义为范围的数组?非常感谢! Martin Lindenlauf
编辑:我试图构建一个简写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"})

根据A1的值是“a”,“b”或“c”,给出“e1”...“e3”。我可以使用CHOOSE()和MATCH()实现这一点,但我经常需要它->希望有一个漂亮的“简短版本”,顺便说一下,我想了解我在数组和UDF方面做错了什么...谢谢。

编辑2:

我在这里找到了一个有效的“选择案例UDF”方法。总体问题仍然存在:如何将数组传递给UDF(如果可能)以类似{1,2,3}的方式。


为什么要将数组传递给UDF?如果您解释一下您想要做什么,我们可能会给您更好的实现方式。 - user2140173
1个回答

4

这是您的意思吗?

Excel公式:

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

用户自定义函数:

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

更新:

以上代码和公式在英国本地设置下肯定可以运行。如果出现错误,请从控制面板中替换符号或使用正确的列表分隔符和小数符号进行更新。

输入图像说明


是的,看到我上面的编辑。我无法重现您的示例;Excel不接受“=sumArray({1,2,3,4,5},2,{9.5,8.7,7.3,6,5,4,3},D1:D11)” - 它再次建议使用“{1,2345}”而不是数组传递给UDF的“{1,2,3}”表示有问题吗? - martin.lindenlauf
1
前往控制面板/时钟、语言和区域/地区和语言/其他设置... 这将显示一个菜单,其中包含十进制符号、列表分隔符等选项。 我怀疑您只需要用“列表分隔符:”中选择的符号替换所有逗号。 - user857521
好的,那就这样吧;我来对我的问题做最后编辑。由于无法点赞,我只能说:感谢您帮助一个新手学习。 - martin.lindenlauf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接