VBA – UDF处理数组的方式不同

这个代码是我正在工作的一小部分。 我已经把问题缩小到了下面的内容。 我有这个UDF SampleFunction,我需要传递一个数组{3; 4}作为唯一的参数。

Function SampleFunction(InputVar As Variant) As Integer SampleFunction = InputVar(LBound(InputVar)) End Function 

我以两种不同的方式调用这个UDF。 首先,通过VBA

情况1:

 Sub testSF() MsgBox SampleFunction(Array(3, 4)) End Sub 

其次,通过我的Excel工作表

案例2:

={SampleFunction(ROW(3:4))} – >即作为数组函数。

问题:

UDF适用于案例1,即通过VBA进行的调用,当我通过excel工作表调用时,它给出了案例2的#VALUE错误。

我在Lbound(InputVar)情况下使用了F8的functionLbound(InputVar)计算结果为1(与从案例1中的sub调用的不同,它的计算结果为0),而InputVar(Lbound(InputVar))显示“超出范围“错误的情况2。

我只想知道如何从工作表中调用SampleFunction函数 ,即Case 2,以便它具有与上面的Case 1相同的行为。 作为奖励,如果有人可以解释为什么在上述情况下, Lbound(InputVar)评估方式不同,那将会很不错。

其他一些细节:

我正在构build一个UDF来执行一些正则expression式操作。 上面的InputVar参数将是一个数组{x; y; z; …},指定xth,yth,zth …的出现次数。 InputVar的数据types保持为Variant,因为我希望能够将数字(作为一个长度数组),数组或范围(取入并转换为数组)传递给该函数。

提前致谢!!

我相信你有两个问题。 首先,我不认为你的代码会评估你SampleFunction在非数组公式中使用SampleFunction ,也就是说,如果InputVar是一个Range。 你需要包含一些处理不同types的input的方法,这些input可以传递到变体中。 其次,你的代码假设InputVar是一个一维数组。 这将导致任何multidimensional array的错误。 这是'Subscript out of range.'的来源'Subscript out of range.' 错误,因为数组函数将所有数组参数作为二维数组传递,即使它们可以表示为一维。

我会build议在你的函数中声明一个新的dynamic数组,然后设置它等于InputVar。 在过去,我已经做了这个工作的数组和非数组公式和下面的东西。 此外,请注意如何检索数组中的第一项。

 Option Explicit Function SampleFunc(InputVar As Variant) As Integer Dim tmpArray() As Variant On Error GoTo ErrHandler tmpArray = InputVar 'Added extra argument to LBound since dynamic arrays have two dimensions by default. SampleFunc = tmpArray(LBound(tmpArray, 1), LBound(tmpArray, 2)) Exit Function ErrHandler: 'Handles the case where InputVar is a Range. tmpArray = InputVar.Value Resume Next End Function 

这是快速和肮脏的,尤其是 error handling,但希望基本的想法是有帮助的。