假设我在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中,则数组会填充。 有什么想法吗?
答案 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