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

pla*_*lie 5 arrays excel vba excel-2003 excel-vba excel-formula

这段代码是我工作的一小部分.我已将问题缩小到以下部分.我有这个UDF SampleFunction,我需要传递一个数组,{3; 4}作为唯一的参数.

Function SampleFunction(InputVar As Variant) As Integer
    SampleFunction = InputVar(LBound(InputVar))
End Function
Run Code Online (Sandbox Code Playgroud)

我用两种不同的方式称之为UDF.首先,通过VBA

情况1:

Sub testSF()
    MsgBox SampleFunction(Array(3, 4))
End Sub
Run Code Online (Sandbox Code Playgroud)

其次,通过我的excel工作表作为

案例2:

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

问题:

UDF适用于案例1,即通过VBA调用#VALUE,当我通过excel工作表调用它时,它为案例2 提供了错误.

我在案例2中使用F8逐步执行该函数.Lbound(InputVar)计算结果为1(这与从案例1中的子句调用不同,它的计算结果为0),但InputVar(Lbound(InputVar))在案例2中显示"下标超出范围"错误.

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

一些其他细节:

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

提前致谢!!

Exc*_*lll 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
Run Code Online (Sandbox Code Playgroud)

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