如何让 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 子例程调用将数组传递给子例程中的另一个函数的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将哈希传递给子例程?

将两个或多个数组传递给 Perl 子例程

将 Word.Document 传递给子例程

在 FORTRAN 子例程中传递不同的变量集

如何在 Perl 子例程中处理已捕获和未捕获的错误?

批处理脚本子例程:传递参数