AddItem не заполняет параметры в поле со списком - PullRequest
0 голосов
/ 29 марта 2020

У меня есть следующая форма. Я добавил каждый элемент согласно .AddItem "", однако он не заполняется в combobox в пользовательской форме.

(Это отдельный модуль со ссылкой на форму пользователя)

ttps://i.stack.imgur.com/kPIJq.png

Код

 With frmForm

    .txtFirst.Value = ""
    .txtLast.Value = ""
    .txtYear.Value = ""

    .cmbSchool.Clear
    .cmbSchool.AddItem "Harvard"
    .cmbSchool.AddItem "Northwestern"
    .cmbSchool.AddItem "UCBerkley"
    .cmbSchool.AddItem "Stanford"
    .cmbSchool.AddItem "NYU"
    .cmbSchool.AddItem "UoT"
    .cmbSchool.AddItem "UBC"
    .cmbSchool.AddItem "RMC"

    End With

Спасибо!

1 Ответ

3 голосов
/ 29 марта 2020

Ваша проблема в том, что в модуле кода 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

Рекомендуемые значения

...