patriciajlim
patriciajlim

Reputation: 63

AddItem not populating options in combo box

I have the following form. I've added each item as per .AddItem "", however they are not populating in the combobox in the userform.

(This is in a separate module referring to the userform)

ttps://i.sstatic.net/kPIJq.png

Code

 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

Thanks!

Upvotes: 0

Views: 808

Answers (1)

T.M.
T.M.

Reputation: 9948

Your issue is that within the UserForm code module you shouldn't reference the form's default name (think it as a blue print for further instances of this class), but the current object instance it is actually run - e.g. by prefixing controls with the Me. qualifier.

This does assume the code is moved into the form's own code module - the Initialize handler would be a good place for this.

Ways to populate a UserForm Combobox

a) Populating via .AddItem method

    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) Populating via array

Choosing this approach by assigning an array directly to the box'es .List property, you can shorten code to:

    Dim SchoolList As Variant
    SchoolList = "Harvard,Northwestern,UCBerkley,Stanford,NYU,UoT,UBC,RMC"
    Me.cmbSchool.List = Split(SchoolList, ",")


Edit due to comment/2020-03-30

"Can you define what you mean by instance?"

A class - and a UserForm only represents a special type of class modules - can be regarded as sort of object template.

A so called instance of the class object (based on all properties, methods and events provided by the UserForm|class) will be created at runtime as a ►New object with access to the "." properties , i.e. it's getting 'newed' (possibly repeatedly) to the current object you have declared and set to memory.

If you prefer to call the procedure from a separate module (instead in the form's UserForm_Initialize() handler), you could "hold on to the object/instance (as long as you need it)" by formal object setting as shown below (alternatively: Dim myFrm As New frmForm).

Example call in standard module

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

Procedure 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

Recommended readings

Upvotes: 3

Related Questions