Страницы: 1 2 След.
RSS
VBA. Контроль работы обработчиков событий
 
привет всем.
ситуация:
в одном из макросов может быть выполнена команда Application.EnavleEvents=False, отключающая обработчики событий, а "обратная" ей команда Application.EnavleEvents=True - не выполнена.
обработчики отключаются для всех событий во всех файлах (и во вновь открываемых в текущем сеансе работы приложения - тоже)
иногда - это очень критично.
то, что обработчики "вырубились", можно узнать слишком поздно - когда данные будут либо непоправимо искажены, либо испорчены так, что восстанавливать придётся долго и с песнями.

проблема: мне это не нравится.
вопрос: как победить?
Изменено: ikki - 28.03.2014 21:02:32
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Саша, победить только внимательностью при написании кода. Добавлять включение событий во все обработчики ошибок, при любом досрочном выходе из процедуры и т.д.
Изменено: KuklP - 27.12.2012 12:55:56
Я сам - дурнее всякого примера! ...
 
это понятно.
но.
бывают:
1) чужие файлы с макросами;
2) чужие надстройки
в том числе - в закрытым кодом.
да и просто лазить в чужом коде - как-то некомильфо.

хотелось более общего способа
Изменено: ikki - 27.12.2012 13:09:13
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Ну напиши простой макрос, к-рый бы включал события принудительно и повесь его на кнопку на панели:-)
Я сам - дурнее всякого примера! ...
 
и жмакать эту кнопку каждые пять секунд?
до этого я и сам додумался.
плохой выход.
Изменено: ikki - 27.12.2012 13:16:05
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Можешь закциклить его через ontime:-)
Я сам - дурнее всякого примера! ...
 
Цитата
Можешь закциклить его через ontime:-)
гм...
нет.
не пойдёт.
есть ситуации, когда обработчики должны быть отключены.
какое-то время.
но потом обязательно включены.
и в моём файле, и в чужих.

ontime может врубить в самый неподходящий момент.

должно быть что-то, какой-то способ... проблема не такая уж уникальная, имхо.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
:) Написать макрос, который будет проверять наличие в коде строки Application.EnavleEvents=False
и в случае её наличия проверит - а есть ли закрывающая строка? Гы.
 
Цитата
Юрий М пишет:
макрос, который будет проверять наличие в коде
Цитата
ikki пишет:
1) чужие файлы с макросами;
2) чужие надстройки
в том числе - в закрытым кодом.
очевидно - не вариант :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Юр, закрывающая строка может быть, а перед ней досрочный выход из процедуры.
Я сам - дурнее всякого примера! ...
 
Саш, ну других вариантов не будет. Либо код пишется грамотно, либо миримся с последствиями.
Я сам - дурнее всякого примера! ...
 
мелькнула мысль...
и пропала.
ушёл искать.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
KuklP пишет:
Юр, закрывающая строка может быть, а перед ней досрочный выход из процедуры.
Да я шучу, конечно...
 
Да я понял. Но в каждой шутке есть доля шутки:-)
Я сам - дурнее всякого примера! ...
 
Цитата
Да я понял.
а я и не понял  :(
убогое мышление у меня.
однозадачный режим работы - мозг либо задачу решает, либо на юмористическом фронте трудится.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Не плачь, утро вечера мудренее:-)
Я сам - дурнее всякого примера! ...
 
Цитата
ikki пишет: ушёл искать.
сыскалась таки
правда, оказалась сыроватой на ощупь, но... уж какая есть  :)  

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

пока так:
будем исходить из предположения, что надстройки пишутся людьми аккуратными и такого "хулиганства" после работы надстроек возникать не должно. да, немного шаткое предположение, но думать о другом пока не хочется.
остается проблема чужих (да и своих, но неаккуратно написанных) макросов, которые могут сработать в других файлах (в т.ч. незаметно - по событиям) и оставить после себя такую бяку.

делаем вот что:
1) при обработке события workbook_deactivate нашего супер-пупер-мега-проекта переключаемся на отдельный лист, остальные "очень" скрываем.
2) на этом листе большими красными буквами написано: "произошёл ая-я-яй, для исправления нажмите кнопку" и кнопка рядом
3) кнопка вызывает макрос
4) макрос включает обработчики и активирует лист, который был активным перед переключением между файлами.

что скажете?

некоторый изврат в таком "решении" присутствует, да и 100%-ной гарантии оно не даёт.
но принять за рабочую гипотезу можно.
и думаем дальше.
Изменено: ikki - 28.03.2014 21:03:44
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Александр, вопрос по поводу предложенного Вами варианта: если сработало отключение событий (Application.EnavleEvents=False), как обработается событие workbook_deactivate?
 
никак.
deactivate должен отрабатывать до переключения на чужие, "потенциально опасные" книги/макросы.
а то, что чужой "неправильный" макрос способен перехватывать и обрабатывать, в т.ч. некорректно, события в моей книге - я об этом, увы, знаю.

говорю же - не 100%. :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Ну а при активации этой книги если срабатывают события, то автоматом переключаемся где были ранее. Кажется вполне рабочий вариант может получиться.
 
Вот такой можно вариант без вмешательства пользователя (исходим из того, что неприятности могут произойти только в "чужих" книгах):
1. При обработке события workbook_activate опускается "флаг ухода".
2. При обработке события workbook_deactivate "флаг ухода" поднимается и одновременно зацикливается (с интервалом например в 1 сек) макрос, проверяющий, является ли активная книга "супер-пупер-мега-проектом" и опущен ли уже флаг. Если выполнено первое условие, но не выполнено второе, значит, события были отключены сторонним макросом. В этом случае события принудительно включаются, флаг опускается и запуск по расписанию отменяется. При выполнении обоих условий просто отменяется запланированный запуск.
 
Цитата
Влад пишет:
Вот такой можно вариант
оч-чень неплохой вариант, да.
спасибо, Влад - будем подумать/попробовать.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
Влад пишет: и одновременно зацикливается (с интервалом например в 1 сек
давайте теперь все зациклим  :D  А если события изначально отключены?  :)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
кстати, такой вариант можно и допилить.
чтобы уж тогда и обработчики событий, "сбитые" чужими макросами даже без переключения книг, восстанавливались.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
nerv пишет:А если события изначально отключены?
это как? зачем? хто позволил?  :evil:
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
легко и просто: до работы с файлом пользователь "игрался" с чем-нибудь и отключил события
Изменено: nerv - 27.12.2012 17:09:27
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
не. ничего страшного.
"супер-пупер-... и т.д." при отключенных событиях просто-напросто отобразит один стартовый листочек и ненавязчиво посоветует сменить уровень безопасности макросов.
единственное - надо будет подправить текст сообщения.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Название темы...
Цитата
проблема:
мне это не нравится.

вопрос:
как победить?
Ответ:
Автор предложит более внятное  (развернутое) название.
 
Цитата
vikttur пишет:
Автор предложит более внятное(развернутое) название.
признаю свою вину - меру, степень, глубину. и прошу меня отправить на ближайшую войну...

эээ...
"VBA. Контроль работы обработчиков событий" ?
Изменено: ikki - 29.12.2012 06:17:21
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
А что если запустить новый процесс EXCEL.EXE?
EnableEvents в одном процессе Excel.exe не влияет на другой Excel.exe. :)
There is no knowledge that is not power
Страницы: 1 2 След.
Наверх