excel - 将 2D 数组从工作表传递到 VBA/UDF 函数

标签 excel vba

我使用的是 Excel 2010。

当 VBA 用户定义函数(例如 make2DArray)输出表示 2D 数组的变体时,该 2D 数组可以用作另一个 VBA 函数(例如 someFunction)的输入。从 VBA 代码中调用函数时。效果很好。

但是,当执行相同操作时,从工作表内(通过单元格中的公式)将 make2DArray 输出作为参数传递给 someFunction,那么它似乎仅适用于具有 **2 行或更多行** 的 2D 数组。生成 1 行的 2D 数组将会失败。似乎 1 行 2D 数组会自动转换为等效的 1D 数组。

一个小例子:

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

测试函数在 VBA 中可以正常工作。同样, =someFunction(make2DArray(2, 3)) 或任何 =someFunction(make2DArray(i, j)) 单元格公式对于 i>1 都适用,但是 =someFunction(make2DArray(1, 3)) 或任何 =someFunction(make2DArray) (1, j)) 只会产生#VALUE!结果在工作表中。

我的问题:这种行为是否记录在某处?有没有办法避免 1 行 2D 数组从 2D 数组“转换”到 1D 数组?

最佳答案

来 self 的评论:

I've never seen that before. It is like it is using transpose to convert a 2-D (one row) array into a 1-D array. I consider this a bug in that the VBA overhead is looking at a 2-D variant array with one 'row' (e.g. 1 as ubound first rank) and converting it to a 1-D array with the original ubound second rank as the ubound of the sole 1-D rank. For universality, the only suggestion I can come up with would be error control; I'll post a suggestion below.

这里有一些错误控制来克服恶意的 2-D 到 1-D 数组转换。

'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

关于excel - 将 2D 数组从工作表传递到 VBA/UDF 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47706441/

相关文章:

excel - 错误 1400 : there is no such cell that satisfies criterias

vba - 如何使用 VBA 刷新数据透视表

excel - 这是选择性循环 excel vba 中目录的最佳方法(如果有的话)

Excel 2007/2010 基于公式的色阶条件格式

excel - VBA:与 FunctionaArray 类型不匹配错误

excel - 如何找到列的第 n 个非空白行?

excel - 下标超出范围错误,错误弹出框中不显示调试按钮

vba - 如果满足条件,如何复制单元格并粘贴到另一个单元格中?

excel - 在 ComboBox 中显示具有不同值的文本

excel - 如何将 Excel 工作表中的文本和图表复制到 Outlook 正文?