Страницы: 1
RSS
событие до Worksheet_Change(ByVal Target As Range)
 
помогите пожалуйста!  
 
есть файл с большим кол-вом формул и немаленьким макросом установленным на событие Worksheet_Change. При срабатывании этого макроса идут жуткие тормоза из-за того, что в процессе его работы несколько раз пересчитывается лист, в чём нет необходимости.    
Я решил эту проблему установкой ручного расчёта формул и насильного пересчёта там где это нужно. Постоянно ручной пересчёт я ставить не хочу, поэтому первой строчкой после Worksheet_Change поставил  
 
Application.Calculation =xlCalculationManual  
 
и в конце макроса    
 
Application.Calculation = xlCalculationAutomatic  
 
а теперь вопрос:  
 
почему когда стоит автоматический пересчёт и происходит изменение на листе (например выбор из выпадающего списка) перед запуском Worksheet_Change эксель о чём-то задумывается, как будто пересчитывает лист?  
 
если тот же выбор из выпадающего списка делать когда стоит ручной пересчёт, то перед запуском Worksheet_Change эксель не задумывается  
 
так вот что он делает перед Worksheet_Change? и как ему объяснить что не надо ничего пересчитывать?
 
Подозреваю, что идёт многократное срабатывание...  
Добавьте вначале Application.EnableEvents = False  
А потом верните в True
 
уже добавлено в начало worksheet_change, но проблема в том что он что-то считает до этого события и я не понимаю в рамках какого событич он это делает
 
Поставьте точку останова на первой строке и проследите пошагово...
 
эксель о чём-то задумывается, как будто пересчитывает лист >> Достаточно в модуль листа добавить  обработчик Worksheet_Calculate и поставить точки останова для него и Worksheet_Change - Вы подтвердите Ваше предположение: сначала выполняется пересчёт (утром - деньги), а затем уже - изменение на листе (вечером - стулья)
 
А предупредить пересчёт на листе в ответ на выбор из списка уже по-сложнее  
Можно использовать обработчик Worksheet_SelectionChange для отлавливания выделения ячейки со списком (наличие списка выясняется легко) и в этот момент назначить Worksheet.EnableCalculation = False. После выделения ячейки без списка восстановить Worksheet.EnableCalculation = True
 
Но я не пошёл бы на такие сложные комбинации  
Обработчики трудоёмки в отладке  
Порой приходится установить точку останова в каждой событийной процедуре, чтобы понять, что происходит  
Не всегда понятно, в каких ситуациях они срабатывают
Страницы: 1
Наверх