vba 中 GotFocus 事件的动态处理

Dynamic Handling of GotFocus Event in vba

我有一些 vba 代码可以自动创建一些 ActiveX 组合框。为了处理他们的事件,我用 CComboEvent 对象(我编写的自定义 class,见下文)填充了一个全局集合,每个组合框一个。 CComboEvent 对象应该处理事件。虽然下面代码中的 cbx_Change() 按预期工作,但 cbx_GotFocus() 不会触发。

我觉得我正在监督某事,有人可以帮忙吗?

谢谢

Option Explicit

Public WithEvents Cbx As MSForms.ComboBox

Private Sub Cbx_Change()
    ' TODO: Filter data that is shown in ListFillRange
    ' For now just show that the event fires:
    MsgBox Cbx.Value  ' This works as expected on every key stroke
End Sub

Private Sub Cbx_GotFocus()
    MsgBox "FOCUS!"  ' Never shown
    ' Open the dropdown list
    Cbx.ListFillRange = "A1:A11"
    Cbx.DropDown
End Sub

正确地结束这个问题:Cbx_GotFocus() 从未触发的原因是它在这种情况下确实对 MSForms.ComboBox 不可用。可以这样检查可用事件:

  1. 打开 vba 编辑器 window 上方的左侧下拉列表,然后选择要响应 事件的 class 元素

  2. 打开 vba 编辑器上方的右侧下拉列表 window 查看哪些事件可用

这是一个技巧,您可以在不同场合使用它来检查 vba 中的内置 events/functions。很遗憾我没有马上想到它。我最终最终使用 Cbx_KeyUp()Cbx_DropButtonClick() 的组合来响应该特定项目中的用户交互。