У меня есть пользовательская форма Word с 60 + элементами управления различного типа. Я хотел бы оценивать форму каждый раз, когда запускается событие control_change, и изменяют включенное состояние кнопки отправки формы. Тем не менее, я действительно не хочу писать и поддерживать 60 в обработчиках событий изменений.
VBA: использование WithEvents в UserForms
Ответ 1
Вы можете создать класс приемника событий, который будет содержать код обработки событий для всех ваших элементов управления определенного типа.
Например, создайте класс с именем TextBoxEventHandler
следующим образом:
Private WithEvents m_oTextBox as TextBox
Public Property Set TextBox(ByVal oTextBox as 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
Обратите внимание, что причина, по которой вам нужно добавить экземпляры обработчика событий в коллекцию, - это просто обеспечить, чтобы они оставались ссылкой и, таким образом, не были отброшены сборщиком мусора, прежде чем вы закончите с ними.
Очевидно, что этот метод может быть расширен, чтобы иметь дело с другими типами контроля. Вы можете иметь отдельные классы обработчиков событий для каждого типа, или вы можете использовать один класс с переменной-членом (и связанным с ним свойством и обработчиком событий) для каждого из типов управления, которые вам нужно обрабатывать.
Ответ 2
В этом случае у вас мало вариантов, потому что обработчики событий не могут использоваться совместно с 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
Объединяя обе опции, ваш общий счетчик обработчиков будет значительно сокращаться, а оставшиеся обработчики будут просто безмозглыми заглушками для одного истинного обработчика событий.