3

我试图让我的 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 语法中缺少一些微妙的东西,但我还没有看到这样的例子。任何见解将不胜感激。

4

2 回答 2

4

将此行更改
Function ProcessArray(Arr() As Variant) As Variant
为:
Function ProcessArray(Arr As Variant) As Variant

这样,您的函数现在将接受包含数组的变体,而不是寻找变体数组。正如你所说,一个微妙但显着的差异。

于 2012-12-13T20:39:55.707 回答
0

我认为仍然没有回答的是为什么
1.MySub(MyArg)
工作得很好,但
2.MyOtherSub(MyArg1, MyArg2)
没有

这篇博文很好地解释了这一点。

本质上,您可以将通常是 byref 的参数作为 byval 传递:
Call MySub(Arg1, (Arg2)) 'Arg1 is passed byref, Arg2 is passed byval

代码 #1。之所以有效,是因为 VBA 认为您正在传递一个参数 byVal,因此它不算作在没有关键字的Sub调用中使用的括号。如其他答案中所述,没有关键字的调用Call中不允许使用括号。SubCall

Call关键字需要括号中的参数。所以 withCall关键字Call MySub(MyArg)实际上会通过MyArgbyRef 因为括号被用作参数的外壳。

代码 #2 不起作用,因为没有有效的方法来证明语法中的括号(它只允许使用Call关键字。

于 2012-12-14T19:16:34.687 回答