У меня есть форма с различными вкладками и элементами управления. Есть элементы управления текстовыми полями, и я хочу вызывать подпрограмму при обновлении любого из определенных текстовых полей. Это не относится ко всем текстовым полям, и я хочу передать имя текстового поля, которое было обновлено, в качестве параметра.
До сих пор мне просто приходилось создавать событие Mytxtbox_AfterUpdate()
для каждого из них, но это занимает довольно много времени и эффективно дублирует один и тот же код с небольшими вариациями. Раньше я редко использовал события; есть ли более эффективный способ сделать это в одном событии, которое применимо ко всем из них?
псевдокод;
Private Sub Form_AfterUpdate()
'I have tried the afterupdate event btw
'but it didn't trigger when I entered new text in the text fields
Dim UpdatedControl as Control
'Need to Find out what that control is somehow
If UpdatedControl.ControlType = acTextbox And UpdatedControl.Name Not like "*excludename*" Then
Call MySub(UpdatedControl.Name, 1)
End if
End Sub
Заранее спасибо.
Создайте процедуру, которую может вызывать каждый элемент управления, и спроектируйте эту процедуру так, чтобы она принимала аргумент. По-прежнему нужен код в событии AfterUpdate каждого элемента управления для вызова общей процедуры и передачи ее собственного имени в качестве значения для аргумента. Если все элементы управления будут в одной форме, то процедура может быть за этой формой. Если вы хотите, чтобы элементы управления из нескольких форм использовали эту процедуру, поместите ее в общий модуль.
Sub MyProc(varD)
'do something with varD
End Sub
Sub MyControl_AfterUpdate()
MyProc("MyControl")
End Sub
это то, что я уже делал, но я делал так много повторяющихся событий afterupdate()
, что мне было интересно, есть ли способ сделать это, используя другое событие.
Я думал о добавлении альтернативы функции к моему ответу, но Альберт опередил меня, и это отличное объяснение. Рад, что у вас есть рабочее решение.
Вы можете сделать это для событий, которые НЕ передают значения.
так что, скажем, перед событием обновления у него есть такая субпрограмма по умолчанию:
Private Sub Fax_BeforeUpdate(Cancel As Integer)
End Sub
Так что выше не пройти!
но событие после обновления? Это выглядит так:
Private Sub Fax_AfterUpdate()
End Sub
Итак, скажем, у меня есть эта форма, и я хочу, чтобы событие после обновления для ВСЕХ текстовых полей срабатывало.
Хорошо, перейдите в режим разработки и нажмите, чтобы выделить ВСЕ текстовые поля, для которых вы хотите запустить событие общего кода.
Обратите внимание на формат — вы вводите =MyFunctionName() или, в этом примере, =МоеОбщееПосле()
А код VBA? Это просто должна быть общедоступная функция в модуле кода форм.
Это будет выглядеть так:
Public Function MyCommonAfter()
Debug.Print "global after"
Dim MyControl As Control
Set MyControl = Screen.ActiveControl
Debug.Print "Control name = " & MyControl.Name
Debug.Print "Text of control = " & MyControl.Value
End Function
И вы можете передать значение в функцию, например
=(MyCommonAfter("ABC"))
Таким образом, для обычного события щелчка или, скажем, после события обновления элемента управления, приведенное выше позволяет вам выбрать элементы управления оптом, введите имя.
Конечно, вы можете выбрать каждый элемент управления отдельно, а затем ввести вышеперечисленное, но выбор набора элементов управления и ввод в листе свойств, таким образом, применяются ко всем выбранным вами элементам управления.
Таким образом, нет необходимости писать или создавать заглушку кода для каждого элемента управления — вы просто вводите имя функции в окне свойств.
Альтернативным подходом может быть один класс обработчика событий (и, возможно, класс диспетчера обработчиков событий), см. этот ответ