VBA: Using WithEvents on UserForms VBA: Using WithEvents on UserForms vba vba

VBA: Using WithEvents on UserForms


You can create an event-sink class that will contain the event-handling code for all of your controls of a particular type.

For example, create the a class called TextBoxEventHandler as follows:

Private WithEvents m_oTextBox as TextBoxPublic Property Set TextBox(ByVal oTextBox as TextBox)    Set m_oTextBox = oTextBoxEnd PropertyPrivate Sub m_oTextBox_Change()    ' Do somethingEnd Sub

Now you need to create & hook up an instance of that class for each control of the appropriate type on your form:

Private m_oCollectionOfEventHandlers As CollectionPrivate 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 oControlEnd Sub

Note that the reason you need to add the event handler instances to a collection is simply to ensure that they remain referenced and thus don't get discarded by the garbage collector before you're finished with them.

Clearly this technique can be extended to deal with other types of control. You could either have separate event handler classes for each type, or you could use a single class that has a member variable (and associated property & event handler) for each of the control types you need to handle.


In that case you have few options, because event handlers cannot be shared in VBA/VB6

Option 1: Use a central handling function which is called from every event handler.

Sub Control1_ChangeEvent()  CommonChangeEvent // Just call the common handler, parameters as neededEnd SubSub Control2_ChangeEvent()  CommonChangeEventEnd Sub...Sub CommonChangeEvent(/* Add necessary parameters */)  //Do the heavy lifting hereEnd Sub

Option 2: Organize your controls in control arrays.

Sub TextBox_ChangeEvent(Index As Integer)  CommonChangeEventEnd SubSub OtherControlType_ChangeEvent(Index As Integer)  CommonChangeEventEnd Sub

Combining both options your total event handler count will shrink considerably and the remaining handlers are just brainless stubs for the one true event handler.