填充 ComboBox 问题 - 每次选择框时重复值,并且命名范围不填充

Populating ComboBox questions - duplicated values each time the box is selected, and named range does not populate

我是 VBA 和 Whosebug 的新手,所以对于任何错误,我提前表示歉意。

我有一个最终会有 16 个组合框的用户窗体。所有 16 个组合框都将具有相同的 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

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

提前致谢。

在您的第一个示例中,每次单击给定组合框的下拉按钮时都会触发该事件。因此,当加载表单时,没有可用的选项。当用户第一次单击第一个 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

您最初使用的是 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