从模块访问公共变体数组

时间:2014-09-16 16:28:27

标签: arrays vba module vb6 public

假设我在Visual Basic 6项目中有两个文件Form1.frm和Module1.bas。

Form1.frm:

Public myArray As Variant

Private Sub Form_Load()
  ReDim myArray(2)
  Call PopulateArrays
End Sub

Module1.bas:

Public Sub PopulateArrays()
Form1.myArray(0) = Array(1, 2, 3)
Form1.myArray(1) = Array(4, 5, 6)
Form1.myArray(2) = Array(7, 8, 9)
End Sub

问题在于,一旦代码运行,“myArray”#39;仍然是空的。 如果我将PopulateArrays Sub放在主Form1.frm中,则数组会填充。 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以在对象模块中声明某些内容(userforms只是特殊的对象模块),其中一个是数组。如果您已宣布

Public myArray() As Variant

然后你会得到一个编译错误,该错误说得很多并且已经知道了。但是既然你宣称为Variant,那么编译器并没有抱怨,但是这项任务并没有起作用。

一个选项是将Variant数组设为私有并使用属性语句(这是VBA,但对于VB6应该是相同的)。在userform

Private mmyArray() As Variant

Public Property Get myArray() As Variant
    myArray = mmyArray
End Property

Public Property Let myArray(lmyArray As Variant)
    mmyArray = lmyArray
End Property


Private Sub UserForm_Click()

    MsgBox Join(Me.myArray(0), "_")

End Sub

Private Sub UserForm_Initialize()

    ReDim mmyArray(2)
    PopulateArrays

End Sub

在标准模块中

Public Sub PopulateArrays()

    Dim ar(0 To 2) As Variant

    ar(0) = Array(1, 2, 3)

    UserForm1.myArray = ar

End Sub

答案 1 :(得分:0)

我看到你使用了一种解决方法让你的Form1拥有一个公共阵列。但是,我认为更好的解决方案是:(A)将数组移动到模块并公开(B)为它创建accessor/mutator functions

如果您不是同时保留表单的多个实例,那么(A)是最简单的解决方案。

这是我测试的代码(A),
形式:

Private Sub UserForm_Initialize()
    Call PopulateArrays
    Call displayArray
End Sub

Private Sub displayArray()
    Dim v1 As Variant
    Dim s As String

    For Each v1 In myArray
        s = s + Join(v1, ", ") + vbNewLine
    Next v1
    MsgBox s
End Sub

模块:

Dim form1 As UserForm1
Public myArray As Variant

Public Sub start()
    Set form1 = New UserForm1
End Sub

Public Sub PopulateArrays()
    ReDim myArray(2)
    myArray(0) = Array(1, 2, 3)
    myArray(1) = Array(4, 5, 6)
    myArray(2) = Array(7, 8, 9)
End Sub
相关问题