VBA公共阵列:如何?

Jul*_*ien 9 arrays vba

所以今天的问题让我生气,因为这应该很容易,我找不到答案:

如何在VBA中声明公共数组?我正在使用带有字母A,B,C ......的数组,因为我正在使用Excel单元格,我不想在我创建的每个函数中声明它,对吧?我试图先在网上看一下,然后我读到你必须在另一个模块中声明它,这就是我所做的:

Public colHeader As String
colHeader = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")
Run Code Online (Sandbox Code Playgroud)

但Visual Basic不喜欢它......

那我该怎么办?

非常感谢 :)

编辑:问题更多的是将值赋予数组而不是声明它

Sta*_*nov 7

将数组声明为应用程序中的subs的全局:

Public GlobalArray(10) as String
GlobalArray = Array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L')

Sub DisplayArray()
    Dim i As Integer

    For i = 0 to UBound(GlobalArray, 1)
        MsgBox GlobalArray(i)

    Next i
End Sub
Run Code Online (Sandbox Code Playgroud)

方法2:将数组传递给sub.使用ParamArray.

Sub DisplayArray(Name As String, ParamArray Arr() As Variant)
    Dim i As Integer

    For i = 0 To UBound(Arr())
        MsgBox Name & ": " & Arr(i)
    Next i
End Sub
Run Code Online (Sandbox Code Playgroud)

ParamArray必须是最后一个参数.

  • 我将完全相同的代码复制到 VBA 中进行测试。这样做时我收到编译错误。虽然突出显示要分配的数组中的“A”,但它表示在过程之外不允许这样做。有什么提示吗? (3认同)
  • 示例1的第一行在Access 2007中给出了非常烦人的编译错误. (2认同)
  • 是的,我不知道为什么这个答案是最高票数的,因为它是错误的。您不能修改子数组之外的数组。正如其他答案指出的那样,您应该创建一个修改它的子程序,或者使用“Workbook_Open()”等修改它 (2认同)

Hei*_*nzi 7

您使用了错误的类型。该Array(...)函数返回 a Variant,而不是 a String

因此,在你的模块的声明部分(它不需要是一个不同的模块!),你定义

Public colHeader As Variant
Run Code Online (Sandbox Code Playgroud)

并在程序代码开头的某个地方(例如,在Workbook_Open事件中)使用以下命令对其进行初始化

colHeader = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")
Run Code Online (Sandbox Code Playgroud)

另一个(简单的)替代方法是创建一个返回数组的函数,例如

Public Function GetHeaders() As Variant
    GetHeaders = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")
End Function
Run Code Online (Sandbox Code Playgroud)

这样做的优点是不需要初始化全局变量,缺点是每次函数调用都会重新创建数组。