我花了几天时间试图确定是否使用数组或集合将多个变量从一个用户表单传递到另一个用户表单。经过几天的数组实验,我发现收集可能更容易使用。但是,我一直遇到错误。例如,当我使用以下代码时出现Variable not defined
错误:
Public totalCats As New Collection
' then in a private sub
totalCats.Add(txtTotalCats.Text)
' and in a totally different userform, because that's my main goal with this:
Private Sub UserForm_Activate()
For i = 1 To totalCats.Item(1)
Next
End Sub
我做错了什么来得到这个错误?另外,当我没有收到早期编译错误时,我收到错误91 User-defined type not defined
。
任何人都可以帮助我吗?我真的需要把它放到我可以把东西放在集合中的地方,并且能够从程序中的任何用户窗体调用它。如果您需要更多相关代码,我很乐意发布它。
编辑:由蒂姆威廉姆斯评论部分修复,现在有一个运行时错误读数:Invalid procedure call or argument
它指向的代码行是:
With objLbl
.Caption = Chr(10) & frmCatNames.catNames.Item(i) & " section " & i
End With
当然,With中有其他东西,但我认为我称之为catNames集合的方式就是问题。
答案 0 :(得分:0)
问题源于您未在问题中包含的代码中的其他地方,但是,我可以看到一些常见的内务管理问题以及可能存在的问题。
使用自动实例化声明对象
这是在声明中包含As New语句的时候 Public totalCats As New Collection 这通常是一个坏主意,因为对对象的任何引用,包括检查它是否为Nothing都将导致对象被初始化。因此,在尝试使用它之前,您无法测试它是否已设置。 显式地实例化Collection解决了这个问题
Public totalCats As Collection
'Just before you load the Collection...
Set totalCats = New Collection
For Each nextMember in mObject.Members
With totalCats
.Add nextMember, nextMember.Name
End With
Next nextMember
然后你可以做适当的错误管家,例如
If Not frmCatNames.catNames Is Nothing Then
With objLbl
.Caption = Chr(10) & frmCatNames.catNames.Item(i) & " section " & i
End With
Else
'Handle error...
End If
用户窗体对象中的收集生命周期
在userForm类中声明的Collection在模块重新编译时设置为Nothing。例如,如果在运行时添加了新控件。 如果在状态丢失之前检查Tools \ Options \ General Notify,则VBE会通知您。
UserForm对象生命周期
我不确定frmCatNames是什么,因为缺少该代码,但它应该是您通过在VBE中添加表单模块而创建的Form类的实例。 您还可以自动实例化表单类。例如,如果您有一个名为UserForm1的表单模块,那么您可以使用
调用它的实例UserForm1.Show
但最好像这样明确地实例化它
Dim f As UserForm1
Set f = New UserForm1
f.Show
然后f对象将以您期望frmCatNames的行为方式运行。我无法从你的问题中判断出该对象是什么,但它应该是一个对象,它被输入到你的Form Class Module并实例化。
第二个答案here ......
中有更多细节