ComboBox下拉列表仅每隔一个框触发一次



我在MS Excel 2010中的用户表单中有一系列组合框。我为每个调用.DropDown的对象分配了事件(_E),这样当我在框中进行制表时,它们将自动打开下拉窗口。这对第一个非常有效,但当我切换到下一个时,它就不起作用了。_enter事件会触发(使用msgbox进行测试),但不会下降。下面的盒子会掉下来,但后面的盒子不会掉下来。如果你向后拉,同样的事情也会反过来发生。如果我按选项卡顺序在它们之间放置伪文本框,它们都会下拉。

有什么办法解决这个问题吗?

我还尝试使用KeyUp->Ascii 9(选项卡),结果相同。

在给出解决方案之前,我将尝试解释为什么会出现这种意外行为。这似乎是由于一些赛事的情况。

当某个组合(如ComboBox1)打开(下拉窗口打开),然后使用TAB键导航到另一个组合(例如ComboBox2)时,就会发生这种情况。出现竞争条件是因为在内部,ComboBox1的窗口也会处理按下的键,因此它会导致ComboBox2的窗口立即关闭,因为在同一个UserForm上一次只能打开一个组合。

解决方法是处理KeyUp事件,这是新组合通过TAB导航获得焦点后发生的最后一个事件。

解决方案

对于每个组合,添加以下事件处理程序:

Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyTab Then ComboBox1.DropDown
End Sub
Private Sub ComboBox2_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyTab Then ComboBox2.DropDown
End Sub
' similar handlers for ComboBox3, ComboBox4 etc..

这些处理程序足以满足TAB导航所需的行为。如果您在用鼠标选择组合时想要相同的行为,也可以保持_Enter处理程序的原样。