如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章