如何将 Excel 数组公式传递给 VBA UDF?

Posted

技术标签:

【中文标题】如何将 Excel 数组公式传递给 VBA UDF?【英文标题】:How to pass Excel Array Formula to VBA UDF? 【发布时间】:2017-11-17 11:40:27 【问题描述】:

我已经看过一个类似的解决方案here,但不知何故我仍然无法让我的代码工作。

我想将数组公式的输出作为输入传递给 UDF,对其进行处理并从中返回一个值。假设只需将所有项目添加到数组中并返回值作为示例。我的主要问题是如何将数组公式的输出传递给 UDF 并在 UDF 中处理它。

'Public Function Test1(ParamArray Parm1() As Variant) As Integer
'Dim i, j
'i = 0
'For j = LBound(Parm1) To UBound(Parm1)
'
'    i = i + Parm1(j)
'
'Next j
'Test1 = i
'End Function

Public Function Test1(Parm1 As Variant) As Integer
Dim i, j
Dim tmparray() As Variant
tmparray = Parm1
For j = LBound(tmparray, 1) To UBound(tmparray, 2)
   i = i + tmparray(j)
Next j
Test1 = i   
End Function

上面注释的代码不起作用。我试图通过引用粘贴在其下方的提到的解决方案来修改它,但我仍然无法使其工作。

在 Excel 电子表格中,我将 =Test1(ROW(C1:C4)) 作为数组公式传递给它,但它返回 #VALUE!

在上面的代码(注释的代码)中,如果我通过下面的 sub 进行测试和调试,它可以正常工作,但是当从像 =Test1(ROW(C1:C4))它这样的 Excel 数组公式调用时,它会返回 #VALUE!

Sub check()

j = Test1(1, 2)

End Sub

有人可以帮我进一步吗?

【问题讨论】:

有无数的事情可能是错误的。您是否尝试过单步执行代码?您是否收到任何错误 - 如果有,错误是什么,在哪里?您传递给函数的数组是什么样的?阅读more here。 感谢您的意见。该数组看起来像上面提到的数组公式中的 ROW(C1:C4) Excel 函数返回的那样。因此,当我评估函数时,它看起来像 Test1(1;2;3;4) 我不确定您是如何做到这一点的? ROW(C1:C4) 返回 1,而不是数组 (1, 2, 3, 4) 将此:For j = LBound(tmparray, 1) To UBound(tmparray, 2) 更改为:For j = LBound(tmparray, 1) To UBound(tmparray, 1)。请注意,它仅在 ROW 返回二维数组时才有效。如果你同样使用COLUMN,它会失败,因为你有一个一维数组。 【参考方案1】:

这是创建 UDF 的方法,将一个范围内的所有数字相加:

Public Function AlternativeSum(Parm1 As Range) As Long

    Dim myCell  As Range
    Dim result  As Long

    For Each myCell In Parm1
        result = myCell.Value + result
    Next myCell

    AlternativeSum = result

End Function

如果输入范围不包含数字,您可以考虑将输出更改为 double 或返回一些特定信息。但总的来说它有效:

为了让它成为“你的方式”,你应该学习如何将范围转移到数组Array from Range in Excel VBA。这有点棘手。使用单行范围,尝试这样:

Public Function Test1(Parm1 As Variant) As Integer

    Dim i           As Long
    Dim j           As Long
    Dim tmparray    As Variant

    tmparray = Parm1

    For j = 1 To 3
        i = i + Parm1(1, j)
    Next

    Test1 = i

End Function

【讨论】:

感谢您的回答。求和只是一个例子。我一直在处理 UDF 中的数组输入,这是 Excel 中数组公式的输出,作为输入传递给此 UDF。 你的意思是 'i = i + tmparray(1, j)' 因为 Parm1 已经分配给 tmparray?当从 Excel 中作为数组公式调用时,它仍然返回 #VALUE!。

以上是关于如何将 Excel 数组公式传递给 VBA UDF?的主要内容,如果未能解决你的问题,请参考以下文章

从工作表将二维数组传递给 VBA/UDF 函数

Excel VBA - 确定数组 UDF 的列或行目标

如何使用 Excel 的数组公式为 UDF 正确读取每个单元格?

Excel VBA:通过突出显示颜色重新计算UDF总和

VBA Excel UDF保留原始值

从 Excel 与 VBA 调用时,VBA UDF 给出不同的答案