如何让VBA子例程调用将数组传递给子例程中的另一个函数的函数

时间:2012-12-13 20:35:49

标签: arrays vba syntax sanity-check

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

2 个答案:

答案 0 :(得分:4)

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

这样,您的函数现在将接受包含数组的Variant,而不是查找Variants数组。正如你所说,一个微妙但重要的区别。

答案 1 :(得分:0)

我认为还没有回答的是为什么
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所以它不算作Sub调用中没有Call关键字的括号。如其他答案所述,Sub来电时,如果没有Call关键字,则不允许使用括号。

Call关键字在括号中需要Params。因此Call关键字Call MySub(MyArg)实际上会传递MyArg byRef,因为括号被用作参数的附件。

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