Application.Run 用于宏返回数组

Posted

技术标签:

【中文标题】Application.Run 用于宏返回数组【英文标题】:Application.Run for Macro returning Arrays 【发布时间】:2018-01-17 16:38:56 【问题描述】:

我想从带有“Application.Run”的 xll-addin 在 vba 中调用函数“arrayfun1”

Sub test()
Dim val As Variant
val = Application.Run("arrayfun1", arg1, arg2, ...)
End Sub

这适用于只返回一个输出的函数,但不适用于返回数组的函数。但是,如果我在工作表中将该函数用作 Arrayformula,则它可以工作。但我正在寻找一种程序化的解决方案。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我在 Chip 的网站上找到了这个例子: http://www.cpearson.com/excel/passingandreturningarrays.htm

Sub AAATest()
    Dim Arr() As Long
    Dim N As Long
    Arr = LoadNumbers(Low:=101, High:=110)
    If IsArrayAllocated(Arr:=Arr) = True Then
        For N = LBound(Arr) To UBound(Arr)
           Debug.Print Arr(N)
        Next N
    Else
        ''''''''''''''''''''''''''''''''''''
        ' Code in case Arr is not allocated.
        ''''''''''''''''''''''''''''''''''''
    End If
End Sub

Function LoadNumbers(Low As Long, High As Long) As Long()
    '''''''''''''''''''''''''''''''''''''''
    ' Returns an array of Longs, containing
    ' the numbers from Low to High. The 
    ' number of elements in the returned
    ' array will vary depending on the 
    ' values of Low and High.
    ''''''''''''''''''''''''''''''''''''''''

    '''''''''''''''''''''''''''''''''''''''''
    ' Declare ResultArray as a dynamic array
    ' to be resized based on the values of
    ' Low and High.
    '''''''''''''''''''''''''''''''''''''''''
    Dim ResultArray() As Long
    Dim Ndx As Long
    Dim Val As Long
    '''''''''''''''''''''''''''''''''''''''''
    ' Ensure Low <= High
    '''''''''''''''''''''''''''''''''''''''''
    If Low > High Then
        Exit Function
    End If
    '''''''''''''''''''''''''''''''''''''''''
    ' Resize the array
    '''''''''''''''''''''''''''''''''''''''''
    ReDim ResultArray(1 To (High - Low + 1))
    ''''''''''''''''''''''''''''''''''''''''
    ' Fill the array with values.
    ''''''''''''''''''''''''''''''''''''''''
    Val = Low
    For Ndx = LBound(ResultArray) To UBound(ResultArray)
        ResultArray(Ndx) = Val
        Val = Val + 1
    Next Ndx
    ''''''''''''''''''''''''''''''''''''''''
    ' Return the array.
    ''''''''''''''''''''''''''''''''''''''''
    LoadNumbers = ResultArray()

End Function

【讨论】:

不幸的是,这并不能解决问题。问题是函数本身返回错误。 val = Application.Run("arrayfun1", arg1, arg2, ...) 还给我“#uncalculated”。 我发布的代码只是一个示例,您需要修改代码,您将能够收到一个数组作为结果。 我明白你的建议,但函数在 xll 文件中,所以我只能用Application.Run(...) 运行它,我看不到函数本身。 那么应该修改函数返回一个数组。 该函数在工作表中调用时确实返回一个数组;他在问如何在不使用工作表作为中介的情况下将数组放入 VBA。【参考方案2】:

您可以在 VBA 中使用 Declare Function 语句调用函数(尽管您需要获取一些工具来将参数从 VBA 格式转换为 Excel SDK 格式,反之亦然返回值),或使用ExecuteExcel4MacroEvaluate(尽管这些需要先将所有参数转换为字符串)。

查看此网页: https://fastexcel.wordpress.com/2014/12/13/calling-xlamxllautomation-udfs-from-vba-evaluate-run-or-reference/

还有这个问题: How do I call an xll addin function from vba?

【讨论】:

以上是关于Application.Run 用于宏返回数组的主要内容,如果未能解决你的问题,请参考以下文章

用于数组初始化的 C 宏

有没有办法提供一个宏函数来返回不同类型的值,包括啥?

Application.run 不适用于模块

VBA宏:捕获具有特定字符串的行并返回它

关于宏函数的返回值

用于标量查询的 Doctrine 返回数组数组