【问题标题】:Populating ComboBox questions - duplicated values each time the box is selected, and named range does not populate填充 ComboBox 问题 - 每次选择框时重复值,并且命名范围不填充
【发布时间】:2016-12-15 17:59:59
【问题描述】:

我是 VBA 和 StackOverflow 的新手,所以对于任何错误,我提前道歉。

我有一个用户窗体,最终将有 16 个组合框。所有 16 个 ComboBox 都将具有相同的 5 个调查响应选项)。

我的第一次尝试是像这样填充它们,为每个 ComboBox 重复 16 次:

Private Sub cboAE1A_DropButtonClick()
   'Populate control.
   Me.cboAE1A.AddItem "Strongly disagree"
   Me.cboAE1A.AddItem "Disagree"
   Me.cboAE1A.AddItem "Neither agree nor disagree"
   Me.cboAE1A.AddItem "Agree"
   Me.cboAE1A.AddItem "Strongly agree"
End Sub

但是,当我测试表单时,多次选择 ComboBox 会重复响应选项。所以,如果我点击它,一切都很好。第二次,我看到 3 组响应选项,依此类推。这是为什么?我能做些什么来预防它?

其次,为了避免重复上述代码 16 次,我找到了这个 link 并尝试根据我的目的对其进行调整:

Private Sub ufrmGenderTraining_Initialize()
   'Populate AE1A combo box.
   Dim rngRespuestas As Range
   Dim ws As Worksheet
   Set ws = Sheets("INPUTS")
   For Each rngRespuestas In ws.Range("Respuestas")
   Me.cboAE1A.AddItem rngRespuestas.Value
   Next rngRespuestas
End Sub

但是 ComboBox 是空白的。任何想法如何解决它,以及如何用相同的列表有效地填充这 16 个组合框?如果您也可以像我 5 岁一样解释,那将不胜感激!

提前致谢。

【问题讨论】:

  • 好吧,我明白了为什么我的问题的第二部分不起作用!请忽略这一点。仍然很好奇为什么在第一次尝试中,它会为 ComboBox 的每个选择重复响应。
  • cboAE1A_DropButtonClick() 每次单击放置按钮时都会运行,因此它将按照您的要求重新添加每个项目。每个.AddItem 行都应该移动到ufrmGenderTraining_Initialize() 子,因为它只运行一次

标签: excel vba combobox userform named-ranges


【解决方案1】:

在您的第一个示例中,每次单击给定 ComboBox 的下拉按钮时都会触发该事件。因此,当表单加载时,没有可用的选项。当用户第一次单击第一个 ComboBox 的下拉菜单时,会触发该事件并且您的代码会添加 5 个选项。用户选择一个选项并继续。

后来,用户意识到她想更改对第一个问题的回答。她再次单击第一个 ComboBox 的下拉按钮;然后您的代码再次执行,增加了 5 个选项,每个选项都是重复的。

我看到您已将 Initialize 事件代码修复为您想要的;我相信这是比您的第一个更好的选择。但是,如果您希望修改原始代码,请先添加一行检查 ComboBox 的 ListCount 属性。如果 ComboBox 已经填充了响应,这将阻止添加选项。

Private Sub cboAE1A_DropButtonClick() 
'Check for existence of items
If Me.cbo.AE1A.ListCount = 0 Then
    'Populate control. 
    Me.cboAE1A.AddItem "Strongly disagree" 
    Me.cboAE1A.AddItem "Disagree" 
    Me.cboAE1A.AddItem "Neither agree nor disagree" 
    Me.cboAE1A.AddItem "Agree" 
    Me.cboAE1A.AddItem "Strongly agree" 
End If
End Sub

【讨论】:

    【解决方案2】:

    您最初使用的是DropButtonClick 事件。

    这意味着每次点击ComboBox,都会将相同的项目添加到ComboBox列表中。

    因此,当您第一次点击下拉菜单时,它会显示一次,第二次会显示两次,以此类推。

    您还可以通过循环遍历每个组合框并对每个组合框应用相同的选项来编写更少的代码。示例:

    Dim comboItems() As Variant
    Dim ct As Control
    Dim i As Long
    
    comboItems() = Array("Strongly disagree", _
                         "Disagree", _
                         "Neither agree nor disagree", _
                         "Agree", _
                         "Strongly agree")
    
    For Each ct In Me.Controls
    
        If TypeName(ct) = "ComboBox" Then
    
            For i = LBound(comboItems) To UBound(comboItems)
                ct.AddItem comboItems(i)
            Next i
    
        End If
    
    Next ct
    

    确保在用户窗体内的UserForm_Initialize 事件中使用上述代码。

    更新If声明:

    If TypeName(ct) = "ComboBox" And _
       ct.Name <> "cboGender" And _
       ct.Name <> "cboDepartment" Then
    

    【讨论】:

    • 感谢您的帮助!循环运行良好,虽然我忘了提到我有 2 个其他 ComboBoxes 具有不同的选项列表。我如何将那些从循环中排除?它们是 cboGender 和 cboDepartment。
    • 没问题 - 查看更新后的答案(If 语句需要附加条件)
    猜你喜欢
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2019-07-23
    相关资源
    最近更新 更多