Какое лучшее событие для использования доступа vba

У меня есть форма с различными вкладками и элементами управления. Есть элементы управления текстовыми полями, и я хочу вызывать подпрограмму при обновлении любого из определенных текстовых полей. Это не относится ко всем текстовым полям, и я хочу передать имя текстового поля, которое было обновлено, в качестве параметра.

До сих пор мне просто приходилось создавать событие 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

Заранее спасибо.

Альтернативным подходом может быть один класс обработчика событий (и, возможно, класс диспетчера обработчиков событий), см. этот ответ

Erik A 23.12.2020 10:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
92
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Создайте процедуру, которую может вызывать каждый элемент управления, и спроектируйте эту процедуру так, чтобы она принимала аргумент. По-прежнему нужен код в событии AfterUpdate каждого элемента управления для вызова общей процедуры и передачи ее собственного имени в качестве значения для аргумента. Если все элементы управления будут в одной форме, то процедура может быть за этой формой. Если вы хотите, чтобы элементы управления из нескольких форм использовали эту процедуру, поместите ее в общий модуль.

Sub MyProc(varD)
'do something with varD
End Sub

Sub MyControl_AfterUpdate()
MyProc("MyControl")
End Sub

это то, что я уже делал, но я делал так много повторяющихся событий afterupdate(), что мне было интересно, есть ли способ сделать это, используя другое событие.

Spencer Barnes 23.12.2020 09:20

Я думал о добавлении альтернативы функции к моему ответу, но Альберт опередил меня, и это отличное объяснение. Рад, что у вас есть рабочее решение.

June7 24.12.2020 09:35
Ответ принят как подходящий

Вы можете сделать это для событий, которые НЕ передают значения.

так что, скажем, перед событием обновления у него есть такая субпрограмма по умолчанию:

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"))

Таким образом, для обычного события щелчка или, скажем, после события обновления элемента управления, приведенное выше позволяет вам выбрать элементы управления оптом, введите имя.

Конечно, вы можете выбрать каждый элемент управления отдельно, а затем ввести вышеперечисленное, но выбор набора элементов управления и ввод в листе свойств, таким образом, применяются ко всем выбранным вами элементам управления.

Таким образом, нет необходимости писать или создавать заглушку кода для каждого элемента управления — вы просто вводите имя функции в окне свойств.

Другие вопросы по теме