Страницы: 1
RSS
отключение обработки событий в VBA, почему не всегда срабатывает отключение обработки событий в VBA
 
Написал программу учета посещений своего учреждения. В ней форма ввода, в которой несколько раскрывающихся списков, после выбора в каждом из них значения по процедуре xxxxxx_Change (для каждого из списков) производятся некоторые действия. Затем после щелчка по кнопке "Добавить" данные переносятся в лист Excel, выполняющий функцию базы данных и поля ввода списков очищаются (но не сами списки, кроме одного) для ввода данных по новому клиенту. Для того, чтобы при очистке полей ввода не срабатывали события _Change и программа не уходила в бесконечный цикл или debug я в процедуру кнопки "Добавить" ввел такой код:
Private Sub Dobavit_Click()

' выключение перерисовки экрана (устранение мельканий экрана во время выполнения процедуры)
'Application.ScreenUpdating = False
........

' чтобы при очистке списков не срабатывали процедуры Change, отключаем выполнение откликов на события в полях ввода
Application.EnableEvents = False
' очистка полей ввода и раскрывающихся списков
UserForm2.Zal.Text = ""
UserForm2.Lgota.Text = ""
UserForm2.Kategoria.Clear
UserForm2.Terminal.Text = ""
UserForm2.Kolich.Text = ""
UserForm2.Stoim.Text = ""
' блокировка заполнения раскрывающихся списков и кнопки "Добавить" (это чтобы выполнялась определенная последовательность заполнения формы)
UserForm2.Lgota.Enabled = False
UserForm2.Kategoria.Enabled = False
UserForm2.Dobavit.Enabled = False
UserForm2.Terminal.Enabled = False
' включение перерисовки экрана
'Application.ScreenUpdating = True
' возвращаем срабатывание процедур Change
Application.EnableEvents = True
End Sub


Раскрывающийся список Kategoria очищается полностью, в остальных только поля ввода, но суть не в этом. По идее, после включения обработки событий в последней строке процедуры, никакого изменения в полях ввода раскрывающихся списков уже не происходит и поэтому очистка списков не приводит к повторной отработке событий _Change и уходу программы "в даун". Но это в теории. А на практике - один раз запущу программу, начинаю добавлять записи - все работает "как часики". Отойду на час-другой по делам, потом снова пробую ввести несколько пользователей - обработка событий почему-то перестает отключаться и при попытке добавления новой записи программа уходит в "debug". Не могу понять почему - то ли солнце на небосводе сдвинулось, то ли магнитное поле планеты изменилось или ещё что-нибудь?

Может дело в каких-то недокументированных "фишках" VBA for Excel? Помогите пожалуйста.
 
Application.EnableEvents включает / отключает события на уровне приложения Excel и книг Excel
К событиям элементов управления на форме это отношения не имеет.

Для решения проблемы:

1) на уровне формы (первой строкой в коде формы) пишем
Код
Public StopEvents As Boolean


2) в обработчике каждого поля пишем что-то вроде этого:
Код
Private Sub CheckBox_OC_DynamicColumns_Click()
    If StopEvents Then Exit Sub ' выход, если активен режим программного заполнения
    ' далее идёт ранее прописанный вами код
    ' ...
End Sub


3) при заполнении / очистке полей, включаем и отключаем наш StopEvents:
Код
Private Sub Dobavit_Click()

    StopEvents = TRUE ' чтобы поля не срабатывали на изменение
    
    ' очистка полей ввода и раскрывающихся списков
    me.Zal.Text = ""
    me.Lgota.Text = ""
    me.Kategoria.Clear
    me.Terminal.Text = ""
    
    StopEvents = FALSE ' а теперь снова можно срабатывать

End Sub
 
Спасибо, вроде заработало! Век живи, век учись!

Непонятно только, почему старый вариант периодически все-таки срабатывал?
Страницы: 1
Читают тему
Наверх