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

时间:2017-11-17 11:40:27

标签: arrays excel-vba vba excel

我已经查看了类似的解决方案here,但不知怎的,我仍然无法使我的代码工作。

我想将一个数组公式的输出作为输入传递给UDF,处理它并从中返回一个值。假设只是添加数组中的所有项并返回值作为示例。我的主要问题是如何将Array Formula的输出传递给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

有人可以帮助我吗?

1 个答案:

答案 0 :(得分: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或返回一些特定信息。但总的来说它有效:

enter image description here

为了使其成为“你的方式”,你应该学习如何将范围转移到数组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