Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2012, 17:38   #1
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию Стал тормозить макрос

Добрый день, уважаемые форумчане!
После очередного преобразования функционала сократил код в листе и получил:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("D4:D500,E4:E500")) Is Nothing Then Exit Sub
If Target.Column = 4 Then
    If Target.Value > 0 Then
        Call Договор
        Call Спецификация
        Call SendmailTheBat1
        Call Накладная
        Call Счет_фактура
        Call Квитанция
        Call СформироватьДоговор
    End If
    'End If
Else
    If Target.Column = 5 Then
    If Target.Value = 1 Then Cells(Target.row, 25) = DateValue(Now)
    If Target.Value = 2 Then Cells(Target.row, 25) = DateValue(Now)
    If Target.Value = 3 Then Cells(Target.row, 24) = DateValue(Now)
    End If
End If
Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub
Но при этом стал жутко тормозить файл. При любом вводе любой информации в любую ячейку идет пересчет формул, что очень тормозит процесс. Отключать пересчет формул нельзя, потому как они там есть и они должны работать. Имеется условное форматирование всех строк диапазона. Но, опять же, даже если вводится информация в ячейки, не влияющие ни на пересчет формул, ни на условное форматирование, все равно тормоз пересчетом формул. Суть еще в том, что предыдущий код был значительно обширнее и там были задействованы даже не два, а три диапазона, по которым отслеживались изменения с тем же набором формул и УФ, но тормозов не было. Что я тут не учел?
Заранее спасибо!
strannick вне форума Ответить с цитированием
Старый 16.11.2012, 19:59   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

странный код:
Цитата:
Код:
Application.EnableEvents = False
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("D4:D500,E4:E500")) Is Nothing Then Exit Sub
т.е. достаточно изменить несколько ячеек, или любую ячейку кроме D4:D500,E4:E500 - и ваш макрос безвозвратно отключит обработку событий, и событие Worksheet_Change больше не сработает


По теме: без вашего файла со всеми макросами, формулами и УФ - не разобраться
Мы - не телепаты.
EducatedFool вне форума Ответить с цитированием
Старый 16.11.2012, 21:49   #3
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Сделал отдельный файл с этим листом - вообще перестал работать.))))))) Меняешь значению любой ячейки - вываливается. Данные импортируются и вбиваются вручную в диапазон (затенен).
Вложения
Тип файла: rar файл.rar (102.3 Кб, 21 просмотров)
strannick вне форума Ответить с цитированием
Старый 17.11.2012, 08:44   #4
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

Цитата:
Сообщение от strannick Посмотреть сообщение
Сделал отдельный файл с этим листом - вообще перестал работать.))))))) Меняешь значению любой ячейки - вываливается.
мда... неожиданное поведение макроса, написанного с синтаксическими ошибками.

у вас там один If не закрыт.
не говоря уж о том, что ни одной вызываемой процедуры в файле нет.
ikki_pf вне форума Ответить с цитированием
Старый 17.11.2012, 11:10   #5
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от ikki_pf Посмотреть сообщение
у вас там один If не закрыт.
не говоря уж о том, что ни одной вызываемой процедуры в файле нет.
Да, это я при копипасте нужное убрал. Вот:

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("D4:D500,E4:E500")) Is Nothing Then Exit Sub

    If Target.Column = 4 Then
    If Target.Value > 0 Then
        Call Договор
        Call Спецификация
        Call SendmailTheBat1
        Call Накладная
        Call Счет_фактура
        Call Квитанция
        Call СформироватьДоговор
    End If
Else
    If Target.Column = 5 Then
    If Target.Value = 1 Then Cells(Target.row, 25) = DateValue(Now)
    If Target.Value = 2 Then Cells(Target.row, 25) = DateValue(Now)
    If Target.Value = 3 Then Cells(Target.row, 24) = DateValue(Now)
End If
End If
End Sub
При вводе в любую ячейку (не только в контролируемые диапазоны), макрос срабатывает. Суть там простая: если в диапазон D вводится любое значение >0, вызываются перечисленные макросы, если в диапазон Е - проставляются даты.

Последний раз редактировалось strannick; 17.11.2012 в 11:14.
strannick вне форума Ответить с цитированием
Старый 17.11.2012, 11:19   #6
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

формулируйте вопросы понятнее - не будет простыни ответов с вариантами и уточнениями.
макрос Private Sub Worksheet_Change(ByVal Target As Range) и должен срабатывать при изменении любой ячейки.

другое дело - что в начале вашего макроса производятся проверки и, если изменена не одна ячейка или ячейка не в "нужном" диапазоне, то ваш макрос завершает работу.

имхо, всё правильно и нормально (именно в макросе из поста #5).

Последний раз редактировалось ikki_pf; 17.11.2012 в 11:22.
ikki_pf вне форума Ответить с цитированием
Старый 17.11.2012, 12:57   #7
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Так вот и я о том же, что вроде все правильно. Но срабатывает макрос как раз при изменении любой ячейки. Как будто проверки-то и нету.
И подскажите где правильно прописать отключение-включение обработки событий?

Последний раз редактировалось strannick; 17.11.2012 в 13:04.
strannick вне форума Ответить с цитированием
Старый 17.11.2012, 13:29   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

If Target.Column = 5 Then
лишнее - там другого уже и быть не может.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.11.2012, 13:41   #9
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
If Target.Column = 5 Then
лишнее - там другого уже и быть не может.
В принципе да, но суть то не в этом. Перебрал код руками, один хрен. Также срабатывает на изменение абсолютно любой ячейки.
strannick вне форума Ответить с цитированием
Старый 17.11.2012, 13:52   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

У меня в файле всё работает правильно.
Да и Ваш сейчас проверил - в такой версии работает корректно:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Intersect(Target, Range("D4:D500,E4:E500")) Is Nothing Then Exit Sub

    If Target.Column = 4 Then
    If Target.Value > 0 Then
'        Call Договор
'        Call Спецификация
'        Call SendmailTheBat1
'        Call Накладная
'        Call Счет_фактура
'        Call Квитанция
'        Call СформироватьДоговор
    End If
Else
'    If Target.Column = 5 Then
    If Target.Value = 1 Then Cells(Target.row, 25) = DateValue(Now)
    If Target.Value = 2 Then Cells(Target.row, 25) = DateValue(Now)
    If Target.Value = 3 Then Cells(Target.row, 24) = DateValue(Now)

End If
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 17.11.2012 в 13:55.
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какие элементы кода могут тормозить загрузку моего сайта? Pyatachok HTML и CSS 3 08.11.2012 23:05
При многократном использовании VBA-скрипта, он начинает тормозить :( bag Microsoft Office Excel 2 09.04.2010 16:15
Я стал папой Квэнди Свободное общение 43 01.01.2010 21:24
Система начинает тормозить Cotlean Свободное общение 7 28.09.2009 10:41
УРРРААААА!!! Я стал папой !!!! merax Свободное общение 33 28.05.2008 00:51