привет всем. ситуация: в одном из макросов может быть выполнена команда Application.EnavleEvents=False, отключающая обработчики событий, а "обратная" ей команда Application.EnavleEvents=True - не выполнена. обработчики отключаются для всех событий во всех файлах (и во вновь открываемых в текущем сеансе работы приложения - тоже) иногда - это очень критично. то, что обработчики "вырубились", можно узнать слишком поздно - когда данные будут либо непоправимо искажены, либо испорчены так, что восстанавливать придётся долго и с песнями.
проблема: мне это не нравится. вопрос: как победить?
Саша, победить только внимательностью при написании кода. Добавлять включение событий во все обработчики ошибок, при любом досрочном выходе из процедуры и т.д.
это понятно. но. бывают: 1) чужие файлы с макросами; 2) чужие надстройки в том числе - в закрытым кодом. да и просто лазить в чужом коде - как-то некомильфо.
гм... нет. не пойдёт. есть ситуации, когда обработчики должны быть отключены. какое-то время. но потом обязательно включены. и в моём файле, и в чужих.
ontime может врубить в самый неподходящий момент.
должно быть что-то, какой-то способ... проблема не такая уж уникальная, имхо.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Написать макрос, который будет проверять наличие в коде строки Application.EnavleEvents=False и в случае её наличия проверит - а есть ли закрывающая строка? Гы.
сыскалась таки правда, оказалась сыроватой на ощупь, но... уж какая есть
чуть подробнее о проблеме: имеется файл-приложение. достаточно серьезный и критичный. в нем корректно должны (до)обрабатываться события закрытия книги, изменения в ячейках, переключение между листами и др. вырубить переключение на другие файлы я бы мог, но - нельзя.
пока так: будем исходить из предположения, что надстройки пишутся людьми аккуратными и такого "хулиганства" после работы надстроек возникать не должно. да, немного шаткое предположение, но думать о другом пока не хочется. остается проблема чужих (да и своих, но неаккуратно написанных) макросов, которые могут сработать в других файлах (в т.ч. незаметно - по событиям) и оставить после себя такую бяку.
делаем вот что: 1) при обработке события workbook_deactivate нашего супер-пупер-мега-проекта переключаемся на отдельный лист, остальные "очень" скрываем. 2) на этом листе большими красными буквами написано: "произошёл ая-я-яй, для исправления нажмите кнопку" и кнопка рядом 3) кнопка вызывает макрос 4) макрос включает обработчики и активирует лист, который был активным перед переключением между файлами.
что скажете?
некоторый изврат в таком "решении" присутствует, да и 100%-ной гарантии оно не даёт. но принять за рабочую гипотезу можно. и думаем дальше.
Александр, вопрос по поводу предложенного Вами варианта: если сработало отключение событий (Application.EnavleEvents=False), как обработается событие workbook_deactivate?
никак. deactivate должен отрабатывать до переключения на чужие, "потенциально опасные" книги/макросы. а то, что чужой "неправильный" макрос способен перехватывать и обрабатывать, в т.ч. некорректно, события в моей книге - я об этом, увы, знаю.
говорю же - не 100%.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Вот такой можно вариант без вмешательства пользователя (исходим из того, что неприятности могут произойти только в "чужих" книгах): 1. При обработке события workbook_activate опускается "флаг ухода". 2. При обработке события workbook_deactivate "флаг ухода" поднимается и одновременно зацикливается (с интервалом например в 1 сек) макрос, проверяющий, является ли активная книга "супер-пупер-мега-проектом" и опущен ли уже флаг. Если выполнено первое условие, но не выполнено второе, значит, события были отключены сторонним макросом. В этом случае события принудительно включаются, флаг опускается и запуск по расписанию отменяется. При выполнении обоих условий просто отменяется запланированный запуск.
не. ничего страшного. "супер-пупер-... и т.д." при отключенных событиях просто-напросто отобразит один стартовый листочек и ненавязчиво посоветует сменить уровень безопасности макросов. единственное - надо будет подправить текст сообщения.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг