Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 След.
RSS
Быстродействие. Макросы на сервере, Перестали шустро работать макросы с длинными циклами
 
Работаю на сервере по удаленке.
Стоит довольно много макросов производящих монотонные длительные вычисления.
До какого-то момента все было нормально и работу макроса глазом уловить было сложно, от нажатия кнопки до результата проходила милисекунда. Сейчас он может подвисать навечно или просто задумываться на минуту-две.
Системный администратор курит форумы вторую неделю. И грешит на дискретный графический адаптер...
Но методом тыка я выяснила, что если отключить автоматический пересчет формул - макрос снова летает.
Ну и, естественно, ночью тоже все летает...
Пытались менять версии офиса на 13 и 10, но это не решает проблему.
На локалке у меня 16 и я таких проблем не испытываю. Все красиво и очень быстро.

Приложила один из ходовых макросов.
Может быть есть столкнувшиеся с этой проблемой....
 
Зачем у вас столько раз один и тот же цикл написан. Засуньте всё в один и макрос в 3 раза меньше будет.
По поводу быстродействия у некоторых пользователей могу посоветовать следующее, из опыта когда столкнулся с такой проблемой.
- Добавить Excel в исключения антивирусника (быстродействие возрастает в несколько раз.
- Проверить свободное место на системном диске, некоторые его забивают до самого не могу.
- Если есть многократное сетевое копирование, то отключить удалённое разностное сжатие.
У вас в макросе присутствую циклы, в которых тупо методом подбора находятся цифры, это не есть правильно. Можно всё равно оптимизировать написав всего одну две формулы, а у вас методом тыка цифры перебираются. Встречал много таких умельцев, которым головой лень формулу с переменными решить и начинают подбирать циклом с шагом тысячным.
Никаких врагов, зато и никаких друзей.
 
Цитата
Татьяна Агафонова написал:
Работаю на сервере по удаленке
+
Цитата
Татьяна Агафонова написал:
Ну и, естественно, ночью тоже все летает
= что кто-то в наглую майнит днем.  :-)  
А если серьезно, то судя по всему это терминальный сервер и просто ресурс занимают прочие пользователи, а те любят запускать браузер который сжирает ресурс и даже не поперхнется.
Цитата
Татьяна Агафонова написал:
И грешит на дискретный графический адаптер...
Ага GRID наверно вымаливает, чтоб майнить было удобнее. Нужно мониторить производительность, что там варит сервер в момент расчета.
Цитата
Татьяна Агафонова написал:
что если отключить автоматический пересчет формул
а вот тут есть где оптимизнуть. В коде много мест, где идет запись в лист, а это как правило вызывает пересчет, не смотрел детально, но уверен, что не по каждому чиху он нужен.
Изменено: БМВ - 12 Мар 2018 20:41:01
 
Alemox, не хочется оправдываться тем, что я специалист совершенно в другой сфере, который просто пытается облегчить свою работу. И я могу понять, почему для вас эти люди "ленивые умельцы", но это не всегда так )
Для меня это правда предел возможностей на данный момент и плод долгого труда, т.е. вы видите уже максимально оптимизированный код исходя из моих возможностей ))), цифры у меня не просто перебираются, все же есть среднее значение, точка отсчета. Я, увы, не могу представить себе формулу, которая будет перебирать какие-то нужные значения... для меня все эти значения кажутся "нужными". Эти цифры - это процент, который нужно вычесть, поэтому в зависимости от самого значения, которое может быть и пять тонн, вычитаемая сумма может оказаться критичной... Естественно я обдумывала как избежать этого перебора, но не нашла другого решения.
За возможные варианты решения проблемы - спасибо.
 
Цитата
БМВ написал:
а вот тут есть где оптимизнуть. В коде много мест, где идет запись в лист, а это как правило вызывает пересчет, не смотрел детально, но уверен, что не по каждому чиху он нужен.
Попробую действовать в этом направлении!

Цитата
Татьяна Агафонова написал:
кто-то в наглую майнит днем
Уже озолотился, видимо, с такими зависаниями )
 
Цитата
Татьяна Агафонова написал:
И я могу понять, почему для вас эти люди "ленивые умельцы", но это не всегда так )
Вы немного не так поняли. Уверен, Alemox, имел в виду непорядочных разработчиков, которые делают не как лучше и эффективнее, а как проще, короче в записи.

Если код ранее работал и продолжает работать нормально "ночью" проблема основная не в нем. Что-то изменилось на сервере. Что? Сказать сложно , от смены нагрузки "соседом" пользователем, до вышедшего обновления windows.
 
