如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数
Posted
技术标签:
【中文标题】如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数【英文标题】:How to get VBA Subroutine to call a function that passes an array to another function within the subroutine 【发布时间】:2012-12-13 20:35:49 【问题描述】:我试图让我的 VBA 子例程运行一个函数,该函数创建一个数组,然后将该数组传递给另一个函数,该函数进一步处理这些数组项。我制作了一个非常简单的示例,其功能与我的实际代码完全相同。如下:
Sub SubRoutine()
ProcessArray CreateArray
End Sub
Function ProcessArray(Arr() As Variant) As Variant
End Function
Function CreateArray() As Variant
Dim Array1(1 To 4) As Variant
CreateArray = Array1
End Function
只是这两个函数和调用这两个函数的子程序。编译器拒绝编译我的代码并向我解释:
编译错误:
类型不匹配:需要数组或用户定义的类型
我只能说一切都是相同的数据类型,传递的参数确实是一个数组。以防万一您想知道,是的,我尝试过使用已分配数据的数组。
我知道我在 VBA 语法中缺少一些微妙的东西,但我还没有看到这样的例子。任何见解将不胜感激。
【问题讨论】:
【参考方案1】:更改此行:Function ProcessArray(Arr() As Variant) As Variant
到这里:Function ProcessArray(Arr As Variant) As Variant
这样,您的函数现在将接受包含数组的变体,而不是寻找变体数组。正如你所说,一个微妙但重要的区别。
【讨论】:
丹尼尔,如果我是小鸡,我会生下你的孩子。这让我发疯了。 让函数返回字符串数组而不会产生类型不匹配错误的任何技巧(如下示例): Function CreateArray() As String() Dim Array1(1 To 4) As String CreateArray = Array1 结束函数 @user1902208。那 sn-p 不会返回错误。您只需将其称为dim x() as string: x = CreateArray
。【参考方案2】:
我认为仍然没有回答的原因是
1。 MySub(MyArg)
工作得很好,但是
2。 MyOtherSub(MyArg1, MyArg2)
没有
This blog entry explains it well.
本质上,您可以将通常为 byref 的参数作为 byval 传递:
Call MySub(Arg1, (Arg2)) 'Arg1 is passed byref, Arg2 is passed byval
代码 #1。之所以有效,是因为 VBA 认为您正在传递一个参数 byVal,因此它不会算作在没有 Call
关键字的 Sub
调用中使用的括号。如其他答案中所述,在没有 Call
关键字的 Sub
调用中不允许使用括号。
Call
关键字需要括号中的参数。因此,Call
关键字 Call MySub(MyArg)
实际上会通过 MyArg
byRef 因为括号用作参数的外壳。
代码 #2 不起作用,因为没有有效的方法来证明语法中的括号(它只允许使用 Call
关键字。
【讨论】:
以上是关于如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数的主要内容,如果未能解决你的问题,请参考以下文章