【问题标题】:AddItem not populating options in combo boxAddItem 不填充组合框中的选项
【发布时间】:2020-03-30 19:41:02
【问题描述】:

我有以下表格。我已经按照.AddItem "" 添加了每个项目,但是它们没有填充到用户表单的combobox 中。

(这是在一个单独的模块中引用用户表单)

代码

 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

谢谢!

【问题讨论】:

  • 您在哪里以及如何展示该表格?您正在表单的默认实例 上填充cmbSchool 控件,这可能是也可能不是您正在显示的表单。考虑 Newing 表单并在需要时保留对象/实例 - 并确保在最终调用 .Show 的同一对象上填充控件。
  • 对于它的价值,如果这就是它的全部,那么该代码可能都在表单代码隐藏的 Initialize 处理程序中。

标签: excel vba userform


【解决方案1】:

您的问题是,在 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

推荐读物

【讨论】:

  • 在问题中,OP 说“这是在引用用户表单的单独模块中”。如果是这种情况,他们将需要创建表单的一个实例。我不知道 frmForm 是这样一个实例,还是只是他们重命名的基本 UserForm。
  • 谢谢。您能定义实例的含义吗? frmForm 是用户表单的属性名。
  • @DougGlancy - 你是对的,重读了括号中的最后一句话。明天编辑。
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 2013-05-29
相关资源
最近更新 更多