此代码是我正在处理的一小部分内容。我已将问题缩小到以下部分。我有这个UDF SampleFunction,我需要传递一个数组,{3; 4}作为唯一的参数。
Function SampleFunction(InputVar As Variant) As Integer
SampleFunction = InputVar(LBound(InputVar))
End Function
我以两种不同的方式称呼这个UDF。首先,通过VBA
Sub testSF()
MsgBox SampleFunction(Array(3, 4))
End Sub
其次,通过我的Excel工作表
={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,因为我希望能够将任意数字(作为一个长度数组),数组或范围(接收并转换为数组)传递给函数。
提前致谢!!
答案 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
这很快就很脏,特别是错误处理,但希望基本的想法是有帮助的。