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 格式,反之亦然返回值),或使用ExecuteExcel4Macro
或 Evaluate
(尽管这些需要先将所有参数转换为字符串)。
查看此网页: 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 用于宏返回数组的主要内容,如果未能解决你的问题,请参考以下文章