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

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

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

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

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

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

Цитата
sokol92 написал:
и грозим страшными карами...
И придумывать кары пострашней
 
Цитата
Jack Famous написал:
ВСЯ ли цепочка пересчитается (при отключении автопересчёта, разумеется)???
Не уверен на сегодня, но я б сказал нет, не должно.
По вопросам из тем форума, личку не читаю.
 
Цитата
sokol92 написал:
Например, перед сохранением (закрытием) включаем автоматический пересчет, если он выключен,
Тут тоже есть вопрос. А вдруг он был выключен специально? Так что правильнее всего перед отключением запоминать статус и возвращять его именно самим макросом.
По вопросам из тем форума, личку не читаю.
 
БМВ, надо проверять - иначе какой смысл пересчитывать область, если результат не актуален…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
иначе какой смысл пересчитывать область, если результат не актуален…
все зависит от области. Например если вы в область вставили формулы, и их результат нужен для продолжения работы макроса, то пересчет этой области даст результат. Если данные, и известна зависимост от них, то пересчет этих зависимых областей также поможет.  Это уже разработчик должен решить. Как уже писал - мне тогда помогло  и сильно, но за эти года и процессор стал побыстрее :-) да и эксель пооптимальнее .
Изменено: БМВ - 13.03.2018 00:00:30
По вопросам из тем форума, личку не читаю.
 
БМВ, если руки дойдут, то отпишусь)) спасибо вам!
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, не спалось, проверил , пересчитывает только указаную область, зависимочть не отслеживается.
Изменено: БМВ - 13.03.2018 07:22:09
По вопросам из тем форума, личку не читаю.
 
Привет!
Скрытый текст
Изменено: Inexsu - 13.03.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.03.2018 10:28:23
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1 2 След.
Наверх