Возможно ли в Excel VBA применить какой-либо обработчик события глобального изменения для указанной пользовательской формы для всех текстовых полей и комбинированных списков.
Из-за того, как обработчики событий связаны с источниками событий в VBA, ответ «нет».
Однако ...
Добавьте новый модуль класса в ваш проект, назовите его DynamicTextBox
(у вас может быть другой для DynamicComboBox
).
Option Explicit
Private WithEvents encapsulated As MSForms.TextBox
Public Sub Initialize(ByVal ctrl As MSForms.TextBox)
Set encapsulated = ctrl
End Sub
Private Sub encapsulated_Change()
'handle textbox changed here
End Sub
Теперь в вашей форме есть Collection
из DynamicTextBox
экземпляров класса - вы захотите иметь New
экземпляр для каждого TextBox
, для которого вы хотите обработать событие Change
для.
Option Explicit
Private handlers As VBA.Collection
Private Sub UserForm_Initialize()
Set handlers = New VBA.Collection
Dim ctrl As MSForms.Control
For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.TextBox Then
Dim textBoxHandler As DynamicTextBox
Set textBoxHandler = New DynamicTextBox
textBoxHandler.Initialize ctrl
handlers.Add textBoxHandler
'ElseIf TypeOf ctrl Is MSForms.ComboBox Then
' Dim comboBoxHandler As DynamicComboBox
' Set comboBoxHandler = New DynamicComboBox
' comboBoxHandler.Initialize ctrl
' handlers.Add comboBoxHandler
End If
Next
End Sub
Обратите внимание, что этот метод инкапсуляции элемента управления WithEvents
MSForms в экземпляре класса также может использоваться для обработки событий элементов управления, которые динамически добавляются во время выполнения.
Ключ в том, чтобы держать элементы управления MSForms в области видимости - это то, что делает модуль уровня Collection
.