Страницы: 1
RSS
Пересчет книги
 
Всем привет,  
 
Столкнулся с непонятными странностями Excel. Приоритет пересчета книги почему то выше, чем приоритет выполнения событий. Как управлять этим понять не могу. К примеру ожидаю что при активации листа можно отключить автоматический пересчет, но не тут то было - сначала пересчет всей книги и только потом обработка события активации листа.  
Мало того автоматический пересчет книги командой Application.Calculation = xlCalculationManual не хочет выключаться... Шок. Как его победить?  
 
Если кто встречался с подобным неповиновением подскажите где копать?    
 
Владимир.
 
Отключить пересчёт в Auto_open книги.
 
Прочитал не внимательно.
 
В книге много процедур, которые отключают - подключают автопересчет книги.    
В книге есть несколько листов с формулами.    
Лист про который я говорил выше формул не содержит.
 
А если отключать по деактивации?
 
При открытии книги пересчёт отключаем. Меняем значение на листе1 в B1. Формула в B3 не пересчитывается. Очень хорошо!  
Переходим на лист2. Запускаем    
Sub еее()  
MsgBox Sheets("Лист1").Range("B3").Value  
Sheets("Лист1").Range("B1") = 1000  
MsgBox Sheets("Лист1").Range("B3").Value  
End Sub  
Ничего не пересчиттано. Опять очень хорошо!  
Переходим на лист1. Пересчитано!  
Или я не о том?
 
При открытии книги пересчёт отключен в Sub Workbook_Open().  
Off: Очень хорошо! Анекдот.  
Высоко в горах к больному вызвали врача. Пока врач добирался, пациент помер. Врачзаходит в дом. На кровати покойник, вокруг грустные родственники. Врачу нужно сгладить ситуацию, делает умное лицо, спрашивает родственников:  
- Больной перед смертью потел?  
Родственники:  
- Потел, сильно потел!  
Врач:  
- О-о-о-чень хорошо!
 
): Примерно так, сильно потел...  
 
Карен, ну на этом примере пересчет просто не виден. Этот пересчет, о котором я толкую, виден в задержке перед выполнением процедуры обработки событий. Опишу поэтапно - вношу изменение в ячейку, идет пересчет ( команда  Application.Calculation = xlCalculationManual перед этим уже отработала по активации листа) и только затем включается отработчик события Cell_Change.  
Пример делать не стал, потому как не уверен, что повторю такой феномен.
 
Забыл добавить, что при пересчете видна отрисовка листа с данными на котором есть формулы (суммесли и промежуточные итоги)
 
Скирншот
 
Добавлю - ко всему вышесказанному пересчет этой книги выполняется даже при выполнении обработчика событий другой книги.
 
Владимир, Вы мне всегда помогаете и я хотел бы Вам помочь, только не знаю чем : (  
 
Попробую высказать несколько предположений и идей:  
1.Ловить пересчет листов данной книги в модуле книги  
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)  
End Sub  
2. Может пересчитываться ее заставляют какие-либо включенные надстройкидругих параллельно открытых книг? Что-то типа ActiveSheet.Calculate.  
3. Может в модуле класса происходит перехват события WithEvents и опять-таки какой-то макрос приводит к этому  
4. В 2003 офисе в "Сервис", вкладка "Вычисления" поставить "Вручную" и обратить внимание на галочку "пересчет перед сохранением". <-- может оно здесь?)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Спасибо Саша, что откликнулся,  
 
Все что на виду уже пересмотрел  
 
1. Проверил как работают события книги (работают после событий листа, что странно)  
2. удалил для проверки все функции "смещ"  
3. проверил наличие связей и ссылок  
4. надстроек нет  
5. классов нет  
пересчет перед сохранением есть, но какое отношение это имеет к обработке событий?  
 
Это у меня единственный проект где используется микс из штатных формул, UDF и процедур и я давно обратил внимание, что самые невыносимо долгие задержки выполнения процедур выполняются при пересчете формул. Раньше с этим мирился, но вчера вставил процедуру из трех строк на обработку изменения значения на листе и увидел задержку больше секунды. Потому и зацепило, хочу разобраться в причине, но пока понять не могу откуда растут ноги у этого процесса...
Страницы: 1
Наверх