0

我正在尝试通过在 DropButtonClick 函数中进行填充来根据需要填充组合框。举个简单的例子:

Private Sub cmbAdvisor_DropButtonClick()
    cmbAdvisor.Clear

    cmbAdvisor.AddItem ("Test1")
    cmbAdvisor.AddItem ("Test2")
End Sub

这工作正常,值显示在下拉列表中。但是,当我单击其中一个时,下拉列表消失,组合框现在不显示任何内容/空白。我希望它能够显示我选择的项目。我猜问题是我在这个函数内部做一个 Clear - 但我还能怎么做呢?

4

2 回答 2

1

我建议不要使用该DropButtonClick事件。这是另一种选择(方式1),但如果您仍想使用DropButtonClick,请参阅方式2

方式一

您可以在UserForm_Initialize()或按钮单击事件中填充组合框。例如

Private Sub UserForm_Initialize()
    cmbAdvisor.AddItem ("Test1")
    cmbAdvisor.AddItem ("Test2")
End Sub

或者

Private Sub CommandButton1_Click()
    cmbAdvisor.Clear
    cmbAdvisor.AddItem ("Test1")
    cmbAdvisor.AddItem ("Test2")
End Sub

方式二

如果您仍想填充组合框,请DropButtonClick使用它

Private Sub cmbAdvisor_DropButtonClick()
    Dim prevPos As Long
    '~~> Get the position of current selection
    prevPos = cmbAdvisor.ListIndex
    
    '~~> Switch off event so that when we select an
    '~~> item, it doesn't run this proc again
    Application.EnableEvents = False
    
    cmbAdvisor.Clear
    cmbAdvisor.AddItem ("Test1")
    cmbAdvisor.AddItem ("Test2")
    
    '~~> Set the selected value
    cmbAdvisor.ListIndex = prevPos
    
    '~~> Reset events
    Application.EnableEvents = True
End Sub

在行动

在此处输入图像描述

于 2020-11-10T06:22:34.480 回答
0

对于嵌入工作表的 ActiveX 控件:

activeX 组合框处理项目选择上的单击事件,就好像它是一个实际的 dropbuttonclick - 这意味着我们需要一个状态对象。

Dim dropbuttonclicked As Boolean

Private Sub ComboBox1_DropButtonClick()
  dropbuttonclicked = Not dropbuttonclicked
  If dropbuttonclicked = True Then
    ComboBox1.Clear
    ComboBox1.AddItem ("Test1")
    ComboBox1.AddItem ("Test2")
  End If
End Sub

对于 VBA 用户窗体上的 VBA 组合框,您可能希望Enter改用:

Private Sub cmbAdvisor_Enter()
    cmbAdvisor.Clear
    cmbAdvisor.AddItem ("Test1")
    cmbAdvisor.AddItem ("Test2")
End Sub
于 2012-08-22T02:16:42.440 回答