Alemox, спасибо за науку! Таких советов по быстродействию ещё не видел  :idea:
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Татьяна Агафонова написал:
если отключить автоматический пересчет формул - макрос снова летает.
Так почему это не сделать в начале макроса, а в конце снова включить (кстати, в приложенном файле формул не видно).
Владимир
 
Как раз зашла написать, что сделала именно это ))
Жалко, что приходится закрывать дырку на обоях картиной, но раз это работает, трудно устоять и не воспользоваться )

В приложенном файле нет формул
Изменено: Татьяна Агафонова - 13 Мар 2018 09:54:23
 
Я бы рекомендовал всегда отключать автоматический пересчет формул в макросах, если для этого нет противопоказаний.
Владимир
 
Цитата
Татьяна Агафонова написал:
Жалко, что приходится закрывать дырку на стене картиной,
Вот тут вы не правы. Это штатный прием, а не заплатка. Сравнить можно только с анекдотом про незаглушенный внедорожник на заправке, пока не заглушил , бак полным не будет :-)
Цитата
sokol92 написал:
если для этого нет противопоказаний.
А если они есть, то всегда можно проуправлять и пересчитать только нужную область Range.calculate. Сейчас уже очень все сильно оптимизировано, но в далеком 96м Excel 95 считал около 5 минут сам и секунд 10-20  (точно не помню) , при запуске расчета областей в нужном порядке.  
Изменено: БМВ - 12 Мар 2018 23:15:33
 
Цитата
sokol92 написал:
Я бы рекомендовал всегда отключать автоматический пересчет формул в макросах, если для этого нет противопоказаний.
Цитата
БМВ написал:
Вот тут вы не правы. Это штатный прием, а не заплатка. Сравнить можно только с анекдотом про незаглушенный внедорожник на заправке, пока не заглушил , бак полным не будет :-)

Моими макросами пользуются еще несколько человек и в случае ошибки они пугаются, жмут кнопку End и предпочитают не говорить мне о случившемся позоре. Т.е. автоматический пересчет у них окажется отключен и ни они, ни я об этом не узнаем )) пока какая-нибудь фура не встанет на границе из-за неверных расчетов
Может быть есть какой-то способ откатывать выполненные изменения в случае ошибки или выполнять какое-то действие в случае ошибки?
Изменено: Татьяна Агафонова - 12 Мар 2018 23:18:17
 
А вот здесь поможет обработка событий книги. Например, перед сохранением (закрытием) включаем автоматический пересчет, если он выключен, и грозим страшными карами...
Владимир
 
Цитата
Татьяна Агафонова написал:
и в случае ошибки
её просто надо обработать и корректно завершить процесс, вернув настройки обратно. Это ни в коем случае не критика вашего решения и подхода.
 
Цитата
БМВ написал:
пересчитать только нужную область
а если я этим методом пересчитаю область A1:A10 (первый лист), формулы в которой ссылаются на область второго листа, формулы в которой ссылаются на область третьего листа (и так далее), то ВСЯ ли цепочка пересчитается (при отключении автопересчёта, разумеется)???
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
БМВ написал:
её просто надо обработать и корректно завершить процесс, вернув настройки обратно
On Error GoTo??
Ок, поняла ) Завтра буду курить Уокенбаха )

Цитата
sokol92 написал:
и грозим страшными карами...
И придумывать кары пострашней
 
Цитата
Jack Famous написал:
ВСЯ ли цепочка пересчитается (при отключении автопересчёта, разумеется)???
Не уверен на сегодня, но я б сказал нет, не должно.
 
Цитата
sokol92 написал:
Например, перед сохранением (закрытием) включаем автоматический пересчет, если он выключен,
Тут тоже есть вопрос. А вдруг он был выключен специально? Так что правильнее всего перед отключением запоминать статус и возвращять его именно самим макросом.
 
БМВ, надо проверять - иначе какой смысл пересчитывать область, если результат не актуален…
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Jack Famous написал:
иначе какой смысл пересчитывать область, если результат не актуален…
все зависит от области. Например если вы в область вставили формулы, и их результат нужен для продолжения работы макроса, то пересчет этой области даст результат. Если данные, и известна зависимост от них, то пересчет этих зависимых областей также поможет.  Это уже разработчик должен решить. Как уже писал - мне тогда помогло  и сильно, но за эти года и процессор стал побыстрее :-) да и эксель пооптимальнее .
Изменено: БМВ - 13 Мар 2018 00:00:30
 
БМВ, если руки дойдут, то отпишусь)) спасибо вам!
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Jack Famous, не спалось, проверил , пересчитывает только указаную область, зависимочть не отслеживается.
Изменено: БМВ - 13 Мар 2018 07:22:09
 
Привет!
Скрытый текст
Изменено: Inexsu - 13 Мар 2018 02:14:06
 
