我有一个包含60多个不同类型控件的Word用户窗体。 我想在每次触发control_change事件时评估该表单,并更改表单提交按钮的启用状态。然而,我真的不想编写和维护60个onchange事件处理程序。
我有一个包含60多个不同类型控件的Word用户窗体。 我想在每次触发control_change事件时评估该表单,并更改表单提交按钮的启用状态。然而,我真的不想编写和维护60个onchange事件处理程序。
你可以创建一个事件接收器类,该类将包含特定类型的所有控件的事件处理代码。
例如,创建名为TextBoxEventHandler
的类,如下所示:
Private WithEvents m_oTextBox as MSForms.TextBox
Public Property Set TextBox(ByVal oTextBox as MSForms.TextBox)
Set m_oTextBox = oTextBox
End Property
Private Sub m_oTextBox_Change()
' Do something
End Sub
现在你需要为表单上每个适当类型的控件创建并连接该类的一个实例:
Private m_oCollectionOfEventHandlers As Collection
Private Sub UserForm_Initialise()
Set m_oCollectionOfEventHandlers = New Collection
Dim oControl As Control
For Each oControl In Me.Controls
If TypeName(oControl) = "TextBox" Then
Dim oEventHandler As TextBoxEventHandler
Set oEventHandler = New TextBoxEventHandler
Set oEventHandler.TextBox = oControl
m_oCollectionOfEventHandlers.Add oEventHandler
End If
Next oControl
End Sub
请注意,你需要将事件处理程序实例添加到集合中的原因仅是确保它们保持引用状态,因此在使用完它们之前不会被垃圾收集器丢弃。
显然,这种技术可以扩展到处理其他类型的控件。您可以为每种类型单独创建事件处理程序类,也可以使用一个具有成员变量(以及相关属性和事件处理程序)的单个类来处理所需处理的每种控件类型。
在这种情况下,你的选择很少,因为在VBA/VB6中无法共享事件处理程序。
选项1:使用一个中央处理函数,该函数从每个事件处理程序中调用。
Sub Control1_ChangeEvent()
CommonChangeEvent // Just call the common handler, parameters as needed
End Sub
Sub Control2_ChangeEvent()
CommonChangeEvent
End Sub
...
Sub CommonChangeEvent(/* Add necessary parameters */)
//Do the heavy lifting here
End Sub
选项2:将您的控件组织成控件数组。
Sub TextBox_ChangeEvent(Index As Integer)
CommonChangeEvent
End Sub
Sub OtherControlType_ChangeEvent(Index As Integer)
CommonChangeEvent
End Sub
将这两个选项结合起来,您的总事件处理程序数量将大大缩小,剩余的处理程序只是一个真正事件处理程序的无脑桩。
Private WithEvents m_oTextBox As TextBox
时遇到了“对象不会引发自动化事件”的错误。有人有什么想法吗?- 我知道4/12年前的事情现在已经很久了...(使用Office 2016) - casewolfPrivate WithEvents m_oTextBox As MSForms.TextBox
,然后它就可以编译了。 - casewolf