Приветствую форумчан. Суть проблема такова. Макросы значительно медленнее работают на конкретном ноутбуке. Макросы у меня простенькие, выполняется практически мгновенно везде кроме конкретного ноутбука. Попробовал уже много что. Устанавливал разные версии офиса. Конкретно Office LTSC 2021 (6.0.14332.20400, 16.0.14332.20565), Office 365, Office 2019 (16.0.10827.20138). Отключал аппаратное ускорение графики. Макросы лежат в персональной книге макросов, так что решение с включением папки в доверенные расположения не актуальна. У меня английская версия, так что не знаю как это точно называется в русской версии. Ноутбук Huawei Matebook X Pro(2023). Для сравнения. На моем ноутбуке один конкретный макрос выполняется за 30 с. На компьютерах со схожим железом (конкретно i7-7700k и i5-8400) он выполняется мгновенно. У i5-8400 стоит абсолютно такая же версия офиса, поставленная из этого же установочника. Даже на сильно более слабых ноутбуках исполнение макроса занимает секунды 2.
Приветствую форумчан. Суть проблема такова. Макросы значительно медленнее работают на конкретном ноутбуке. Макросы у меня простенькие, выполняется практически мгновенно везде кроме конкретного ноутбука. Попробовал уже много что. Устанавливал разные версии офиса. Конкретно Office LTSC 2021 (6.0.14332.20400, 16.0.14332.20565), Office 365, Office 2019 (16.0.10827.20138). Отключал аппаратное ускорение графики. Макросы лежат в персональной книге макросов, так что решение с включением папки в доверенные расположения не актуальна. У меня английская версия, так что не знаю как это точно называется в русской версии. Ноутбук Huawei Matebook X Pro(2023). Для сравнения. На моем ноутбуке один конкретный макрос выполняется за 30 с. На компьютерах со схожим железом (конкретно i7-7700k и i5-8400) он выполняется мгновенно. У i5-8400 стоит абсолютно такая же версия офиса, поставленная из этого же установочника. Даже на сильно более слабых ноутбуках исполнение макроса занимает секунды 2.vereschetin
igrtsk, Это первым делом сделал. Также вначале пробовал прописывать Application.Calculation = xlCalculationManual. Стало лучше конечно, но настолько большая разница мне не понятна.
igrtsk, Это первым делом сделал. Также вначале пробовал прописывать Application.Calculation = xlCalculationManual. Стало лучше конечно, но настолько большая разница мне не понятна.vereschetin
"Макросы значительно медленнее работают на конкретном ноутбуке" то есть ВСЕ макросы, а не конкретный ... Можно было бы подумать на Celeron, но вроде как там i7 полный. Возможно программное обеспечение, но при установке Офисов должны устанавливаться, при необходимости, разные библиотеки. Какие-нибудь установки BIOS - виртуализация или что-то в этом роде ... Ограничение памяти по частоте или не правильный тайминг. Прогнать тест и сравнить его с опубликованными данными в интернете ...
"Макросы значительно медленнее работают на конкретном ноутбуке" то есть ВСЕ макросы, а не конкретный ... Можно было бы подумать на Celeron, но вроде как там i7 полный. Возможно программное обеспечение, но при установке Офисов должны устанавливаться, при необходимости, разные библиотеки. Какие-нибудь установки BIOS - виртуализация или что-то в этом роде ... Ограничение памяти по частоте или не правильный тайминг. Прогнать тест и сравнить его с опубликованными данными в интернете ...WowGun
Alex_ST, Специально не отключал. Стоит встроенный. Так же как и на других сравниваемых компьютерах. Но при переустановке офисов постоянно отключал антивирус (по понятным причинам), так что думаю были моменты когда антивирус был отключен. Откопал на компьютере установочник Office 2010 и о чудо. В нем все работает нормально.
Alex_ST, Специально не отключал. Стоит встроенный. Так же как и на других сравниваемых компьютерах. Но при переустановке офисов постоянно отключал антивирус (по понятным причинам), так что думаю были моменты когда антивирус был отключен. Откопал на компьютере установочник Office 2010 и о чудо. В нем все работает нормально.vereschetin
Когда выполняется цикл, он начинает резко тормозить в рандомном месте. Один цикл начинает занимать примерно 2 секунды. В таблице 117 строк, начала торможения цикла совершенно не определённое. Обычно в диапазоне 30-40 цикла. Но может и на 60, и на 100 цикле начать тормозить. Один раз даже все циклы без тормозов прошли. Но что примечательно, тормозит равное количество циклов - 16. То есть первые 30-40 циклов проходят нормально, потом ровно 16 циклов тормозит, а затем все остальные циклы выполняются опять с нормльной скоростью.
Немного дополню. С наиболее тормознутым макросом проблема в цикле. Все остальные макросы работают медленнее, но терпимо. Ниже сам цикл:
Когда выполняется цикл, он начинает резко тормозить в рандомном месте. Один цикл начинает занимать примерно 2 секунды. В таблице 117 строк, начала торможения цикла совершенно не определённое. Обычно в диапазоне 30-40 цикла. Но может и на 60, и на 100 цикле начать тормозить. Один раз даже все циклы без тормозов прошли. Но что примечательно, тормозит равное количество циклов - 16. То есть первые 30-40 циклов проходят нормально, потом ровно 16 циклов тормозит, а затем все остальные циклы выполняются опять с нормльной скоростью.vereschetin
Денис
Сообщение отредактировал vereschetin - Понедельник, 09.10.2023, 08:26
Не вижу деклараций модуля листа Вашего файла и объявления переменных... Может быть Вы пишете без декларации Option Explicit и переменные не объявляете? Тогда они при первом использовании принимают значение Variant и могут тормозить. Попробуйте не используя Option Explicit прямо в начале процедуры задать размерность хотя бы переменной цикла intL [vba]
Код
Dim intL As Integer
[/vba] И перед циклом можно на всякий попробовать отключать все тормоза строкой кода:[vba]
Код
With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: .Calculation = xlManual: End With
[/vba]а потом включать строчкой [vba]
Код
With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
[/vba] (у меня самые часто применяемые конструкции VBA просто забиты в список автозамены Punto Switcher, поэтому вводить их - не проблема)
Не вижу деклараций модуля листа Вашего файла и объявления переменных... Может быть Вы пишете без декларации Option Explicit и переменные не объявляете? Тогда они при первом использовании принимают значение Variant и могут тормозить. Попробуйте не используя Option Explicit прямо в начале процедуры задать размерность хотя бы переменной цикла intL [vba]
Код
Dim intL As Integer
[/vba] И перед циклом можно на всякий попробовать отключать все тормоза строкой кода:[vba]
Код
With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: .Calculation = xlManual: End With
[/vba]а потом включать строчкой [vba]
Код
With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: .Calculation = xlAutomatic: End With
[/vba] (у меня самые часто применяемые конструкции VBA просто забиты в список автозамены Punto Switcher, поэтому вводить их - не проблема)Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Понедельник, 09.10.2023, 21:25
Alex_ST, Все переменные объявлены. Проблема то не в коде. Этот же самый макрос работает отлично на этом же компьютере с Office 2010. Отлично работает на всех остальных компьютерах которые я пробовал. С этой же книгой, с этим же макросом. С разными офисами, с разными виндовсами. Пробовал Office 2016 поставить. Та же самая проблема. На 16 циклов подвисает. То есть проблема в конкретном ноутбуке. Я понимаю что может это уже может выходит за рамки темы этого форума, но немного уже отчаялся) В русском интернете такая проблема как-то мне не встретилась, зато в англоязычном очень даже много. Все примерно похоже. Много лет макрос работал прекрасно, потом прилетает обновление Excel 2019 или переходят с Office 2010 на 2019 и макрос резко превращается в тормознутое нечто. Но из всех советов что приводятся, мне ничего не помогло.
Alex_ST, Все переменные объявлены. Проблема то не в коде. Этот же самый макрос работает отлично на этом же компьютере с Office 2010. Отлично работает на всех остальных компьютерах которые я пробовал. С этой же книгой, с этим же макросом. С разными офисами, с разными виндовсами. Пробовал Office 2016 поставить. Та же самая проблема. На 16 циклов подвисает. То есть проблема в конкретном ноутбуке. Я понимаю что может это уже может выходит за рамки темы этого форума, но немного уже отчаялся) В русском интернете такая проблема как-то мне не встретилась, зато в англоязычном очень даже много. Все примерно похоже. Много лет макрос работал прекрасно, потом прилетает обновление Excel 2019 или переходят с Office 2010 на 2019 и макрос резко превращается в тормознутое нечто. Но из всех советов что приводятся, мне ничего не помогло.vereschetin
vereschetin, Personal и надстройки на компах точно одинаковые? Если в Personal или какой-то из надстроек объявлен объект WithEvents App As Application для обработки событий приложения, то Ваше [vba]
[/vba] будет вызывать события листа, которые могут перехватываться обработчиком событий и уводить приложение на исполнение других процедур. Именно для предотвращения ухода на "левые" процедуры я всегда применяю запрет/отмену ВСЕХ возможных тормозов, включая и Application.EnableEvents
vereschetin, Personal и надстройки на компах точно одинаковые? Если в Personal или какой-то из надстроек объявлен объект WithEvents App As Application для обработки событий приложения, то Ваше [vba]
[/vba] будет вызывать события листа, которые могут перехватываться обработчиком событий и уводить приложение на исполнение других процедур. Именно для предотвращения ухода на "левые" процедуры я всегда применяю запрет/отмену ВСЕХ возможных тормозов, включая и Application.EnableEventsAlex_ST
Alex_ST, Personal и надстройки одинаковые. Сейчас там один макрос остался, исследуемый. Все сделал в соответствии с вашей рекомендацией. Результат тот же. Еще немного локализовал проблему. Проблема не в цикле, а в операции копирования. Почему-то именно она тормозит. Причем ровно 16 циклов. Я пробовал и в таблице на 1000 строк этот макрос выполнять. Те же самые 16 циклов по 2 сек, а дальше с обычной скоростью идет цикл вплоть до конца. Заменил операцию копирования на Destination.Value=Source.Value В таком варианте все забегало. Только не понятно почему именно в современных офисах операция копирования вызывает такие торомоза, а в 2010 все нормально. UPD. Также отчасти решает проблему чистка буфера обмена в конце каждого цикла.
Alex_ST, Personal и надстройки одинаковые. Сейчас там один макрос остался, исследуемый. Все сделал в соответствии с вашей рекомендацией. Результат тот же. Еще немного локализовал проблему. Проблема не в цикле, а в операции копирования. Почему-то именно она тормозит. Причем ровно 16 циклов. Я пробовал и в таблице на 1000 строк этот макрос выполнять. Те же самые 16 циклов по 2 сек, а дальше с обычной скоростью идет цикл вплоть до конца. Заменил операцию копирования на Destination.Value=Source.Value В таком варианте все забегало. Только не понятно почему именно в современных офисах операция копирования вызывает такие торомоза, а в 2010 все нормально. UPD. Также отчасти решает проблему чистка буфера обмена в конце каждого цикла.vereschetin
Денис
Сообщение отредактировал vereschetin - Среда, 11.10.2023, 12:34