Страницы: 1
RSS
Как обнулить (не отключить) накопленные события книги
 
Доброго времени суток, Планетяне!

Есть книга, в которой я хочу на событие книги Пересчёт листа (Private Sub Workbook_SheetCalculate) повесить запуск своего макроса.
В этом макросе присутствуют пересчёты книги Application.Calculate и, чтобы они снова не вызывали событие в цикле, я отключаю их с помощью Application.EnableEvents=False. Вроде всё логично…
В тестовом файле «Событие пересчёта» воспроизведённый случай отработал без проблем:
Проблема в том, что в рабочем файле (сюда скинуть не могу) он работает по-другому, а именно, после включения событий обратно (Application.EnableEvents=True), он не просто их (события) включает, но и запускает, тем самым образуя цикл…
Модуль книги с событием
Модуль с аналогами функций листа на макросах (ВПР и СУММЕСЛИ)
Модуль с функциями для заполнения диапазонов листа (FILE_TableFill_All)
Модуль с функциями проверки таблиц (FILE_TableCheck_All)
Пробовал и DoEvents и выход по флагам, как костыль — всё без толку  :(
Есть идеи?
Изменено: Jack Famous - 15.01.2020 16:23:49
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
после включения событий обратно (Application.EnableEvents=True), он не просто их (события) включает, но и запускает,
что-то тут не так. не должно быть такого.
По вопросам из тем форума, личку не читаю.
 
Причина не найдена, но найден вот такой костыль:
Запоминаем время и выходим, если прошло меньше секунды с последнего запуска
Мониторинг (см. скрин) выявил, что в процессе работы макросов события нигде не включаются, зато он ещё целых 7 (!!!) раз пытается запустить событие  8-0

Из выше описанного следует, что моё утверждение
Цитата
Jack Famous в #1: Application.EnableEvents=True не просто включает обработку событий, но и запускает пересчёт, тем самым образуя цикл
не верно и проблема где-то ещё…
Изменено: Jack Famous - 15.01.2020 18:07:10
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, Вы проверяете макрос на одном листе изменяя формулу.
Скорее всего в исходном файле у вас 7 и более листов. Формулы, которых пересекаются между собой. Т.е. на листе 1 у вас написано А3(Лист1)=А1(Лист1)+А2(Лист1), на листе 2 у вас написано А5(Лист2)=А3(Лист1)+А4(Лист2). Вы меняете значение в формуле на листе 1. У вас происходит пересчёт на листе 1 >> срабатывает макрос на пересчёт в книге. Макрос отрабатывает всё как положено. Но на листе 2 у вас опять идёт пересчёт формулы так как её данные тянутся с листа 1 и макрос снова срабатывает. Таким образом снова запускается макрос на пересчёт в книге, только вызван он листом 2. У вас по ходу таких листов 7.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
Alemox: Скорее всего в исходном файле у вас 7 и более листов, формулы, которых пересекаются между собой
не в бровь, а в глаз! Браво!  :idea:
Тест показал, что дело именно в этом:
Тест
прервать цикл по всем связанным листам, кроме как костылём типа моего нельзя?
Изменено: Jack Famous - 16.01.2020 09:50:42
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, Алексей, делайте расчет диапазонов по вашему плану, а не пересчитывайте всю книгу. Вы же знаете зависимости, значит и последовательность знаете.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: делайте расчет диапазонов по вашему плану, а не пересчитывайте всю книгу — вы же знаете зависимости
да, но тогда придётся для пересчёта делать кнопки на каждом листе, а я хочу, чтобы пользователь по привычному F9 (на самом деле Alt+2, т.к. пересчёт я всем вынес второй кнопкой на ПБД) всё делал. Просто если раньше это был обычный пересчёт, то теперь к нему добавятся макро-аналоги, но для пользователя ничего не изменится…
Иными словами, мне важно именно калькуляцию перехватить и "дополнить" своими действиями. В принципе, костыль пока вполне устраивает  :)
Изменено: Jack Famous - 16.01.2020 09:57:40
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Что мешает перед выполнением событийной процедуры отключить еще и  автопересчет формул? В конце вернуть.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, ничего не мешает, но у меня и так ручной пересчёт стоит по-умолчанию для всей книги  :D
В модуле книги в #1 как раз видно, что при открытии книги он выставляется…
Изменено: Jack Famous - 16.01.2020 10:02:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
А проверить, пересчет какой книги вызвал событие?
Код
If Not Sh Is sh1 then Exit Sub
 
Цитата
Alec Perle: А проверить, пересчет какой книги вызвал событие?
а чем это лучше моего костыля?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Наверное, тем, что не стоит верить тому, что очередное (ненужное) событие произойдет именно меньше, чем через секунду. Ну мало ли, древняя машинка, параллельно еще видео конвертится, да еще своп невовремя...
А, может, обработку повесить на событие листа (Worksheet_Calculate) (что, по сути, то же что и предложено)?
 
Цитата
Alec Perle: не стоит верить тому, что очередное (ненужное) событие произойдет именно меньше, чем через секунду. Ну мало ли, древняя машинка, параллельно еще видео конвертится, да еще своп невовремя
у меня и всех сотрудников отрабатывает корректно, задержка очень просто настраивается в коде, учёт всяких "мало ли" тут вреден для скорости и удобства — какой смысл мне что-то выдумывать, если все текущие задачи "костыль" прекрасно выполняет?…
Я бы внял ещё, если бы предложенный вариант был не костылём, а более логичным, правильным и простым способом достичь нужного эффекта, но ваш вариант таковым не является (или я что-то не понимаю)…
Цитата
Alec Perle: обработку повесить на событие листа (Worksheet_Calculate) (что, по сути, то же что и предложено)?
событие ЛИСТА сработает только для ЛИСТА, а мне нужно, чтобы нужные мои действия выполнялись в результате обычного пересчёта (по F9 например)
Изменено: Jack Famous - 21.01.2020 09:25:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх