您的问题是,在 UserForm 代码模块中,您不应引用 表单的默认名称(将其视为此类的进一步实例的蓝图),但 当前对象实例 它实际上正在运行 - 例如通过使用 Me. 限定符为控件添加前缀。
这确实假设代码被移动到表单自己的代码模块中 - Initialize 处理程序将是一个很好的地方。
填充用户窗体组合框的方法
a) 通过.AddItem 方法填充
With Me.cmbSchool ' don't refer to the form's default instance
.Clear
.AddItem "Harvard"
.AddItem "Northwestern"
.AddItem "UCBerkley"
.AddItem "Stanford"
.AddItem "NYU"
.AddItem "UoT"
.AddItem "UBC"
.AddItem "RMC"
End With
b) 通过数组填充
通过将数组直接分配给盒子的.List 属性来选择这种方法,您可以将代码缩短为:
Dim SchoolList As Variant
SchoolList = "Harvard,Northwestern,UCBerkley,Stanford,NYU,UoT,UBC,RMC"
Me.cmbSchool.List = Split(SchoolList, ",")
因评论而编辑/2020-03-30
“你能定义实例的含义吗?”
一个class——一个UserForm只代表一种特殊类型的类模块——可以看作是一种对象模板。
类对象的一个所谓的instance(基于 UserForm|class 提供的所有属性、方法和事件)
将在运行时创建为具有“.”访问权限的 ►New 对象。 properties ,即它正在 'newed' (可能重复)到您已声明并设置为内存的当前对象。
如果您更喜欢从单独的模块(而不是在表单的 UserForm_Initialize() 处理程序中)调用该过程,您可以“保留对象/实例(只要您需要它)”
通过如下所示的正式对象设置(或者:Dim myFrm As New frmForm)。
标准模块中的示例调用
Sub ShowFormExample()
Dim myFrm As frmForm ' declare myFrm as object type belonging to your form's class
Set myFrm = New frmForm ' set myFrm as new object instance to memory
FillItems myFrm ' << call procedure FillItems
' or integrate code here: Dim .../ SchoolList = ... / myFrm.cmbSchool.List = ...
myfrm.Show ' form's .Show-method; argument equals vbModal by default
End Sub
程序FillItems
Sub FillItems(myFrm As UserForm)
With myFrm
Dim SchoolList As Variant
SchoolList = "Harvard,Northwestern,UCBerkley,Stanford,NYU,UoT,UBC,RMC"
.cmbSchool.List = Split(SchoolList, ",")
End With
End Sub
推荐读物