【问题标题】:ComboBox dropdown only firing every other boxComboBox 下拉菜单只触发每隔一个框
【发布时间】:2016-02-10 18:50:23
【问题描述】:

我在 MS Excel 2010 的用户表单中有一系列组合框。我为每个组合框分配了 _enter 事件,它们调用 .DropDown 以便当我在这些框之间切换时,它们会自动打开下拉窗口。这对第一个很有用,但是当我跳到下一个时,它不起作用。 _enter 事件触发(用 msgbox 测试),但它不会下拉。以下框将下拉,但不是之后的框。如果你向后跳,同样的事情会反过来发生。如果我按制表顺序在它们之间放置虚拟文本框,它们都会下拉。

任何想法如何解决这个问题?

我也尝试使用 KeyUp -> Ascii 9 (tab) 获得相同的结果。

【问题讨论】:

  • 如果您选择第二个组合框的任何值,则第三个组合框将下拉。这不是您的查询的解决方案,而只是建议。

标签: excel vba drop-down-menu combobox


【解决方案1】:

在给出解决方案之前,我将尝试解释为什么会出现这种意外行为。这似乎是由于某些事件竞赛条件造成的。

当某些组合(例如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 处理程序不变。

【讨论】:

  • 谢谢!在使用 ascii 值而不是 vbKeyTab 之前,我曾尝试这样做,但是当我按照您的方式进行操作时,它就起作用了。我想我可能打错了下拉命令。
  • @CaseyHungler 很高兴它有帮助:)。 vbKeyTab 的 ascii 值为 9,我觉得也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多