Inexsu, привет! Спасибо! Практически никогда не использую With, потому что не всегда ясно вижу места, где могла бы применить. Чаще всего он появляется у меня из автоматической записи кусочка макроса ) Постараюсь ввести это в норму.

По поводу явного указания родителей объектов - беда, мне всегда кажется, что с помощью Set shtSpec = ActiveWorkbook.ActiveSheet я железно пригвоздила активную на данный момент книгу к этому имени и раз я определила его в начале макроса - за shtSpec закреплен именно лист из которого запущен макрос, что сама переменная статична..., но, получается, что если активная книга или лист поменялась - то и shtSpec будет не найден... Получается, что нет способа короткой записи активного листа? Нужно всегда запихивать имя листа и книги в строковую переменную и обращаться конкретно к этому листу этой книги длинной строкой? Практически во всех моих макросах идет работа с несколькими книгами. Чаще всего - это базы и рабочая спецификация

Спасибо за правки!
 
Татьяна Агафонова, With позволяет не только сократить запись, ведь вместо объекта стоит только точка но и оптимизирует обращение к этому объекту, так как при этой конструкции ссылка на него сформируется один раз.  

касаемо shtSpec - у вас все правильно, определили его и далее работаете с ним, он будет именно тем объектом что при определении.
а вот это shtSpec.Range(Cells(2, 13))  -  значение Cells(2, 13) возьмется с активного листа, скорее всего у вас он не изменен , но лучше это контролировать.

Однако отмечу, что всё это тюнинг, который безусловно положительно повлияет, но не глобально, так как , еще раз скажу, если код работает быстро на тех же мощностях в ночное время, то виноват не он, а внешний фактор.

По оптимизации возможно вам вовсе следует переработать код и перейти от обработки таблицы через области к обработке в масcиве(вах) предварительно загрузив туда все нужные таблицы. Эффект может быть ошеломительным (правда как в плюс, так и в минус :-). Но это только тогда, когда все будет тормозить и на локальном ПК.
 
Цитата
Татьяна Агафонова написал:
With, потому что не всегда ясно вижу места, где могла бы применить
Увидели в коде отсутствие пробелов перед точками = пора применять With  8)

Про родителей: Вот Ваш код понагляднее:
Код
Netto = WorksheetFunction.Sum(Range(Cells(2, 12), Cells(Nrow, 12)))
оба Cells здесь непредсказуемы.
а вот так
Код
        With shtSpec
          Netto = Application.WorksheetFunction.Sum(Range(.Cells(2, 12), .Cells(Nrow, 12)))
        End With
предсказуемы. Для Range в данном случае точка не нужна - он диапазон.
Увидели после скобки Cells без точки - нужно указать лист и книгу.. Тут Вам With и пригодится.
Код
Option Explicit
Наше Всё
 
БМВ, отправила системному администратору наш вчерашний разговор, надеюсь что-то придет в его светлую голову. Пока буду отключать пересчет и включать в конце макроса. Сделала обработку ошибок. Это реальный выход на данный момент.
Массивами, похоже, я смогу заняться на пенсии )))))))) Хватаю по верхам что-то, углубиться нет времени как всегда, не смотря на то, что это приносит очевидное удовольствие.
Подскажите, пожалуйста, как записать значение Application.Calculation чтобы в конце макроса восстановить его в том виде, в котором он стоял у меня до начала макроса?
 
примеров много ,по быстрому так
Код
With Application
    .ScreenUpdating = False
    .EnableEvents = False
    oldCalc = .Calculation
    .Calculation = xlCalculationManual
    .DisplayAlerts = False
End With

' основной код
    
With Application
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = oldCalc
    .DisplayAlerts = True
End With
 
БМВ, спасибо! буду возвращать первоначальное значение, чтоб без сюрпризов
 
Цитата
БМВ написал:
пересчитывает только указанную область
а может оно и правильно, чтобы программист сам понимал, ЧТО ему нужно пересчитать для результата. Чтобы не забывал связи в книге))) спасибо за исследование!  :idea:

Inexsu, БМВ, и снова спасибо за науку!))) почти не использую With, а активирую лист, с которым работаю (при однократном или двухкратном переключении). С нюансами Range(Cells) сам недавно столкнулся и не понимал, откуда ноги растут - пришлось штудировать просторы интернета.

Чем отличается Left от Left$ и для каких функций это поможет?
Про замену "" на vbNullString не слышал))) быстрее, потому что vbNullString - штатная константа и вызывается быстрее?
Изменено: Jack Famous - 13 Мар 2018 10:28:23
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
Страницы: 1 2 След.
Читают тему (гостей: 1)