【问题标题】:How to get VBA Subroutine to call a function that passes an array to another function within the subroutine如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数
【发布时间】: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 语法中缺少一些微妙的东西,但我还没有看到这样的例子。任何见解将不胜感激。

【问题讨论】:

    标签: arrays vba syntax sanity-check


    【解决方案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 关键字。

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 2013-12-24
      • 1970-01-01
      • 2018-01-15
      • 2015-03-31
      相关资源
      最近更新 更多