从2D中传递2D数组到VBA / UDF函数

我在Excel 2010上。

当一个VBA用户定义函数,比如说make2DArray,输出一个代表二维数组的变体时,这个二维数组可以被用作另一个VBA函数的input,比如someFunction。 从VBA代码中调用函数。 它工作正常。

但是,在做同样的事情时,从工作表内部(通过单元格中的公式)将make2DArray输出作为parameter passing给someFunction,那么它似乎只适用于具有** 2或更多行**的2D数组。 用1行生成2Darrays将失败。 看起来,1行2Darrays然后被自动转换成等效的1Darrays。

一个小例子:

Option Explicit 'returns last (top-most, right-most) element Function someFunction(v As Variant) As Integer On Error Resume Next Debug.Print "Dim-1 size", UBound(v, 1) - LBound(v, 1) + 1 Debug.Print "Dim-2 size", UBound(v, 2) - LBound(v, 2) + 1 On Error GoTo 0 someFunction = v(UBound(v, 1), UBound(v, 2)) End Function Function make2DArray(h As Integer, w As Integer) As Variant Dim i As Integer, j As Integer Dim v2d As Variant ReDim v2d(1 To h, 1 To w) For i = 1 To h For j = 1 To w v2d(i, j) = i * j Next j Next i make2DArray = v2d End Function Sub test() 'also works when called from sheet Debug.Print someFunction(make2DArray(2, 3)) 'returns 6 'doesn't work when called from sheet Debug.Print someFunction(make2DArray(1, 3)) 'returns 3 End Sub 

testingfunction将在VBA内正常工作。 类似= someFunction(make2DArray(2,3))或任何= someFunction(make2DArray(i,j))单元格公式适用于i> 1,然而= someFunction(make2DArray(1,3))或任何= someFunction(make2DArray (1,j))只会产生一个#VALUE! 导致表单。

我的问题:这种行为logging在某个地方? 有没有一种方法可以避免从一维2Darrays的2Darrays到一维arrays的“投射”?

从我的评论:

我以前从来没有见过。 这就像它正在使用转置将二维(一行)数组转换为一维数组。 我认为这是一个错误,因为VBA开销正在寻找一个“行”(例如1作为第一排)的二维变体arrays,并将其转换为一维arrays,并将原来的第二排列作为游隙唯一的一维排名。 对于普遍性来说,我能想出的唯一build议是错误控制。 我会在下面发表一个build议。

这里有一些错误控制来克服stream氓二维到一维数组的转换。

 'returns bottom-right element of 2D-array Function someFunction(v As Variant) 'As Integer On Error Resume Next Debug.Print "Dim-1 size", UBound(v, 1) - LBound(v, 1) + 1 Debug.Print "Dim-2 size", UBound(v, 2) - LBound(v, 2) + 1 On Error GoTo 0 'Debug.Print IsArray(v) 'Debug.Print UBound(v, 1) & ":" & UBound(v, 2) On Error GoTo err_1D_array someFunction = v(UBound(v, 1), UBound(v, 2)) Exit Function err_1D_array: someFunction = v(UBound(v)) End Function 

UDF应该真正的复制范围,vector,数组,或者标量常量,或者其他函数的数组/vector输出。
SomeFunction({1,2,3})获取一维向量数组
SomeFunction({1; 2; 3})获得一个二维数组
SomeFunction(Range as variant)得到一个variables,它包含一个范围对象,其Value2属性总是返回一个标量或二维数组。