Ваша проблема в том, что в модуле кода UserForm вы не должны ссылаться на имя формы по умолчанию (для дальнейших экземпляров этого класса используйте его как синюю черту), но текущий экземпляр объекта он фактически выполняется - например, с помощью префикса управления с квалификатором Me.
.
Это предполагает, что код перемещен в собственный модуль кода формы - обработчик Initialize
было бы неплохо для этого.
Способы заполнения поля со списком UserForm
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) Заполнение с помощью массива
Выбрав этот подход, присвоив массив непосредственно свойству box'es .List
, вы можете сократить код до:
Dim SchoolList As Variant
SchoolList = "Harvard,Northwestern,UCBerkley,Stanford,NYU,UoT,UBC,RMC"
Me.cmbSchool.List = Split(SchoolList, ",")
Редактировать в соответствии с комментарием / 2020-03-30
"Можете ли вы определить, что вы подразумеваете под экземпляром?"
A class - а UserForm представляет только особый тип модулей класса - может рассматриваться как sort o f шаблон объекта .
Так называемый экземпляр объекта класса (на основе всех свойств, методов и событий, предоставляемых классом UserForm |) будет создан во время выполнения в виде объекта ► New
с доступом на "." свойства, то есть он получает '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
Рекомендуемые значения