Excel UserForm动态TextBox控件退出事件

时间:2019-04-18 01:30:43

标签: excel vba events userform

更新:在对象浏览器中进行了进一步的研究……似乎MSForms.TextBox既未实现.Name属性也未实现_Exit事件-仅实现{ {1}}个事件。有没有办法确定哪个特定的_Change产生了变更事件?

或者可以将TextBox与这种技术一起使用吗? MSForms.Control对象实现Control属性和.Name事件。


您可以收听TextBox退出事件吗?类似于普通TextBox事件如何工作?例如

_Exit

以下内容未捕获退出事件。而且,虽然我可以在本地窗口中看到为MyTextBox生成事件的TextBox的.Name属性,但我无法访问该信息来确定要对哪个标签进行操作。

该类技术改编自this postthis post,它们捕获了更改事件。

clsTextBox类:

  Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        'Update a certain label based on the value of the TextBox
  End Sub

我有一系列动态创建的需要监听器的控件。代码如下:

Private WithEvents MyTextBox As MSForms.TextBox

Public Property Set Control(tb As MSForms.TextBox)
    Set MyTextBox = tb
End Property

' Want to handle this event, but it's not caught when exiting the TextBox control
Private Sub MyTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    'Debug.Print me.Control.name
    'Update a certain label based on the value of the TextBox
    Stop
End Sub

' Catching this event but can't identify the control which triggered it
Private Sub MyTextBox_Change()
    Debug.Print MyTextBox.Value ' <--- This prints the correct value
    Debug.Print Me.Control.Name ' <--- ERROR here on any variation of Me or MyTextBox
    'Update a certain label based on the value of the TextBox
    Stop
End Sub

2 个答案:

答案 0 :(得分:1)

MSForms.Control定义了EnterExit事件:如果需要处理TextBox.Change,则需要两个WithEvents变量:

Private WithEvents TextBoxEvents As MSForms.TextBox
Private WithEvents ControlEvents As MSForms.Control

Public Property Set Control(ByVal tb As Object)
    Set TextBoxEvents = tb
    Set ControlEvents = tb
End Property

MSForms.Control也是您访问诸如NameTopLeftVisible等属性的界面。

提示:切勿手动键入事件处理程序过程签名。从代码窗格左上角的下拉菜单中选择源接口,然后从右上角的下拉菜单中选择一个要处理的事件。让VBE生成具有正确签名的成员。如果您正在处理程序过程中,并且左上角的下拉菜单中显示“(常规)”,则说明您不在事件处理程序中。


编辑

虽然上面的代码可以正常编译,并且MSForms.Control接口可以公开我们想要处理的事件...

?TypeOf tb Is MSForms.Control
True
?TypeOf tb Is MSForms.TextBox
True

...幕后有一些COM黑客活动; VBA有足够的烟雾和镜像可以成功地编译上述内容,但是,基本上,您正在看《黑客帝国》中的故障(Rubberduck的解析器在MSForms控件中存在类似的“ nope”问题):没有任何明显的方法可以获取VBA将动态控制对象绑定到其MSForms.Control事件。

答案 1 :(得分:1)

借助ConnectToConnectionPoint API,您可以捕获每个控件的事件(每个事件,以及Enter和Exit)。

在这里看看:Trigger Enter field behaviour through class for a control

退出将是

<link rel="stylesheet" href="{{ URL::to('css/styles.css') }}">