【问题标题】:Passing arrays to functions in VBA将数组传递给VBA中的函数
【发布时间】:2016-02-16 17:05:21
【问题描述】:

我有一个接受数组的过程。因此我可以传递一个像这样的数组:

Public Sub MySub (Something as String, ByRef Arr() as Variant)
  'Stuff
End Sub


Public Sub Test()

   Dim Columns() As Variant
   Columns = Array(1, 2, 3, 4, 5, 6)

   MySub "sth", Columns

End Sub

问题是当我想像内联那样做时

MySub "sth", Array(1, 2, 3, 4, 5, 6)

MySub "sth", Cvar(Array(1, 2, 3, 4, 5, 6))

我收到一个编译错误,提示类型不匹配:预期为数组或用户定义类型。

如何将内联数组传递给函数?

【问题讨论】:

  • Array() 函数不返回 Variant() 数组,而是返回子类型 Array 的 Variant,这就是您收到类型不匹配错误的原因。

标签: arrays vba


【解决方案1】:

将数组参数从变体数组更改为仅变体

Public Sub MySub(Something As String, ByRef Arr As Variant)
  'Stuff
End Sub


Public Sub Test()

   Dim Columns() As Variant
   Columns = Array(1, 2, 3, 4, 5, 6)

   MySub "sth", Columns
   MySub "sth", Array(1, 2, 3, 4, 5, 6)
   'both worked in my test
End Sub

【讨论】:

    【解决方案2】:

    我使用 Excel 2013 运行您的 VBA 代码并且没有类型不匹配错误。 例如与子:

    Public Sub MySub(Something As String, ByRef Arr() As Variant)
        For i = 0 To UBound(Arr)
            Debug.Print Arr(i)
            Next i
        End
    End Sub
    

    我在即时窗口中打印出 1、2、3、4、5、6 的数字 (Ctrl + G)

    【讨论】:

    • 如果你只是复制他的第一个代码,它会工作,但如果你像他写的那样内联对 Array 的调用,你会得到一个错误。
    【解决方案3】:

    在调用语句之前使用关键字call,并将所有参数放在括号中,如下所示:

    call MySub ("sth", Cvar(Array(1, 2, 3, 4, 5, 6)))
    

    【讨论】:

      猜你喜欢
      • 2014-11-05
      • 1970-01-01
      • 2014-12-17
      • 2021-04-17
      • 2020-08-19
      • 2016-07-07
      • 2022-11-16
      • 2013-08-13
      • 2020-07-28
      相关资源
      最近更新 更多