VBA - UDF以不同方式处理数组

时间:2012-04-23 18:30:32

标签: arrays excel excel-vba excel-formula excel-2003 vba

此代码是我正在处理的一小部分内容。我已将问题缩小到以下部分。我有这个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错误。

我在案例2中使用F8逐步完成了该功能。Lbound(InputVar)的计算结果为1(与案例1中的子句调用不同,评估为0),但是InputVar(Lbound(InputVar))显示了案例2中的“下标超出范围”错误。

我想知道的是如何从工作表中调用SampleFunction函数,即案例2,使其具有与上面显示的案例1相同的行为。作为奖励,如果有人可以解释为什么Lbound(InputVar)在上述情况下评估的方式不同,那就太好了。

其他一些细节:

我正在构建一个UDF来执行一些正则表达式操作。上面的参数InputVar将是一个数组{x; y; z; ...},指定xth,yth,zth ......出现。 InputVar的数据类型保留为Variant,因为我希望能够将任意数字(作为一个长度数组),数组或范围(接收并转换为数组)传递给函数。

提前致谢!!

1 个答案:

答案 0 :(得分:5)

我相信你有两个问题。首先,如果您在非数组公式中使用SampleFunction,我认为您的代码不会评估,即,如果InputVar是Range。您需要采用某种方式处理可以传递给变体的不同类型的输入。其次,您的代码假定InputVar是一维数组。这将导致任何多维数组的错误。这是'Subscript out of range.'错误的来源,因为数组函数将所有数组参数作为二维数组传递,即使它们可以表示为一维数。

我建议在函数中声明一个新的动态数组,然后将其设置为等于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

这很快就很脏,特别是错误处理,但希望基本的想法是有帮助的。