VBA - UDF处理不同的阵列(VBA - UDF handles Arrays differ

2019-09-16 16:43发布

这段代码是什么我工作的一小部分。 我已经缩小的问题,下面的这个作品。 我有这样的UDF SampleFunction,向其中我需要通过一个Array,{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调用,它给出了一个#VALUE错误案例2,当我把它通过Excel工作表。

我通过使用F8用于情况2的功能阶梯Lbound(InputVar)的计算结果为1(这是不同从副调用案例1中,它的计算结果为0),但InputVar(Lbound(InputVar))示出了“下标超出范围”的错误案例2。

所有我想知道的是如何从一个工作表调用SampleFunction功能 ,即第2种情况,使其具有如案例1中所示的相同的行为。 作为奖励,这将是很好,如果有人可以解释为什么Lbound(InputVar)在上述情况下的计算结果是不同的。

其他一些细节:

我建立一个UDF来执行一些正则表达式的操作。 这个论点InputVar以上,将是一个数组{X; Y; Z; ...}指明第x,y个,第i ...出现次数。 的数据类型InputVar保持为变体,因为我希望能够通过其中的数字(为一个长度阵列),阵列或范围(在截取并转换成数组)的功能。

提前致谢!!

Answer 1:

我相信你有两个问题。 首先,我不认为如果你用你的代码将评估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

这是快速和肮脏的,ESP。 错误处理,但希望其基本思路是有帮助的。



文章来源: VBA - UDF handles Arrays differently