5

这段代码是我正在处理的一小部分。我已将问题缩小到以下部分。我有这个 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 工作表作为

案例二:

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

问题:

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

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

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

其他一些细节:

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

提前致谢!!

4

1 回答 1

5

我相信你有两个问题。SampleFunction首先,如果您在非数组公式中使用,我认为您的代码不会评估,即,如果 InputVar 是一个范围。您需要结合一些方法来处理可以传递到变体中的不同类型的输入。其次,您的代码假定 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

这又快又脏,尤其是。错误处理,但希望基本思想是有帮助的。

于 2012-04-23T19:38:05.120 回答