Хитрости »
20 Январь 2016 61467 просмотров
Рано или поздно у пишущих на Visual Basic for Applications возникает проблема — код хоть и облегчает жизнь и делает все автоматически, но очень долго. В этой статье я решил собрать несколько простых рекомендаций, которые помогут ускорить работу кода VBA, при этом в некоторых случаях весьма внушительно — в десятки, а то и больше, раз. Основной упор в статье сделан на начинающих, поэтому в начале статьи приводятся самые простые методы оптимизации. Более «глубокие» решения по оптимизации кода приведены в конце статьи, т.к. для применения данных решений необходим достаточный опыт работы в VB и сходу такие методы оптимизации кому-то могут быть непонятны.
- Если в коде есть много всяких Activate и Select, тем более в циклах — следует немедленно от них избавиться. Как это сделать я писал в статье: Select и Activate — зачем нужны и нужны ли?
- Обязательно на время выполнения кода отключить:
- автоматический пересчет формул. Чтобы формулы не пересчитывались при каждой манипуляции на листе во время выполнения кода — это может дико тормозить код, если формул много:
Application.Calculation = xlCalculationManual
Если во время кода все же нужно пересчитывать какие-то диапазоны, то можно пересчитывать только их:
Range("A1:C60").Calculate
- обновление экрана, чтобы действия по изменению значений ячеек и пр. не мелькали. Зачем это надо? Т.к. все эти действия обращаются к графическому процессору и заставляют его трудиться для перерисовки экрана — это может значительно тормозить код:
Application.ScreenUpdating = False
- На всякий случай отключаем отслеживание событий. Нужно для того, чтобы Excel не выполнял никаких событийных процедур, которые могут быть в листе, в котором производятся изменения. Как правило это события изменения ячеек, активации листов и пр.:
Application.EnableEvents = False
- Если книга выводилась на печать или выводится на печать в процессе выполнения кода, то лучше убрать разбиение на печатные страницы.
ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False
если печать производится внутри кода, то эту строку желательно вставить сразу после строки, выводящей лист на печать(при условии, что печать не происходит в цикле. В этом случае — по завершению цикла печати).
Я советую всегда отключать разбиение на страницы, т.к. это может тормозить весьма значительно, т.к. заставляет при любом изменении на листах обращаться к принтеру и переопределять кол-во и размер печатных страниц. А это порой очень не быстро. - На всякий случай можно отключить отображение информации в строке статуса Excel(в каких случаях там вообще отображается информация и зачем можно узнать в статье: Отобразить процесс выполнения). Хоть это и не сильно поедает ресурсы — иногда может все же ускорить работу кода:
Application.StatusBar = False
Главное, что следует помнить — все эти свойства необходимо включить обратно после работы кода. Иначе могут быть проблемы с работой внутри Excel. Например, если забыть включить автопересчет формул — большинство формул будут пересчитывать исключительно принудительным методом — после нажатия сочетания клавиш Shift+F9. А если забыть отключить обновление экрана — то есть шанс заблокировать себе возможность работы на листах и книгах. Хотя по умолчанию свойство ScreenUpdating и должно возвращаться в True, если было отключено внутри процедуры — лучше не надеяться на это и привыкать возвращать все свойства на свои места принудительно. По сути все это сведется к нескольким строкам:
'Возвращаем обновление экрана Application.ScreenUpdating = True 'Возвращаем автопересчет формул Application.Calculation = xlCalculationAutomatic 'Включаем отслеживание событий Application.EnableEvents = True
Как такой код выглядит на практике. Предположим, надо записать в цикле в 10 000 строк значения:
Sub TestOptimize() 'отключаем обновление экрана Application.ScreenUpdating = False 'Отключаем автопересчет формул Application.Calculation = xlCalculationManual 'Отключаем отслеживание событий Application.EnableEvents = False 'Отключаем разбиение на печатные страницы ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False 'Непосредственно код заполнения ячеек Dim lr As Long For lr = 1 To 10000 Cells(lr, 1).Value = lr 'для примера просто пронумеруем строки Next 'Возвращаем обновление экрана Application.ScreenUpdating = True 'Возвращаем автопересчет формул Application.Calculation = xlCalculationAutomatic 'Включаем отслеживание событий Application.EnableEvents = True End Sub
Разрывы печатных страниц можно не возвращать — они тормозят работу в любом случае.
- автоматический пересчет формул. Чтобы формулы не пересчитывались при каждой манипуляции на листе во время выполнения кода — это может дико тормозить код, если формул много:
- Следует избегать циклов, вроде Do While для поиска последней ячейки. Часто такую ошибку совершают начинающие. Куда эффективнее и быстрее вычислять последнюю ячейку на всем листе или в конкретном столбце без этого тормозного цикла Do While. Я обычно использую
lLastRow = Cells(Rows.Count,1).End(xlUp).Row
другие варианты определения последней ячейки я детально описывал в статье: Как определить последнюю ячейку на листе через VBA?
Для более опытных пользователей VBA я приведу несколько решений по оптимизации кодов в различных ситуациях:
- Самая хорошая оптимизация кода, если приходится работать с ячейками листа напрямую, обрабатывать их и, возможно, изменять значения, то быстрее все обработки делать в массиве и разом выгружать на листе. Например, код выше по заполнению ячеек номерами будет в этом случае выглядеть так:
Sub TestOptimize_Array() 'Непосредственно код заполнения ячеек Dim arr, lr As Long 'запоминаем в массив одним махом все значения 10000 строк первого столбца arr = Cells(1, 1).Resize(10000).Value 'если нужно заполнение для двух и более столбцов 'arr = Cells(1, 1).Resize(10000, 2).Value 'или 'arr = Range(Cells(1, 1),Cells(10000, 2)).Value 'или автоматически вычисляем последнюю ячейку и заносим в массив данные, начиная с ячейки А3 'llastr = Cells(Rows.Count, 1).End(xlUp).Row 'последняя ячейка столбца А 'arr = Range(Cells(3, 1),Cells(llastr, 2)).Value For lr = 1 To 10000 arr(lr,1) = lr 'заполняем массив порядковыми номерами Next 'Выгружаем обработанный массив обратно на лист в те же ячейки Cells(1, 1).Resize(10000).Value = arr End Sub
Но здесь следует учитывать и тот момент, что большие массивы могут просто вызвать переполнение памяти. Наиболее актуально это для 32-битных систем, где на VBA и Excel выделяется памяти меньше, чем в 64-битных системах
- Если используете быстрый ЕСЛИ — IIF, то замените его на IF … Then … Else
- Так же лучше вместо Switch() и Choose() применить тот же IF … Then … Else
- В большинстве случаев проверять строку на «не пусто» лучше через Len(), чем прямое сравнение с пустотой: Len(s)=0 вместо s = «». Связано с тем, что работа со строками значительно медленнее, чем с числовыми данными и Len по сути не подсчитывает длину переменной, а берет это число непосредственно уже готовое из памяти. При сравнении же текста с пустой строкой(«»), VBA сначала создает в памяти переменную нулевой длинны, а уже потом сравнивает с ней наш текст. Поэтому в некоторых случаях так же ускоряет сравнение и в таком виде: s = vbNullString
- Не применять объединение строк без необходимости. Например, s = «АВ», будет быстрее, чем: s =»А» & «В»
- Не применять сравнение текстовых величин напрямую. Лучше применить встроенную функцию StrComp:
If s <> s1 Then будет медленнее, чем
If StrComp(s, s1, vbBinaryCompare) <> 0
и тем более, если при сравнении необходимо не учитывать регистр:
If LCase(s) <> LCase(s1) Then будет медленнее, чем
If StrComp(s, s1, vbTextCompare) <> 0 - Циклы For … Next в большинстве случаев работает быстрее, чем цикл Do … Lоор
- Избегать присвоения переменным типа Variant. Хоть соблазн и велик — этот тип забирает много памяти и в дальнейшем замедляет работу кода. Так же для объектных переменных следует избегать по возможности безликого глобального типа Object и применять конкретный тип:
Dim rRange as Object, wsSh as Object
будет медленнее работать, чем:
Dim rRange as Range, wsSh as Worksheet
Причина в том, что при объявлении As Object мы не даем VBA практически никакой информации о типе данных, кроме того, что это какой-то объект. И VBA приходится «на лету» внутри кода при каждом обращении к такой переменной определять её конкретный тип(Range, Worksheet, Workbook, Chart и т.д.). Что опять же занимает время.
- Если работаете с массивами, то можно при объявлении указать это явно:
вместо
Такая инициализация происходит быстрее.
А еще лучше будет при этом еще и тип данных сразу присвоить:Dim arr() as string, arr2() as long
но это только если есть уверенность в том, что в массив будут заноситься строго указанные типы данных
Конечно, это не все приемы и решения для оптимизации. Но на первых парах должно хватить. Плюс, всегда следует исходить из здравого смысла. Например, если код выполняется за 2 секунды, то вероятно нет смысла его дальше оптимизировать. Конечно, если этот код не из тех, которые просто изменяют значение одной-двух ячеек.
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Return to VBA Code Examples
In this Article
- Disable ScreenUpdating
- Enable ScreenUpdating
- VBA ScreenUpdating Example
- ScreenUpdating Refresh
- VBA Settings – Speed Up Code
- VBA Coding Made Easy
As cool as it looks watching your VBA macro manipulate the screen, you can help your Macro run faster if you turn off (disable) ScreenUpdating.
Disable ScreenUpdating
1. To disable ScreenUpdating, At the beginning of your code put this line:
Application.ScreenUpdating = False
Enable ScreenUpdating
2. To re-enable ScreenUpdating, At the end of your code put this line:
Application.ScreenUpdating = True
VBA ScreenUpdating Example
Your procedure will then look like this:
Sub ScreenUpdating_Example()
Application.ScreenUpdating = False
'Do Something
Range("a1").Copy Range("b1")
Range("a2").Copy Range("b2")
Range("a3").Copy Range("b3")
Application.ScreenUpdating = True
End Sub
ScreenUpdating Refresh
Disabling ScreenUpdating will make your VBA code run MUCH faster, but it will also make your work appear more professional. End-users typically don’t want to see the behind the scenes actions of your procedures (especially when the procedure runs slow). Also, you may not want end-users to see the behind the scenes functionality (ex. Hidden Worksheets). I recommend disabling (and re-enabling) ScreenUpdating in virtually all of your procedures.
However, there are some times when you want the screen to refresh. To refresh the screen, you will need to temporarily turn back on ScreenUpdating (there is no screen “refresh” command):
Application.ScreenUpdating = True
'Do Something
Application.ScreenUpdating = False
VBA Settings – Speed Up Code
There are several other settings to play with to improve your code speed.
Disabling Automatic Calculations can make a HUGE difference in speed:
Application.Calculation = xlManual
Disabling the Status Bar will also make a small difference:
Application.DisplayStatusBar = False
If your workbook contains events you should usually disable events at the beginning of your procedure:
Application.EnableEvents = False
Last, your VBA code can be slowed down when Excel tries to re-calculate page breaks (Note: not all procedures will be impacted). To disable displaying page breaks use this line of code:
ActiveSheet.DisplayPageBreaks = False
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro – A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
Как отключить «мерцание» окна
Смотрите также восстановления значения переменной после выполнения макроса
: Хорошо, вариант с отвечает именно за Application.Calculation = xlCalculationAutomatic
ScreenUpdating в каждом 19:03, в сообщении работает, просто рекомендация действия существуют…) это можно заранее будет здорово собрать: Application.EnableEvents: Юрий МMsgBox .ScreenUpdating ‘
где включение? строки кода вMishel915 до ее начального
увидят открытой книгу активной книгой, но панель задач. Application.EnableEvents = true макросе (имеется в № 4200?’200px’:»+(this.scrollHeight+5)+’px’);»>алгоритм вложенный: вернуть свойство вNic70y предсказать). всё на однойApplication.Calculation = xlManual
А что произошло? читаем
The_Prist#3: Всем доброе время состояния экселя №1, а неактивным листом подойдет?)KuklP sleep(100) Application.screenupdating = виду в цепочке «кнопка» вызывает функцию, изначальное положение после: Не, я неpaylevan
странице и, возможно,HugoПросто выход? Есть.ScreenUpdating = False: А что непонятного?вставьте строку (иначе суток!Дмитрий в панели задачТо есть консолидация: Sub ProductionPlan() false связанных макросов). та в свою завершения работы с махлюю,: Коллеги, спасибо большое узнать новые способы: Это смотря какая возможность попасть на ‘ изменяем Вы обновление отключаете, не закрывается книгаВ макросе одна: Один хороший человек «нажатой» книгу №2,
и обработка информацииDim x As
bedvit_Boroda_
очередь в цикле ним.уже много раз за комментарии. ускорения работы. задача, что на лист? У меняMsgBox .ScreenUpdating ‘ а обратно не База): за другой открываются на этом же или вообще никакой
будет в текущей Workbook: Имхо должно быть: Его вообще можно другую функциюNic70y так делал.При этом, вПри этом особенно
листе, какой код… — нет. читаем включаете. Я не
База.Close SaveChanges:=False две книги Excel. форуме выложил следующий не «нажатой». То книге но вSet x =
достаточно: Application.ScreenUpdating = не вырубать. ОнSGerman: Роман, спасибо заVemod рамках темы, прошу
ценны практические рекомендации
Я часто вообщеThe_PristEnd With
раз писал уже,Mishel915Set wb1 = macros. Позарез нужно это будут лишние новом генерируемом листе. GetObject(«F:ProductionPlanR14.xls») ‘открываем необходимую 1: Application.ScreenUpdating = сам вырубается при: Смех над теми, разъяснение.: Возможно дело в уточнить: можно ли, из опыта, подобные ничего не отключаю
: Здесь ДВЕ ячейки.End Sub что лучше возвращать: Такой код решает Workbooks.Open(Filename:=ThisWorkbook.Path & «Книга1») его применение, но звонки мне, иKuklP книгу 0 выходе из макроса. кто знает меньше,Так оно и разных версиях excel. чтобы ускорить работу комментарию — т.к. каждое А у ВасЮрий М занчения изменных параметров задачу: Set wb2 =
не получается. Может
лишняя трата моего: Нарколог: Вы пьете?’…….. Ваш кодPrisioner Отсюда, кстати, следует
Вас ни в было У меня на
Excel, отключить всюvikttur
отключение-включение только тормозит принудительный выход, если
: Запустил — и и свойств.
Application.ScreenUpdating = False Workbooks.Open(Filename:=ThisWorkbook.Path & «Книга2»)Первая потому, что я времени на объяснения)Пациент: Это вопрос
x.Close 0: Если нужно именно то, что Андрей коем случае неApplication.ScreenUpdating начал использовать 10м тоже все
анимацию?. процесс. изменение более одной что? Переключается.Private Sub Worksheet_Change(ByVal ‘ Отключаем “мерцание” книга используется в
CyberForum.ru
Обновление экрана
настолько далек отПосему, я думаю
или предложение?Set x =
остановить выполнение кода написал выше
украшает.
с MSO 2010 отображается не зависимоТо есть чтобы,
The_PristНо это на ячейки.
Юрий М
Target As Range) окна Set wb1 качестве базы данных. всего этого. оптимальным решением будетЯ к тому Nothing
и посмотреть чтоSGermanПроблема решена, яи когда макрос от включение/выключения обновления например, при импорте: Из опыта: моих задачах и
Юрий М: А где вIf Target.Count > = Workbooks.Open(Filename:=ThisWorkbook.Path & Данные первой книгиМакрос помогает сделать добавлять свойство ShowWindowsInTaskbar — что этоEnd Sub
происходит, а потом:
уже сказал. А вызывал другой макрос, экрана.
данных, или, кИсходный код(копирование отдельных кодах — когда
: Не очень понимаю
Вашем примере Application.ScreenUpdating
1 Then Exit
«Книга1») ThisWorkbook.Activate ‘
применяются во второй обновление файла не
в начало и было: «подойдет?)»Guest решить — продолжатьManyasha цирк, он в
то приходилось вОтключение обновления помогает примеру, использовании счётчиков,
ячеек в основном) лист без формул вопрос — я
= True? Sub Возвращаем указатель текущего книге. открывая его вручную
конец процедур.Вариант с активной
: Спасибо за ответы.
или нет, тогда
, другом месте. Или
другом макросе прописывать когда операции на а также любых
был оптимизирован. Все и событий, а
ведь и такnervIf Not Intersect(Target, приложения (для избежания
В таком открытии (все как яRadist_514
книгой, но неактивнымKukLP, вы все вот такая конструкция:Спасибо, Марина ! я не знаю откл. нескольких листах, убирает других ситуациях значения вычисления перенеслись в вся обработка данных на листе это: >Запустите два раза.
Range(«A1»)) Is Nothing различных глюков) Set двух книг заметно понял делается из
: Здравствуйте! листом подойдет. правильно написали сApplication.ScreenUpdating = True
Хотел новой благодарностью местных традиций ?
SGerman мелькание. в ячейках изменялись
массивы. Так вот в массивах (без делаю. Куда ещё
Первый запуск (макроса): Then Exit Sub wb2 = Workbooks.Open(Filename:=ThisWorkbook.Path
мерцание на экране
исходного файла заНаткнулся на работеНо боюсь, меня точки зрения нормального
Stop Application.ScreenUpdating =
повысить Вашу репутацию
SGerman
: Зравствуйте !Rioran
без подмигиваний, проскальзываний этот оптимизированный код
обращения к листу попасть? :-)True ‘ проверяем
Application.ScreenUpdating = False
& «Книга2») Application.ScreenUpdating
перной книги.
раз). на маленькую неприятность.
поняли неправильно. На кода по открытию
FalseПри этом выскочит в очередной раз,
:
Почему-то далеко не
: и иных ресурсоёмких выполнялся в 6
в процессе).The_Prist’ отключаем False’здесь код
= True ‘Вопрос – возможно
ВОТ КАК БЫЛО
Написал макрос для
самом деле применение книги.
окошко такое же
но не вышлоkrosav4ig всегда помогает отключение
Nic70y
динамических эффектов. раз быстрее исходного.Хотя отключить обновление: Потому что это
‘ да, отключеноApplication.ScreenUpdating = 1
Возвращаем режим обновления ли при открытии
СКАЗАНО: проверки данных из свойства ScreenUpdating вНо мне как
как при ошибке, — наверно «многабукав»., Минут 10 собирал моргания стандартным способом, привет!
Dima S На 32-битной системе, экрана в 99%
не событийная процедура.ВторойEnd Sub экрана при измененииСледуя
двух подряд книг
200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub update() одного файла в нужном месте очень
раз интересен был но будет активны Но почему не
куски кода, чтобы200?’200px’:»+(this.scrollHeight+5)+’px’);»>Application.ScreenUpdating = FalseКак я понял: а ScreenUpdating чем
2010 офис. А случаев в общемSub io()True ‘ проверяем.
ran Вашим реконаписать из избавится от мерцанияWith Application ‘операции другом и дабы даже кстати. Т.е. ответ именно по
кнопки «Continue», которая выдается предупреждение ? сложилась хотя быApplication.ScreenUpdating = True по переписке разработчиков
не угодил? в 64-битной 2010
полезно.With Application Включено. А ведь
: А нигде! №4 написал код: первой книги. Тоесть с приложением/отключаем для не получить эпилептический
не стоит менять функции ScreenUpdating. продолжит выполнение кодаGuest_E приблизительная картинка.Может быть, есть ОТСЮДА (инглиш), в
Слэн
офис — на
paylevan
MsgBox .ScreenUpdating
мы его отключали)
В том и
Application.ScreenUpdating = False
первая книга должна повышения скорости работы припадок от мерцания
активный лист воЯ только начинаю и кнопка «End»,
: Добрый день! ЯВ результате при
еще какие-нибудь хитрости
ранних версиях Excel: для меня было 1/6 медленнее.: Спасибо,
.ScreenUpdating = FalseFalse вопрос — почему ‘ Отключаем “мерцание” откриваться, но не макроса
экрана добавил в избежание применения этого длинный путь изучения которая прервет процедуру. хотел спросить, какова добавлении поста ничего для полного отключения
компания Microsoft разрешала потрясающим, когда яНе будем вдаваться
ber$erk
MsgBox .ScreenUpdating
Юрий М
в одном случае
окна Set База
должна быть активной
.ScreenUpdating = False
начале главной процедуры
свойства. По скорости VBA, поэтому иEvgeny_1 роль или важность не добавилось ? разработчикам больший контроль оптимизацией алгоритма, вылизывая
в подробности, но.Exit Sub
: А теперь читаем продолжает работать, а
= GetObject _
даже на мгновение. ‘обновление экрана Application.ScreenUpdating = False ничего не выигрывается(если вопросы мои тривилальные.: Господа, прошу прощения
применения «ScreenUpdating =SGermanСпасибо за помощь над свойством буквально каждую строчку, по опыту можноВозможно есть ещёEnd With Димин пост от во втором - (PathName:=»C:Documents and SettingsПользовательРабочий
И если возможно
.DisplayAlerts = False , а в не сказать наоборот).Дъмитръ, я полагал если вопрос где-то False»? (так сказать,
: «Макрос» — этоHugoApplication.ScreenUpdating выжал 10% для сказать, что каждая
функции по ускорениюEnd Sub 03.12.2011, 16:14 нет!?
столКнига1.xls») ThisWorkbook.Activate ‘ то как?
‘вывод системных сообщений
конце Application.ScreenUpdating = Если Вы хотите
что ScreenUpdating отвечает
был раскрыт, но
для чего?) Заранее
любой код, как
: Здравствуйте.. И можно было сортировки массива, а оптимизация это отдельный работы Excel?Выполняя напрямую из
planetaexcel.ru
Ускорение работы Excel-приложений.
ranЮрий М Возвращаем указатель текущегоНапример, так неПапка = «полный
True. Всё отлично заполнять данными из за обновление экрана прочитав все темы благодарен!
я понял сПокажите пример в его отключить и пришел ZVI и процесс, требующий отдельного
Мне кажется, будет редактора VBA вы
: Да нет его!
: А мне ещё приложения (для избежания проходит. путь папки»
работало в оффисе других книг активный в целом, а в поиске поPavel55
Вашей веселой пиктограммки. файле когда не само оно уже «простым» переопределением типа подохода. полезным собрать на не отключаете обновлениеЯ знаю, что вот это непонятно:
различных глюков) SetApplication.ScreenUpdating = False’———— Excel-файлы в 2007, но сейчас
лист, используйте ScreenUpdating. не только в запросу (как в: Данное свойство отключает
Так вот, именно помогает. включается при определённых
переменной сделал 40%Основные принципы: этой странице все — иначе не надо вставлять включение.If Not Intersect(Target, wb1 = Workbooks.Open(Filename:=ThisWorkbook.Path ‘ Отключаем “мерцание”
этой папке —————— обновили на 2016 Если неактивный - выполняющемся VBA приложении… заголовке) ответа я обновление экрана (визуализацию) так я иSGerman условиях. Однако вхотя, конечно бывало,-вычисление самых тормозных основные функции и смогли бы видетьНо меня интересует
Range(«A1»)) Is Nothing & «Книга2») Application.ScreenUpdating окна Set wb1Имя = Dir(Папка и, как результат,
незачем, не нужно.KuklP не нашел.
и макрос намного делал ! В
: последующих версиях компания что оптимизацией алгоритма мест(как правило обращение приёмы, добавление и
ход выполнения. А не это, а Then Exit Sub = True ‘ = Workbooks.Open(Filename:=ThisWorkbook.Path & & «*.xls*») мерцание появилось. ПрошуThe_Prist в двух: 2. Это неВступление: быстрее выполняется, т.к. каждом «макросе» вHugo
принудительно ввела «перезагрузку» удавалось добиться ускорения к ячейкам, но
использование которых помогает вот с листа именно тот вопрос,При изменении в Возвращаем режим обновления «Книга1») Application.ScreenUpdating =
Do While Имя прощение за то, словах бы объяснил. функция, это свойство;Имеется наипростейшая процедурка не тратятся ресурсы начале вырубал, в, Проект слишком большой
метода. Таким образом, в 200 раз.. есть исключения; активация сделать исполнение макросов — да, отключается. который я задал!
ячейке А1 НИЧЕГО экрана при изменении True ‘ Возвращаем <> «» что не прилагаю У меня такого3. как только смысл которой таков: компьютера на отображение
конце — врубал — xls>800 Kb в новых версияхikki листов, книг, ячеек); более быстрым.
ranМожет конечно это
не произойдёт. Кроме База = NothingТоже режим обновления экранаWith .Workbooks.Open _ файл ибо это дара нет. процедура закончилась, свойство есть открытая активная действий на экране отображение.SGerman (там не понятно,:
-переводим тормоз вber$erk: Давайте попробую еще мой локальный глюк, выхода из процедуры, решает задачу. Кроме при изменении ThisWorkbook.Activate
(Filename:=Папка & Имя,
конфиденциальная информация. ЕслиEvgeny_1 автоматом возвращается в книга «расчет картона…reply
И у меня: Разобрался !!! каких именно) послеСлэн газ: исключаем все: , смысла особого раз объяснить. но у меня конечно. того, код не
‘ Возвращаем указатель UpdateLinks:=True) кто-то стыкался с: Я все понял
true(и это правильно, (разработка), необходимо открыть: Спасибо, Павел! Доходчиво все радостно моргало
Дело было в того, как макрос, а ссылки на
лишние активации объектов; в этом нет
Добавляю в код
после выхода поЮрий М
допускает появление кнопки текущего приложения (для’здесь Ваш макрос
такой проблемой при что вы хотели иначе пришлось бы в фоне книгу технически обьснил. А ! том, что алгоритм
отрабатывает — изменённая ту тему случаем операции сравнения ячеек(как
— тема со первой строкой строке
: Смотрите: «База» или «Книга1″ избежания различных глюков) делает свое грязное переходе на новую донести по поводу
перезапускать Экс в «productionplanR14» и снова на счет безопасности
Когда же все вложенный: «кнопка» вызывает им настройка не сохранилось? правило в циклах)
временем уедет вниз.MsgBox Application.ScreenUpdatingIf Target.Count >Вы отключили обновление:
на панели уведомлений,
Set wb2 =
дело
версию оффиса, подскажите,
ScreenUpdating. Спасибо вам
случае любого сбоя, активировать книгу «расчет что-то есть в внутренние переключения убрал, функцию, та вApplication.ScreenUpdating
Слэн и вычисления переводим Да и информация
Сколько я бы 1 Then ExitApplication.ScreenUpdating = False что может быть Workbooks.Open(Filename:=ThisWorkbook.Path & «Книга2»).Close SaveChanges:=True
пожалуйста, как пофиксить за это. или забывчивости программиста); картона (разработка)». этом? Как-то расслышал моргание исчезло. свою очередь ввозвращается в прежнее: вот: в массивы(с умом);
эта в 98% ни менял значение Sub
принудительно вышли, если преимуществом.Busine2009End With данную ситуацию.Неясным для меня1. я предложилКод таков: один раз?…(мол говорилиВот так-то
цикле другую функцию, русло.ikki сводим обращение к
случаев гостям не в [A1], получаювозможность попасть на более одной ячейки:Относительно: Код: Sub P1()
Имя = DirСпасибо.
осталась лишь одна вариант, при котором
Sub ProductionPlan()
planetaexcel.ru
Application.ScreenUpdating = 0 (Макросы/Sub)
что кто-то успеет,что-тоManyasha а та и
Особо отмечается, что
: спасибо. ячейкам листа к
интересна — им MsgBox True, не любой лист ExcelIf Target.Count >
База.Close SaveChanges:=Falseто этот Dim База As
Loop
vikttur вещь — это использование ScreenUpdating неApplication.ScreenUpdating = False
сделать!). Заранее огромное: не дуйтесь. Если тоже в цикле если перевести выполнениеоч.хорошая тема. минимуму; нужно готовое решение, смотря на принудительный появляется только после 1 Then Exit код не записывал Excel.Workbook Set База
.ScreenUpdating = True: Попробовать создать пример.
панель задач, в
бы Вы поискали,
нужно.
'Application.ShowWindowsInTaskbar = False
спасибо!..
— третью. И макроса в пошаговый
Nic70y-правильное объявление переменных(особенно а старожилы итак выход. выполнения Sub так как открытая = GetObject _ ‘обновление экрана Удалите все секретное, которой «нажатой» (активной)Evgeny_1Application.Workbooks.Open («F:ProductionPlanR14.xls») ‘открываемIgor67 что такое кругом стоит true/false. режим (с помощью: Отключаем обновление экрана массивы — рамер все об оптимизацииНо стоит мнеApplication.ScreenUpdating = True
а обновление не База нужна во (PathName:=»C:Documents and SettingsПользовательРабочий
.DisplayAlerts = True листы, с которыми
показывается временная книга,: KukLP, спасибо, разобрался, необходимую книгу: На работе написалCall Когда все внутренние F8 клавиши выполнять в начале макроса,
не должен быть знают (ну или скопировать 2 ячейкиЮрий М
включили. второй книге. столБаза.xls») ‘Проверяем, что ‘вывод системных сообщений
макрос не работает, которую я открывал, буду использовать предложеннуюApplication.Workbooks(«расчет картона (разработка).xls»).Activate макрос с открытиеми поняли, что строчки переключения отображения по 1-й строкев конце включаем. неоправданом велик); почти все :-)) — можно мышем: Покажите файл ТОЛЬКОThe_PristЦипихович Эндрю База открыта иEnd With внутри макроса закомментировать а не та вами схему. ‘активируем изначальную книгу исходной, копированием и написали, то тоже закомментарил, мерцание исчезло. кода), то свойство
Вопрос — а-при необходимости отключаемvikttur по листу щелкать с этим фрагментом.: Вопрос на засыпку:: по большому счёту посмотрим содержимое первогоEnd Sub чего-нибудь. Возможно, выявите книга, которая вKuklP’Application.ShowWindowsInTaskbar = True закрытием, снятиями защиты бы посмеялись)Всем спасибо !Application.ScreenUpdating обязательно включать?
отслеживание событий, обновление: Обработка ячеек листа до посинения, ничегоПытливый что делает эта
в начале процедуры листа первой ячейки.ВОТ КАК БЫЛО источник. действительности является активной: А вот GetObject,Application.ScreenUpdating = True и переходами. КомпЦитата Проблема решена.всегда будет TrueВроде как и экрана, вычисления, показ по сравнению с не происходит (в: Ну так The_Prist строка?а в конце MsgBox База.Worksheets(1).Cells(1, 1).Value СДЕЛАНО:Radist_514 на момент окончания как раз функция:-)End Sub
слабый, моргал какSGerman, 12.07.2016 вRAN независимо от установленной без включения, после предупреждений. обработкой данных в ячейку попасть не так и написал:If Target.Count > ничего не пишут ‘Закрываем. База.Close SaveChanges:=FalseКод200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub update(): Окей, обязательно попробую, макроса (по процедуре Ну, считайте занудой..Изначально в процедуре сумашедший. Обрабатывается куча 19:10, в сообщении
: Есть. разработчиком. И отслеживать завершения макроса он
Dima S массиве — тормоз.
могу, курсор -Если процедура завершается
1 Then ExitВ функции эту ‘Далее удаляем объектнуюWith Application спасибо! Думал, может
excelworld.ru
Убрать мерцание экрана при выполнении кода (VBA+Excel)
приведенной в 1м Все это я
естественно не было формул. Столбцы на № 7200?’200px’:»+(this.scrollHeight+5)+’px’);»>У меня
200?'200px':''+(this.scrollHeight+5)+'px');">Call Макрос()
реальное состояние этого
обновляется.: Не использовать SelectВставка макросом формул стрелка) до того,
«естественным путем» через
Sub строку не пишут
переменную База. ‘Если.ScreenUpdating = False кто-то уже сталкивался
посте). Если например беру из справки строчек Application.ShowWindowsInTaskbar, которые А — закончились.вообще нет
включает обновление экрана, свойства можно будет
Или я чего-то без надобности вместо вычисления в как в VBA End Sub, тоДля общего понимания:И всё ОК, объектная переменная объявлена.DisplayAlerts = False с такой же временную книгу просто — F1. в коде выше
Мучался со вставкойCall Macros, как
и в этом только с помощью
не понимаю?
Range(«A1»).Select: Selection.Value = коде — тормоз. выполню обновление включается автоматом.
если Вы вышли разве нет???
внутри процедуры, ‘тоTest2 = «C:Test22.xlsx»
проблемой, в плане открыть и закрыть,
Evgeny_1
помечены как комментарии.
формул, их распространением и
макросе его снова ввода булевой переменной,Подскажите тупому пожалуйста. «Hello»Отключили обновление экрана,
Application.ScreenUpdating = TrueЕсли «неестественным» - из процедуры, завершаяА по правильному
это просто формальность,Testing = Dir(Test2 корня проблемы: это то в панели
: KukLP, я правильноРезультат вышеописанного кода на реальный диапазонсамих макросов нужно отключать.
которая будет дублироватьRoman777можно записать как а тут нужно…nerv
через Exit Sub её логически, т.е. да нужно в т.к. объектная переменная & «2.xls») из-за перехода на задач активной (нажатой) понимаю что эта в экселе выполняется данных.
.Возврат в исходную значение свойства при:Range(«A1») = «Hello»АналогичноНет такого, чтобы: Дмитрий, спасибо за автоматического включения обновления
дойдя до End конце процедуры всё сама ‘удалится послеDo While Testing обновленный софт или книги после выполнения
функция применима к правильно, то естьА решение -…только Function и процедуру — тоже. изменениях.
Nic70y и с Activate.»примени вот это - участие) Но если не происходит. Sub, то VBA же поставить в
завершения процедуры. Лучше <> «» просто я натупил
макроса вообще не любому кол-ву открываемых запустив макрос в ScreenUpdating = False SubSub — это
SGermanУпоминается, что «перезагрузка», Добрый день.Когда записать макрос и счастье на честно, то яnerv
сам возвращает значение Труе всегда использовать, ‘чтобы
With .Workbooks.Open _ где-то? Поэтому и будет…, хотя на
книг/листов, из которых
текущей открытой книге,Поставил формулы с и есть макрос.: Уточнение.Application.ScreenUpdatingЛично у меня макрорекордером там будет века!
не понял :: А теперь читаем Application.ScreenUpdating в True.то есть 1 не забыть это(Filename:=Test2 & 2, интересуюсь, если из-за экране активной становится нужно в кучу
в фоне открывается двукратным запасом иМакрос внутри другого
Везде стояло, конечносвойства происходит, когда в любом случае
множество таких конструкций.
"
)
Димин пост от
Если же Вы
раз в начале
сделать тогда, когда
UpdateLinks:=True)
нового оффиса, то
та книга, которую
собрать информацию на
2я книга и
отключил обновление.
макроса можно вызвать же: задействуется другой макрос необходимость включить послеЕсли нужно вывестиpaylevanПравильно ли я 03.12.2011, 16:14{/post}{/quote}Как плохо,
принудительно завершили процедуру Фальше и 1 это надо. Set.Close SaveChanges:=True как пофиксить, чтобы я в конце итоговом листе активной активной остается 1я
Раньше пользователи дергались так:200?’200px’:»+(this.scrollHeight+5)+’px’);»>Application.ScreenUpdating = False (?) или модуль. отключения остаётся, поскольку массив на лист,:
понимаю, что в что я не — то…короче ничего раз в конце База = NothingEnd With не тратить время
процедуры собственно и книги? книга. Однако в и пытались файлик200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub t1()Application.ScreenUpdating = TrueПомимо прочего нашёл всё-таки, с отключенным
то лучше неber$erk коде ниже оно умею читать!))) Спасибо,
никуда не возвращается. на Труе и End SubИмя = Dir на долгие поиски. указал сделать активной.Всмысле без принудительного панели задач почему
excelworld.ru
ScreenUpdating. VBA
не однократно загубить,’коди экран моргал в сети упоминания, обновлением не видно циклом в каждую, если собрать всё должно отключаться и
понял : )ran всёMishel915LoopІгор ГончаренкоЭта ситуация исправляется свойства ScreenUpdating =
то активной отображается а теперь МАШИНАEnd Sub как ненормальный :) что можно работать не только изменений, ячейку, а сразу воедино, то когда не включаться?Юрий М
: Но ведь здесьЯ почему так: Спасибо за отзыв..ScreenUpdating = True: не работал с только принудительным обновлением False у меня 2я книга, а СЧИТАЕТ и всеSub t2()Почему — так со свойством которые я выполняю весь массив в
тема со временемЕсли нет, то,
: Мало ли что в обоих случаях рассуждаю, потому что
Так тоже не.DisplayAlerts = True офис 2016, тем панели задач после ничего мелькать не не первая.
спокойно ждут.t1’Вызываем t1 и не понял.
Application.StatusBar в той или диапазон. уедет вниз, её
пожалуйста, приведите пример написал, Главное - принудительное завершение процедуры! надо пробовать в проходит. Применяю код:End With не менее уверен:
planetaexcel.ru
Есть ли команда разового обновления экрана в Excel
выполнения макроса (свойством будет при выполненииПри убирании ковычекПо времени не
End Sub Такое впечатление, чтои оно всегда иной ячейке, ноЮрий М легко будет найти когда, когда оно прочитать АЯ специально удалил
разных процедурах иSub Макрос_Щелкнуть() Dim
End Sub1) что Application.ScreenUpdating ShowWindowsInTaskbar). Когда процедура макроса на фоне?
со строчек Application.ShowWindowsInTaskbar, скажу, по нервама можно так: false на false будет отображаться в
и просто какая: И я немного по тематическим запросам не включается) у Саши утро.
весь код, оставив глаза это не База As Excel.WorkbookПредварительно активировал макросы работает там так написана с принудительнымKuklP после выполнения макроса,
вообще 0.Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub t1() дает true экселе с учётом ячейка выделена. добавлю: в любом поисковике.Private Sub Worksheet_SelectionChange(ByValran только строки принудительного
CyberForum.ru
Application.ScreenUpdating и панель задач
техника надо сажать Dim wb1 As и сделал их же как и обновлением панели задач,: Не правильно. Если в панели задачА то раньше’код
SGerman
изменений даже приNic70y- стараться использовать Поэтому, всё же, Target As Range): . выхода. робота чтобы считал Workbook Set База
доступными. Потом зашел
во всех предыдущих
то активное книга
Ваш итоговый лист
активным показывается правильная — придумал фигню
End Sub:
выключенном обновлении экрана.
: ну например
конструкцию With -
польза, мне кажется,With ApplicationЮрий МЕсли выходить по мерцание
= GetObject _ в Visual Basic версиях экселя совпадает с неактивен и в книга (изначальная из нам, а онаSub t2()RAN Опробовал — можно200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub tipakod() End With; есть.
Debug.Print .ScreenUpdating ‘: Что нужно выполнить, строкеran (PathName:=»C:Documents and SettingsПользовательРабочий нажал Insert -2) проблема не «нажатой» книгой на
это время вы
которой и запускался не работает…Call t1’Вызываем t1, задавать текст строки,
Application.ScreenUpdating = 0- максимально использовать
vikttur всегда True чтобы «сломалось»?If Not Intersect(Target,: Приветствую! столКнига1.xls») Set wb1 Module. Появилось окошко,
в переходе на панели задач. меняете на нем
макрос)Guest_EEnd SubУ меня вообще которая в моём[a1] = «8» переменные — один
, спасибо большое за.ScreenUpdating = Falsenerv
Range(«A1»)) Is NothingПомогите разобраться с
= Workbooks.Open(Filename:=ThisWorkbook.Path & куда и вставил
новую версию, аEvgeny_1 данные(берете из других
Вопрос:
: Спасибо Igor, обяснил
Андрей ( нет Call Macros,
2013-м Экселе показана
End Sub раз вычислили (присвоили)
практические рекомендации.Exit Sub: Пытливый, Юрий, а Then Exit Sub непонятным
«Книга2») Set База выше описанный макрос. проблема в Вашем: Я всетаки с
книг), то открытие-закрытиепочему Application.ScreenUpdating так на примерах, да,RAN
как и самих в самом низу,и все ок. значение, а затемber$erkEnd With
теперь скажите мнето Application.ScreenUpdating возвращаетсяPrivate Sub Worksheet_Change(ByVal
= Nothing End Жму Play ниче коде дома скину скриншот этих книг не работает странно, как хорошое решение пришло) рассказал про особенность
макросов. рядом с кнопкойне, наверное я обращаться только к
: не в обидуEnd Sub почему здесь результат в True, а
Target As Range) SubПеред открытием Книги2 не происходит(думал, чтодостаточно сделать так: проблемы с панелью повлияет на обновление избежать этого «бага»
людям! Я тебя 2-го способа (Кстати,Весь код - записи макроса. Также все-таки туплю… ним. будет сказано, ноЮрий М тот же самый) если по строке
Application.ScreenUpdating = False «мерцает» Книга1, тоесть операция маленькая может Sub X1 Application.ScreenUpdating задач. экрана, Вы никак
без прописывания дополнительных тоже признаю как я про нее на листах, формах в обход отключенногоRoman777- принудительный выход Вы пользовались поиском: У меня такогоНе утро, простоIf Target.Count >If Target.Count > База. быстро сделал). Закрыл = False X2Юрий М не сможете отследить строчек с Application.ShowWindowsInTaskbar. знатока форума! не знала. Андрей, и модулях - обновления экрана работает: из циклов, если прежде чем начать не происходит - с одного языка 1 Then Exit 1 Then ExitРазница в том, все сохраняя (но
‘ и все: Далась Вам эта это. Однако, изменениеНадеюсь описал непонятный
AndreA SN спасибо за информацию! только Function и и обновление внешнегоNic70y
достигнут результат. эту тему?
могу сразу после на другой пока
Sub Sub что при использовании
при сохранении были что написано тут панель задач :-)
данных на активном момент доступно…: Допустим, я отключил) Sub вида формы с, Что-то тут не- при использованииDima S копирования/вставки активировать любую еще туго переключаюсь)то нет.If Not Intersect(Target, GetObject кнопка «База» кучи каких-то надписей). после Х2 будет Представьте, что она листе НЕИЗБЕЖНО вызовет
Evgeny_1 обновление Application.screenupdating =Еще одна особенность:krosav4ig
помощью метода чисто, у меня вложенных Если (If): Отключили обновление экрана, ячейку. Параллельно на js
Вопрос возник в Range(«A1»)) Is Nothing или «Книга1» на Зашел в нужный мигать по страшной вообще не отображается. ScreenUpdating, если он: Пытаюсь прикрепить скриншот falseApplication.ScreenUpdating:.RePaint код отрабатывает, апервой а тут нужно…Вот-вотpaylevan сижу мастерю : процессе разбирательства с Then Exit Sub панели уведомлений отсутствует файл который должен силе Application.ScreenUpdating =Guest не установлен в проблемы — страницаНо потом мне
относится только кSGerman. лист остаётся пустым,(внешней) проверкой сразу — если весь: Здравствуйте. Прошу поделиться ) кодом, превая строкаEnd Sub (что тоже хорошо).
был обновиться, но True end sub: Мне эта панель False. Такого не с ответом виснет
нужно в определенный приложению Excel. Если, ну вы хотяВозвращаясь к изначальному до тех пор
отсекать ненужное. код все делает функциями, а такжеSub io() которогоЕсли изменить А1, Без использования GetObject он не обновился Sub X2 Application.ScreenUpdating задач действительно не произойдет, если не и скриншот вместе момент просто обновить Вы внутри макроса бы код покажите вопросу. Судя по пока не включуHugo через Ж…, то приёмами, которые помогаютWith ApplicationApplication.ScreenUpdating = False то все продолжает кнопка «Книга1» на НИЧЕРТА! = False … сдалась, просто я
делать Ваш итоговый с постом не экран, чтобы посмотреть, используете, например, word,RAN
planetaexcel.ru
Отключение обновление экрана
всему, да, включать скринАпдейтинг… и честно
: Да, точно - отключение обновлений экрана ускорить выполнение макросов.Debug.Print .ScreenUpdatingпоследняя работать, а если панели уведомлений присутствует.Формуляр Application.ScreenUpdating = True пишу не только лист активным, либо загружается… — чего там в нем экран:крайне желательно говоря, не пойму, если в цикле тут не поможет.К примеру, чтобы.ScreenUpdating = FalseApplication.ScreenUpdating = True скопировать и вставитьBusine2009: Так зачем вы end Subа универсально для себя код все же прямоТолькоУчусь
у меня натворилось.
будет обновляться.Цитата. Ведь поведение программы почему вы могли часто используется проверкаКак по мне, экран не обновлялсяExit Sub
а внутри кода 2 ячейки, то: весь его код это пишется так но и для указав ScreenUpdating =: Объясню как сам И ничего дальшеЦитатаSGerman, 12.07.2016 в разработчики меняли со бы видеть результатand…and…and то наверное в при каждом исполнении
End With — прерывания. требуется принудительное включениеMishel915
искаверкали? Sub X2 Dim других людей, которые False. Как я понимаю это :)
не делать. ВычисленийSGerman, 12.07.2016 в 19:10, в сообщении временем и нет (если изначально ячейка
то использовать большинстве случаев для процесса, я используюEnd Subnerv обновления экрана.,Всё, что требовалось, aSU aSU = вообще далеки от упоминал, «как толькоМетод «Application.ScreenUpdating» отвечает в книге нет. 19:35, в сообщении № 7200?’200px’:»+(this.scrollHeight+5)+’px’);»>Весь код никакой уверенности, что А1 была пуста).if then ускорения работы макроса строку:ran: Всем добрый день)Юрий Мобложите 4 строку указать в константе Application.ScreenUpdating: Application.ScreenUpdating =
planetaexcel.ru
Макрос для автоматического обновления файлов (Требуется помощь! Срочно!)
VBA. И ради процедура закончилась, свойство за обновление экранаЕсть ли такая № 12200?’200px’:»+(this.scrollHeight+5)+’px’);»>В каждом — на листах, во всех версиях Мб у Васif then нужна оптимизация кода,
Application.ScreenUpdating = FalseКакие: Скопировать и вставитьОбъясните мне, пожалуйста,: А всё потому, кода в путь: False … Application.ScreenUpdating
их спокойствия я автоматом возвращается в
самого "Excel", но
команда обновления экрана? "макросе" в начале формах и модулях свойство будет работать
в коде всё-такиif then
а не вкл/выкл. ещё желательно добавить
[b5:b6] зачем включать обновление
что строка Application.ScreenUpdating#3
200?'200px':''+(this.scrollHeight+5)+'px');">Папка = "C:Test2" = aSU end
пытаюсь сделать так, true", но хорошим
не других приложений.
RefSol вырубал, в конце
- только Function одинаково. Причём в есть включение, или
располагая проверки в
paylevan
строки в VBA-код,
Юрий М
экрана : ) = False срабатывает
командойДмитрий
Subа еще ошибки
чтобы все для
тоном будет вернуть Например, удаление значений
:
— врубал
и Sub
официальной документации нет
действие, после которого
порядке от более:
чтобы убыстрить, в: Скопировал, вставил -
Запустите два раза.
до принудительного выходаScreenUpdating
: Для англоязычной версии
отследить, чтобы дело
них было как
его директивно -
в ячейках, строк
AndreA SN
Application — относится
Цитата
никакого уточнения о Application.ScreenUpdating становится равным редкого условия кber$erk целом, работу Excel-приложения? что дальше?Sub io() из процедуры (Then. Excel также все дошло до выполнения можно проще и Application.ScreenUpdating = True. и т.д., попробуйте сделать так: к запущенному приложениюSGerman, 12.07.2016 в том, как метод True (если такие более частому (обычно
, конечно пользовался, ноber$erkranWith Application
Exit Sub). АИ после 6 оставлять ?
последней строки и
привычнее, если ониEvgeny_1А метод «Application.ShowWindowsInTaskbar»Application.screenupdating = true
excelworld.ru
Excel, необязательно вырубать
если печать производится внутри кода, то эту строку желательно вставить сразу после строки, выводящей лист на печать(при условии, что печать не происходит в цикле. В этом случае — по завершению цикла печати).
На всякий случай можно отключить отображение информации в строке статуса Excel (в каких случаях там вообще отображается информация и зачем можно узнать в статье: Отобразить процесс выполнения). Хоть это и не сильно поедает ресурсы — иногда может все же ускорить работу кода:
Главное, что следует помнить — все эти свойства необходимо включить обратно после работы кода . Иначе могут быть проблемы с работой внутри Excel. Например, если забыть включить автопересчет формул — большинство формул будут пересчитывать исключительно принудительным методом — Shift+F9. А если забыть отключить обновление экрана — то есть шанс заблокировать себе возможность работы на листах и книгах. Хотя по умолчанию свойство ScreenUpdating и должно возвращаться в True, если было отключено внутри процедуры — лучше не надеяться на это и привыкать возвращать все свойства на свои места принудительно. По сути все это сведется к нескольким строкам:
‘Возвращаем обновление экрана Application.ScreenUpdating = True ‘Возвращаем автопересчет формул Application.Calculation = xlCalculationAutomatic ‘Включаем отслеживание событий Application.EnableEvents = True
Как такой код выглядит на практике. Предположим, надо записать в цикле в 10 000 строк значения:
Sub TestOptimize() ‘отключаем обновление экрана Application.ScreenUpdating = False ‘Отключаем автопересчет формул Application.Calculation = xlCalculationManual ‘Отключаем отслеживание событий Application.EnableEvents = False ‘Отключаем разбиение на печатные страницы ActiveWorkbook.ActiveSheet.DisplayPageBreaks = False ‘Непосредственно код заполнения ячеек Dim lr As Long For lr = 1 To 10000 Cells(lr, 1).Value = lr ‘для примера просто пронумеруем строки Next ‘Возвращаем обновление экрана Application.ScreenUpdating = True ‘Возвращаем автопересчет формул Application.Calculation = xlCalculationAutomatic ‘Включаем отслеживание событий Application.EnableEvents = True End Sub
Разрывы печатных страниц можно не возвращать — они тормозят работу в любом случае.
Следует избегать циклов, вроде Do While для поиска последней ячейки . Часто такую ошибку совершают начинающие. Куда эффективнее и быстрее вычислять последнюю ячейку на всем листе или в конкретном столбце без этого тормозного цикла Do While. Я обычно использую
другие варианты определения последней ячейки я детально описывал в статье: Как определить последнюю ячейку на листе через VBA?
Для более опытных пользователей VBA я приведу несколько решений по оптимизации кодов в различных ситуациях:
Sub TestOptimize_Array() ‘Непосредственно код заполнения ячеек Dim arr, lr As Long ‘запоминаем в массив одним махом все значения 10000 строк первого столбца arr = Cells(1, 1).Resize(10000).Value ‘если нужно заполнение для двух и более столбцов ‘arr = Cells(1, 1).Resize(10000, 2).Value ‘или ‘arr = Range(Cells(1, 1),Cells(10000, 2)).Value ‘или автоматически вычисляем последнюю ячейку и заносим в массив данные, начиная с ячейки А3 ‘llastr = Cells(Rows.Count, 1).End(xlUp).Row ‘последняя ячейка столбца А ‘arr = Range(Cells(3, 1),Cells(llastr, 2)).Value For lr = 1 To 10000 arr(lr,1) = lr ‘заполняем массив порядковыми номерами Next ‘Выгружаем обработанный массив обратно на лист в те же ячейки Cells(1, 1).Resize(10000).Value = arr End Sub
Но здесь следует учитывать и тот момент, что большие массивы могут просто вызвать переполнение памяти. Наиболее актуально это для 32-битных систем, где на VBA и Excel выделяется памяти меньше, чем в 64-битных системах
Как отключить обновление экрана для другого приложения (блокнот)
4 Badan [2016-12-09 12:55:00]
Я написал макрос в vba, который открывает текстовый файл с помощью блокнота, выбирает все txt и копирует его в Excel. Я должен обрабатывать около 100 файлов ежедневно таким образом, и я хочу избавиться от мигающих изображений, которые я наблюдаю. Код работает, но проблема в том, что команда
Не работает с записной книжкой. Я могу использовать только обычный фокус, иначе код не работает. Как я могу выполнить код ниже, не заметив, что файл блокнота открыт и обработан?
Я не мог найти никакого рабочего решения.
excel-vba csv notepad
Вот быстрый ответ, как запустить Notepad, но скрыть окно и использовать vbHide вместо vbNormalFocus в вашей команде Shell :
Но я очень сомневаюсь, что SendKeys будет работать над невидимым окном.
Итак, это не ответ на вопрос, но вы считаете, что используете FileSystemObject и просто читаете файл без фактического открытия Notepad.exe ?
Код будет работать с акцентированными символами, например. мой тестовый текстовый файл:
Насколько я знаю, Application.ScreenUpdating применим только к вашему сеансу Excel, а не к другим программам, запущенным в Windows. Таким образом, чтобы фактически остановить появление этих окон — , но все еще можно прочитать содержимое окна, вам придется сделать что-то достаточно сложное с Windows API. Использовать FileSystemObject много, проще.
0 Badan [2016-12-12 11:37:00]
Наконец-то я нашел очень элегантное решение, которое может обрабатывать внешние приложения. Все, что вам нужно, это Роберт Шутт для написания этого шедеврального кода. Это делает блокнот размером 1 пиксель, поэтому никаких мигающих изображений не наблюдается. Это выглядит довольно сложно для меня, но это спасло мой день:
How to dou
Поскольку ваши макросы Excel становятся все более надежными и сложными, вы можете обнаружить, что они теряют производительность. При обсуждении макросов слово производительность обычно является синонимом speed . Скорость — это то, как быстро ваши процедуры VBA выполняют свои намеченные задачи. Ниже приведены десять способов помочь сохранить макросы Excel с оптимальным уровнем производительности.
Расчет листового листа
Знаете ли вы, что каждый раз, когда ячейка, которая влияет на любую формулу в вашей электронной таблице, изменяется или обрабатывается, Excel пересчитывает весь рабочий лист? В таблицах с большим количеством формул это поведение может резко замедлить работу ваших макросов.
Вы можете использовать Приложение. Свойство Calculate, чтобы сообщить Excel переключиться на ручной режим расчета. Когда рабочая книга находится в режиме ручного вычисления, рабочая книга не будет пересчитываться до тех пор, пока вы явно не выполните расчет, нажав клавишу F9.
Поместите Excel в ручной режим расчета, запустите свой код и затем вернитесь в автоматический режим расчета.
Установка режима вычисления обратно в xlCalculationAutomatic автоматически приведет к пересчету рабочего листа, поэтому нет необходимости нажимать клавишу F9 после запуска макроса.
Отключение обновления экрана листа
Вы можете заметить, что когда ваши макросы запускаются, на вашем экране происходит небольшое количество мерцания. Это мерцание — это Excel, пытающийся перерисовать экран, чтобы показать текущее состояние рабочего листа. К сожалению, каждый раз, когда Excel перерисовывает экран, он занимает ресурсы памяти.
Вы можете использовать Приложение. ScreenUpdating свойство, чтобы отключить обновления экрана, пока ваш макрос не завершится. Отключение обновления экрана экономит время и ресурсы, позволяя макросу работать немного быстрее. После того, как ваш макрокоманда завершен, вы можете снова включить обновление экрана.
После того, как свойство ScreenUpdating вернётся к True, Excel автоматически вызовет перерисовку экрана.
Отключение обновлений строки состояния
Строка состояния Excel, которая отображается в нижней части окна Excel, обычно отображает ход определенных действий в Excel.Если ваш макрос работает с большим количеством данных, строка состояния займет несколько ресурсов.
Важно отметить, что отключить обновление экрана отдельно от выключения отображения строки состояния. Строка состояния будет продолжать обновляться, даже если вы отключите обновление экрана. Вы можете использовать Приложение. Свойство DisplayStatusBar для временного отключения любых обновлений строки состояния, что еще больше улучшает производительность вашего макроса:
Указание Excel на игнорирование событий
Вы можете реализовать макросы как процедуры событий, указывая Excel на запуск определенного кода при изменении рабочего листа или рабочей книги.
Иногда стандартные макросы вносят изменения, которые вызывают процедуру события. Например, если у вас есть стандартный макрос, который манипулирует несколькими ячейками в Sheet1, каждый раз, когда ячейка на этом листе изменяется, ваш макрос должен приостанавливаться, пока выполняется событие Worksheet_Change.
Вы можете добавить еще один уровень повышения производительности, используя свойство EnableEvents, чтобы заставить Excel игнорировать события во время запуска макроса.
Перед запуском макроса установите для свойства EnableEvents значение False. После того, как ваш макрокоманда закончен, вы можете вернуть свойство EnableEvents значение True.
Скрытие разрывов страниц
Каждый раз, когда ваш макрос изменяет количество строк, изменяет количество столбцов или изменяет настройку страницы рабочего листа, Excel вынужден занять время, перерасчитывая разрывы страниц на листе.
Вы можете избежать этого поведения, просто скрыв разрывы страниц перед запуском своего макроса.
Установите для свойства листа DisplayPageBreaks значение False, чтобы скрыть разрывы страниц. Если вы хотите продолжать показывать разрывы страниц после запуска макроса, установите для свойства листа DisplayPageBreaks значение True.
Приостановка обновлений сводной таблицы
Если ваш макрос управляет сводными таблицами, которые содержат большие источники данных, вы можете испытывать слабую производительность при выполнении таких операций, как динамическое добавление или перемещение полей поворота.
Вы можете улучшить производительность своего макроса, приостановив перерасчет сводной таблицы до тех пор, пока не будут сделаны все изменения поля поворота. Просто установите PivotTable. Свойство ManualUpdate для True, чтобы отложить пересчет, запустите свой макрокоманд и затем установите сводную таблицу. Свойство ManualUpdate вернется к False, чтобы вызвать пересчет.
Очистка от копирования и вставки
Важно помнить, что хотя Macro Recorder экономит время, написав код VBA для вас, он не всегда записывает наиболее эффективный код. Ярким примером является то, как Macro Recorder захватывает любое действие копирования и вставки, которое вы выполняете во время записи.
Вы можете немного увеличить свои макросы, вырезав посредника и выполнив прямую копию из одной ячейки в ячейку назначения. Этот альтернативный код использует аргумент Destination для обхода буфера обмена и копирования содержимого ячейки A1 непосредственно в ячейку B1.
Если вам нужно скопировать только значения (не форматирование или формулы), вы можете повысить производительность еще больше, избегая при этом метода копирования. Просто установите значение ячейки назначения на то же значение, которое находится в исходной ячейке. Этот метод примерно в 25 раз быстрее, чем при использовании метода Copy:
Если вам нужно скопировать только формулы из одной ячейки в другую (а не значения или форматирование), вы можете установить формулу ячейки назначения той же формуле, содержащейся в исходной ячейке:
Использование оператора With
При записи макросов вы часто будете манипулировать одним и тем же объектом более одного раза. Вы можете сэкономить время и повысить производительность, используя оператор With для выполнения нескольких действий на данном объекте за один снимок.
Оператор With, используемый в следующем примере, сообщает Excel применять все изменения форматирования за один раз:
Привычка к чередованию действий в операторы With не только ускорит выполнение макросов, но и упростит чтение вашего макрокода.
Избегание метода Select
Macro Recorder предпочитает использовать метод Select для явного выбора объектов, прежде чем предпринимать действия над ними. Как правило, нет необходимости выбирать объекты перед их работой. Фактически, вы можете значительно улучшить производительность макросов, не используя метод Select.
После записи ваших макросов, сделайте привычкой изменять сгенерированный код, чтобы удалить методы Select. В этом случае оптимизированный код будет выглядеть следующим образом:
Обратите внимание, что ничего не выбрано.Код просто использует иерархию объектов для применения необходимых действий.
Ограничение поездок на рабочий лист
Еще один способ ускорить работу с макросами — ограничить количество ссылок на данные рабочего листа в вашем коде. Всегда менее эффективно захватывать данные из рабочего листа, чем из памяти. Другими словами, ваши макросы будут работать намного быстрее, если им не придется многократно взаимодействовать с рабочим листом.
Например, следующий простой код заставляет VBA непрерывно возвращаться к листам («Лист1»). Range («A1»), чтобы получить номер, необходимый для сравнения, выполняемого в инструкции If:
Более эффективным способом является сохранение значения в листах («Лист1»). Range («A1») к переменной MyMonth. Таким образом, код ссылается на переменную MyMonth вместо рабочего листа:
Рассмотрите возможность использования переменных для работы с данными в памяти, а не напрямую со ссылкой на рабочие листы.
Excel vba: Почему обновление экрана не обновляется, прежде чем отключать обновление экрана.
У меня есть суб, который начинается с вызова другого суб (который редактирует ячейки рабочей книги), а затем отключает обновление экрана и предупреждения. Дело в том, что первый юг, который редактирует книгу, находится перед вторым югу, ячейка не обновляется.
Когда я выключаю второй элемент, ячейка обновляется. Как я могу обновить ячейку, а затем отключить обновление экрана?
EDIT: обновление Экран уже верно, когда mainSub начинается; Комментируя setupApp sub out , он помогает, потому что он явно запускается раньше, чем ячейки редактируются несколько позже.
Создан 30 авг. 17 2017-08-30 13:36:04 Ans
Есть ли приложение.ScreenUpdating = False в getStateNames? – Moosli 30 авг. 17 2017-08-30 14:27:07
@Moosli Нет, нет – Ans 30 авг. 17 2017-08-30 14:32:24
Хорошо, давайте отправимся в Кахт. Вы можете увидеть это в комментариях в моем ответе. – Moosli 30 авг. 17 2017-08-30 14:36:50
Я действительно не понимаю, почему это не работает. Но вы можете попытаться вызвать SetupApp с помощью инструкции If. Для этого вам нужно привязать editSub к функции и в конце просто вернуть истинное значение. Что-то вроде этого:
Второе решение
Вы можете попытаться форсировать события с DoEvents для обновления экрана.
Или Помещенный DoEvents сразу после того, как вы написаны в клетках.
Если это не работает, вы можете попробовать метод Wait:
Первое решение
ли судимое вам повернуть ScreenUpdating на Перед выполнением Sub?
Создан 30 авг. 17 2017-08-30 13:50:20 Moosli
Не помогает. Экран updatin ** уже ** истинен при запуске суб. Комментирование второй суб ** помогает **, потому что она, очевидно, выполняется раньше, чем нужно. – Ans 30 авг. 17 2017-08-30 13:51:44
Сколько кода в editSub? Becuase, если есть только несколько строк, может быть, что UpdateEvent должен замедляться, и он будет отключен до обновления экрана. – Moosli 30 авг. 17 2017-08-30 13:54:33
Довольно много строк. Он берет некоторые данные, проверяет их, добавляет в массив и только затем редактирует ячейки со значениями из массива. – Ans 30 авг. 17 2017-08-30 13:56:28
@Ans Хорошо, я добавил мой Awnser – Moosli 30 авг. 17 2017-08-30 14:05:06
К сожалению, ни то, ни другое не помогает . Ожидание просто приводит к более длительному времени выполнения, в то время как ячейки все еще пусты, «DoEvents» ничего не влияет. – Ans 30 авг. 17 2017-08-30 14:14:20
Можете ли вы опубликовать код из editSup? – Moosli 30 авг. 17 2017-08-30 14:19:49
Я редактировал вопрос. – Ans 30 авг. 17 2017-08-30 14:22:53
Копилка знаний…..
Ускоряем выполнение VBA кода, а так же убираем ненужные уведомления (всплывающие окна).
Для того чтобы ускорить выполнение VBA кода в Excel, а так же скрыть мерцание экрана, лишние пересчёты формул, различные уведомления, на которые нужно нажать для продолжения выполнения кода и которые часто раздражают (подтверждение открытия файлов, данные сохраненные как текст и тд), а так же убрать не нужные пересчет формул который происходят постоянно при обновлении данных на которые они ссылаются можно использовать следующие команды, которые нужно добавить или в начало кода или перед конкретным нужным участком (если вы в курсе).
Excel.Application.ScreenUpdating = False ‘убирает обновление экрана. Можно использовать почти всегда — лишняя нагрузка на процессор.
Excel.Application.DisplayAlerts = False ‘убирает всплывающие окна. Совсем. Использовать аккуратно.
Excel.Application.EnablEevents = False ‘убирает обработку событий в Excel. События необходимо отключать для исключения зацикливания или выполнения незапланированных действий. Например при внесении одним макросом значения на лист и лишнего (не нужного) выполнения другого макроса по обработки события добавления значения на лист — который, как вариант, рассчитан на ручной ввод. Использовать только при необходимости.
Excel.Application.Calculation = xlCalculationManual ‘убирает автопересчет формул и зависимых от них объектов. Можно и нужно использовать почти всегда — лишняя нагрузка на процессор, особенно если формулы использующие массивы или поиск.
Не забываем ОБЯЗАТЕЛЬНО все вернуть обратно, чтобы пользователи не ругались = ) :
Excel.Application.ScreenUpdating = True
Excel.Application.DisplayAlerts = True
Excel.Application.EnableEvents = True
Excel.Application.Calculation = xlCalculationAutomatic
Навигация по записям
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Похожие статьи
Благодарю всех за пояснения.
БМВ, Ваш пример и правда гораздо нагляднее.
sokol92, Вы правы, думаю и у меня так и было раньше, а проблема не в этом. Значение у меня в False переключается, а вот обновление экрана при этом по прежнему происходит.
Дмитрий(The_Prist) Щербаков, Ваши пояснения особо в тему, потому что это как раз то, что мне нужно.
Моя «основная» процедура выглядит примерно так:
Код |
---|
Private Sub General() Application.ScreenUpdating = False '... Call SubProcedure '... Debug.Print Application.ScreenUpdating Application.ScreenUpdating = True End Sub |
Значение свойства ScreenUpdating меняется только дважды — на входе переключается на False и на выходе обратно на True (что, как я понял лучше всё-таки делать). Я проверял в разных подпроцедурах сохраняет ли свойство ScreenUpdating значение False — и оно везде сохраняется вплоть до возвращения обратно в головную процедуру. Т.е. насколько я понимаю, код должен работать как и задумано — обновление экрана выключено в ходе выполнения всех подпроцедур.
Однако несмотря на то, что ScreenUpdating=False, обновление экрана все равно происходит, это заметно чисто визуально. Хотя до недавнего времени этот же файл работал нормально (изменений в коде не производилось). Поэтому я и подумал, что ScreenUpdating включается при выходе из подпроцедур, хотя теперь понимаю что это не так.
Любопытный момент: если убрать строчку Application.ScreenUpdating = True из головной процедуры, всё начинает работать корректно (обновление экрана включается только в самом конце — при выходе из головной процедуры — автоматически).
Я не могу найти никакого логичного объяснения такому поведению приложения.
Содержание
- VBA — отключить обновление экрана
- Отключить обновление экрана
- Включить обновление экрана
- Пример обновления экрана VBA
- Обновление экрана Обновить
- Настройки VBA — код ускорения
- VBA – Turn off Screen Updating
- Disable ScreenUpdating
- Enable ScreenUpdating
- VBA ScreenUpdating Example
- ScreenUpdating Refresh
- VBA Settings – Speed Up Code
- VBA Coding Made Easy
- VBA Coding Made Easy
- VBA Code Examples Add-in
- Excel vba отключить обновление экрана
- Как отключить «мерцание» окна
- Обновление экрана
- Ускорение работы Excel-приложений.
- Application.ScreenUpdating = 0 (Макросы/Sub)
- Убрать мерцание экрана при выполнении кода (VBA+Excel)
- ScreenUpdating. VBA
- Есть ли команда разового обновления экрана в Excel
- Application.ScreenUpdating и панель задач
- Отключение обновление экрана
- Макрос для автоматического обновления файлов (Требуется помощь! Срочно!)
VBA — отключить обновление экрана
Как бы здорово это ни выглядело, наблюдая, как ваш макрос VBA манипулирует экраном, вы можете помочь вашему макросу работать быстрее, если отключите (отключите) ScreenUpdating.
Отключить обновление экрана
1. Чтобы отключить ScreenUpdating, в начале кода поместите эту строку:
1 | Application.ScreenUpdating = False |
Включить обновление экрана
2. Чтобы снова включить ScreenUpdating, в конце кода поместите эту строку:
1 | Application.ScreenUpdating = True |
Пример обновления экрана VBA
Тогда ваша процедура будет выглядеть так:
1234567891011 | Sub ScreenUpdating_Example ()Application.ScreenUpdating = False’Сделай что-нибудьДиапазон («a1»). Копировать диапазон («b1»)Диапазон («a2»). Копировать диапазон («b2»)Диапазон («a3»). Копировать диапазон («b3»)Application.ScreenUpdating = TrueКонец подписки |
Обновление экрана Обновить
Отключение ScreenUpdating заставит ваш код VBA работать НАМНОГО быстрее, но это также сделает вашу работу более профессиональной. Конечные пользователи обычно не хотят видеть закулисные действия ваших процедур (особенно, когда процедура выполняется медленно). Кроме того, вы можете не захотеть, чтобы конечные пользователи видели скрытые функции (например, скрытые рабочие листы). Я рекомендую отключить (и снова включить) ScreenUpdating практически во всех ваших процедурах.
Однако бывают случаи, когда вы хотите, чтобы экран обновился. Чтобы обновить экран, вам нужно будет временно снова включить ScreenUpdating (нет команды «обновить» экрана):
123 | Application.ScreenUpdating = True’Сделай что-нибудьApplication.ScreenUpdating = False |
Настройки VBA — код ускорения
Есть несколько других настроек, с которыми можно поиграть, чтобы улучшить скорость вашего кода.
Отключение автоматических вычислений может ОГРОМНО изменить скорость:
1 | Application.Calculation = xlManual |
Отключение строки состояния также имеет небольшое значение:
1 | Application.DisplayStatusBar = False |
Если ваша рабочая книга содержит события, вам обычно следует отключать события в начале процедуры:
1 | Application.EnableEvents = False |
Наконец, ваш код VBA может замедлиться, когда Excel пытается повторно вычислить разрывы страниц (Примечание: не все процедуры будут затронуты). Чтобы отключить отображение разрывов страниц, используйте эту строку кода:
Источник
VBA – Turn off Screen Updating
In this Article
As cool as it looks watching your VBA macro manipulate the screen, you can help your Macro run faster if you turn off (disable) ScreenUpdating.
Disable ScreenUpdating
1. To disable ScreenUpdating, At the beginning of your code put this line:
Enable ScreenUpdating
2. To re-enable ScreenUpdating, At the end of your code put this line:
VBA ScreenUpdating Example
Your procedure will then look like this:
ScreenUpdating Refresh
Disabling ScreenUpdating will make your VBA code run MUCH faster, but it will also make your work appear more professional. End-users typically don’t want to see the behind the scenes actions of your procedures (especially when the procedure runs slow). Also, you may not want end-users to see the behind the scenes functionality (ex. Hidden Worksheets). I recommend disabling (and re-enabling) ScreenUpdating in virtually all of your procedures.
However, there are some times when you want the screen to refresh. To refresh the screen, you will need to temporarily turn back on ScreenUpdating (there is no screen “refresh” command):
VBA Settings – Speed Up Code
There are several other settings to play with to improve your code speed.
Disabling Automatic Calculations can make a HUGE difference in speed:
Disabling the Status Bar will also make a small difference:
If your workbook contains events you should usually disable events at the beginning of your procedure:
Last, your VBA code can be slowed down when Excel tries to re-calculate page breaks (Note: not all procedures will be impacted). To disable displaying page breaks use this line of code:
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro – A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
VBA Code Examples Add-in
Easily access all of the code examples found on our site.
Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.
Источник
Excel vba отключить обновление экрана
Как отключить «мерцание» окна
Смотрите также восстановления значения переменной после выполнения макроса
: Хорошо, вариант с отвечает именно за Application.Calculation = xlCalculationAutomatic
ScreenUpdating в каждом 19:03, в сообщении работает, просто рекомендация действия существуют. ) это можно заранее будет здорово собрать: Application.EnableEvents: Юрий МMsgBox .ScreenUpdating ‘
где включение? строки кода вMishel915 до ее начального
увидят открытой книгу активной книгой, но панель задач. Application.EnableEvents = true макросе (имеется в № 4200?’200px’:»+(this.scrollHeight+5)+’px’);»>алгоритм вложенный: вернуть свойство вNic70y предсказать). всё на однойApplication.Calculation = xlManual
А что произошло? читаем
The_Prist#3: Всем доброе время состояния экселя №1, а неактивным листом подойдет?)KuklP sleep(100) Application.screenupdating = виду в цепочке «кнопка» вызывает функцию, изначальное положение после: Не, я неpaylevan
странице и, возможно,HugoПросто выход? Есть.ScreenUpdating = False: А что непонятного?вставьте строку (иначе суток!Дмитрий в панели задачТо есть консолидация: Sub ProductionPlan() false связанных макросов). та в свою завершения работы с махлюю,: Коллеги, спасибо большое узнать новые способы: Это смотря какая возможность попасть на ‘ изменяем Вы обновление отключаете, не закрывается книгаВ макросе одна: Один хороший человек «нажатой» книгу №2,
и обработка информацииDim x As
bedvit_Boroda_
очередь в цикле ним.уже много раз за комментарии. ускорения работы. задача, что на лист? У меняMsgBox .ScreenUpdating ‘ а обратно не База): за другой открываются на этом же или вообще никакой
будет в текущей Workbook: Имхо должно быть: Его вообще можно другую функциюNic70y так делал.При этом, вПри этом особенно
листе, какой код. — нет. читаем включаете. Я не
База.Close SaveChanges:=False две книги Excel. форуме выложил следующий не «нажатой». То книге но вSet x =
достаточно: Application.ScreenUpdating = не вырубать. ОнSGerman: Роман, спасибо заVemod рамках темы, прошу
ценны практические рекомендации
Я часто вообщеThe_PristEnd With
раз писал уже,Mishel915Set wb1 = macros. Позарез нужно это будут лишние новом генерируемом листе. GetObject(«F:ProductionPlanR14.xls») ‘открываем необходимую 1: Application.ScreenUpdating = сам вырубается при: Смех над теми, разъяснение.: Возможно дело в уточнить: можно ли, из опыта, подобные ничего не отключаю
: Здесь ДВЕ ячейки.End Sub что лучше возвращать: Такой код решает Workbooks.Open(Filename:=ThisWorkbook.Path & «Книга1») его применение, но звонки мне, иKuklP книгу 0 выходе из макроса. кто знает меньше,Так оно и разных версиях excel. чтобы ускорить работу комментарию — т.к. каждое А у ВасЮрий М занчения изменных параметров задачу: Set wb2 =
не получается. Может
лишняя трата моего: Нарколог: Вы пьете?’. Ваш кодPrisioner Отсюда, кстати, следует
Вас ни в было У меня на
Excel, отключить всюvikttur
отключение-включение только тормозит принудительный выход, если
: Запустил — и и свойств.
Application.ScreenUpdating = False Workbooks.Open(Filename:=ThisWorkbook.Path & «Книга2»)Первая потому, что я времени на объяснения)Пациент: Это вопрос
x.Close 0: Если нужно именно то, что Андрей коем случае неApplication.ScreenUpdating начал использовать 10м тоже все
анимацию?. процесс. изменение более одной что? Переключается.Private Sub Worksheet_Change(ByVal ‘ Отключаем “мерцание” книга используется в
Обновление экрана
настолько далек отПосему, я думаю
или предложение?Set x =
остановить выполнение кода написал выше
украшает.
с MSO 2010 отображается не зависимоТо есть чтобы,
The_PristНо это на ячейки.
Юрий М
Target As Range) окна Set wb1 качестве базы данных. всего этого. оптимальным решением будетЯ к тому Nothing
и посмотреть чтоSGermanПроблема решена, яи когда макрос от включение/выключения обновления например, при импорте: Из опыта: моих задачах и
Юрий М: А где вIf Target.Count > = Workbooks.Open(Filename:=ThisWorkbook.Path & Данные первой книгиМакрос помогает сделать добавлять свойство ShowWindowsInTaskbar — что этоEnd Sub
происходит, а потом:
уже сказал. А вызывал другой макрос, экрана.
данных, или, кИсходный код(копирование отдельных кодах — когда
: Не очень понимаю
Вашем примере Application.ScreenUpdating
1 Then Exit
«Книга1») ThisWorkbook.Activate ‘
применяются во второй обновление файла не
в начало и было: «подойдет?)»Guest решить — продолжатьManyasha цирк, он в
то приходилось вОтключение обновления помогает примеру, использовании счётчиков,
ячеек в основном) лист без формул вопрос — я
= True? Sub Возвращаем указатель текущего книге. открывая его вручную
конец процедур.Вариант с активной
: Спасибо за ответы.
или нет, тогда
, другом месте. Или
другом макросе прописывать когда операции на а также любых
был оптимизирован. Все и событий, а
ведь и такnervIf Not Intersect(Target, приложения (для избежания
В таком открытии (все как яRadist_514
книгой, но неактивнымKukLP, вы все вот такая конструкция:Спасибо, Марина ! я не знаю откл. нескольких листах, убирает других ситуациях значения вычисления перенеслись в вся обработка данных на листе это: >Запустите два раза.
Range(«A1»)) Is Nothing различных глюков) Set двух книг заметно понял делается из
: Здравствуйте! листом подойдет. правильно написали сApplication.ScreenUpdating = True
Хотел новой благодарностью местных традиций ?
SGerman мелькание. в ячейках изменялись
массивы. Так вот в массивах (без делаю. Куда ещё
Первый запуск (макроса): Then Exit Sub wb2 = Workbooks.Open(Filename:=ThisWorkbook.Path
мерцание на экране
исходного файла заНаткнулся на работеНо боюсь, меня точки зрения нормального
Stop Application.ScreenUpdating =
повысить Вашу репутацию
SGerman
: Зравствуйте !Rioran
без подмигиваний, проскальзываний этот оптимизированный код
обращения к листу попасть? :-)True ‘ проверяем
Application.ScreenUpdating = False
& «Книга2») Application.ScreenUpdating
перной книги.
раз). на маленькую неприятность.
поняли неправильно. На кода по открытию
FalseПри этом выскочит в очередной раз,
:
Почему-то далеко не
: и иных ресурсоёмких выполнялся в 6
в процессе).The_Prist’ отключаем False’здесь код
= True ‘Вопрос – возможно
ВОТ КАК БЫЛО
Написал макрос для
самом деле применение книги.
окошко такое же
но не вышлоkrosav4ig всегда помогает отключение
Nic70y
динамических эффектов. раз быстрее исходного.Хотя отключить обновление: Потому что это
‘ да, отключеноApplication.ScreenUpdating = 1
Возвращаем режим обновления ли при открытии
СКАЗАНО: проверки данных из свойства ScreenUpdating вНо мне как
как при ошибке, — наверно «многабукав»., Минут 10 собирал моргания стандартным способом, привет!
Dima S На 32-битной системе, экрана в 99%
не событийная процедура.ВторойEnd Sub экрана при измененииСледуя
двух подряд книг
200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub update() одного файла в нужном месте очень
раз интересен был но будет активны Но почему не
куски кода, чтобы200?’200px’:»+(this.scrollHeight+5)+’px’);»>Application.ScreenUpdating = FalseКак я понял: а ScreenUpdating чем
2010 офис. А случаев в общемSub io()True ‘ проверяем.
ran Вашим реконаписать из избавится от мерцанияWith Application ‘операции другом и дабы даже кстати. Т.е. ответ именно по
кнопки «Continue», которая выдается предупреждение ? сложилась хотя быApplication.ScreenUpdating = True по переписке разработчиков
не угодил? в 64-битной 2010
полезно.With Application Включено. А ведь
: А нигде! №4 написал код: первой книги. Тоесть с приложением/отключаем для не получить эпилептический
не стоит менять функции ScreenUpdating. продолжит выполнение кодаGuest_E приблизительная картинка.Может быть, есть ОТСЮДА (инглиш), в
Слэн
офис — на
paylevan
MsgBox .ScreenUpdating
мы его отключали)
В том и
Application.ScreenUpdating = False
первая книга должна повышения скорости работы припадок от мерцания
активный лист воЯ только начинаю и кнопка «End»,
: Добрый день! ЯВ результате при
еще какие-нибудь хитрости
ранних версиях Excel: для меня было 1/6 медленнее.: Спасибо,
.ScreenUpdating = FalseFalse вопрос — почему ‘ Отключаем “мерцание” откриваться, но не макроса
экрана добавил в избежание применения этого длинный путь изучения которая прервет процедуру. хотел спросить, какова добавлении поста ничего для полного отключения
компания Microsoft разрешала потрясающим, когда яНе будем вдаваться
ber$erk
MsgBox .ScreenUpdating
Юрий М
в одном случае
окна Set База
должна быть активной
.ScreenUpdating = False
начале главной процедуры
свойства. По скорости VBA, поэтому иEvgeny_1 роль или важность не добавилось ? разработчикам больший контроль оптимизацией алгоритма, вылизывая
в подробности, но.Exit Sub
: А теперь читаем продолжает работать, а
= GetObject _
даже на мгновение. ‘обновление экрана Application.ScreenUpdating = False ничего не выигрывается(если вопросы мои тривилальные.: Господа, прошу прощения
применения «ScreenUpdating =SGermanСпасибо за помощь над свойством буквально каждую строчку, по опыту можноВозможно есть ещёEnd With Димин пост от во втором - (PathName:=»C:Documents and SettingsПользовательРабочий
И если возможно
.DisplayAlerts = False , а в не сказать наоборот).Дъмитръ, я полагал если вопрос где-то False»? (так сказать,
: «Макрос» — этоHugoApplication.ScreenUpdating выжал 10% для сказать, что каждая
функции по ускорениюEnd Sub 03.12.2011, 16:14 нет!?
столКнига1.xls») ThisWorkbook.Activate ‘ то как?
‘вывод системных сообщений
конце Application.ScreenUpdating = Если Вы хотите
что ScreenUpdating отвечает
был раскрыт, но
для чего?) Заранее
любой код, как
: Здравствуйте.. И можно было сортировки массива, а оптимизация это отдельный работы Excel?Выполняя напрямую из
Ускорение работы Excel-приложений.
ranЮрий М Возвращаем указатель текущегоНапример, так неПапка = «полный
True. Всё отлично заполнять данными из за обновление экрана прочитав все темы благодарен!
я понял сПокажите пример в его отключить и пришел ZVI и процесс, требующий отдельного
Мне кажется, будет редактора VBA вы
: Да нет его!
: А мне ещё приложения (для избежания проходит. путь папки»
работало в оффисе других книг активный в целом, а в поиске поPavel55
Вашей веселой пиктограммки. файле когда не само оно уже «простым» переопределением типа подохода. полезным собрать на не отключаете обновлениеЯ знаю, что вот это непонятно:
различных глюков) SetApplication.ScreenUpdating = False’———— Excel-файлы в 2007, но сейчас
лист, используйте ScreenUpdating. не только в запросу (как в: Данное свойство отключает
Так вот, именно помогает. включается при определённых
переменной сделал 40%Основные принципы: этой странице все — иначе не надо вставлять включение.If Not Intersect(Target, wb1 = Workbooks.Open(Filename:=ThisWorkbook.Path ‘ Отключаем “мерцание”
этой папке —————— обновили на 2016 Если неактивный - выполняющемся VBA приложении. заголовке) ответа я обновление экрана (визуализацию) так я иSGerman условиях. Однако вхотя, конечно бывало,-вычисление самых тормозных основные функции и смогли бы видетьНо меня интересует
Range(«A1»)) Is Nothing & «Книга2») Application.ScreenUpdating окна Set wb1Имя = Dir(Папка и, как результат,
незачем, не нужно.KuklP не нашел.
и макрос намного делал ! В
: последующих версиях компания что оптимизацией алгоритма мест(как правило обращение приёмы, добавление и
ход выполнения. А не это, а Then Exit Sub = True ‘ = Workbooks.Open(Filename:=ThisWorkbook.Path & & «*.xls*») мерцание появилось. ПрошуThe_Prist в двух: 2. Это неВступление: быстрее выполняется, т.к. каждом «макросе» вHugo
принудительно ввела «перезагрузку» удавалось добиться ускорения к ячейкам, но
использование которых помогает вот с листа именно тот вопрос,При изменении в Возвращаем режим обновления «Книга1») Application.ScreenUpdating =
Do While Имя прощение за то, словах бы объяснил. функция, это свойство;Имеется наипростейшая процедурка не тратятся ресурсы начале вырубал, в, Проект слишком большой
метода. Таким образом, в 200 раз.. есть исключения; активация сделать исполнение макросов — да, отключается. который я задал!
ячейке А1 НИЧЕГО экрана при изменении True ‘ Возвращаем <> «» что не прилагаю У меня такого3. как только смысл которой таков: компьютера на отображение
конце — врубал — xls>800 Kb в новых версияхikki листов, книг, ячеек); более быстрым.
ranМожет конечно это
не произойдёт. Кроме База = NothingТоже режим обновления экранаWith .Workbooks.Open _ файл ибо это дара нет. процедура закончилась, свойство есть открытая активная действий на экране отображение.SGerman (там не понятно,:
-переводим тормоз вber$erk: Давайте попробую еще мой локальный глюк, выхода из процедуры, решает задачу. Кроме при изменении ThisWorkbook.Activate
(Filename:=Папка & Имя,
конфиденциальная информация. ЕслиEvgeny_1 автоматом возвращается в книга «расчет картона. reply
И у меня: Разобрался . каких именно) послеСлэн газ: исключаем все: , смысла особого раз объяснить. но у меня конечно. того, код не
‘ Возвращаем указатель UpdateLinks:=True) кто-то стыкался с: Я все понял
true(и это правильно, (разработка), необходимо открыть: Спасибо, Павел! Доходчиво все радостно моргало
Дело было в того, как макрос, а ссылки на
лишние активации объектов; в этом нет
Добавляю в код
после выхода поЮрий М
допускает появление кнопки текущего приложения (для’здесь Ваш макрос
такой проблемой при что вы хотели иначе пришлось бы в фоне книгу технически обьснил. А ! том, что алгоритм
отрабатывает — изменённая ту тему случаем операции сравнения ячеек(как
— тема со первой строкой строке
: Смотрите: «База» или «Книга1″ избежания различных глюков) делает свое грязное переходе на новую донести по поводу
перезапускать Экс в «productionplanR14» и снова на счет безопасности
Когда же все вложенный: «кнопка» вызывает им настройка не сохранилось? правило в циклах)
временем уедет вниз.MsgBox Application.ScreenUpdatingIf Target.Count >Вы отключили обновление:
на панели уведомлений,
Set wb2 =
дело
версию оффиса, подскажите,
ScreenUpdating. Спасибо вам
случае любого сбоя, активировать книгу «расчет что-то есть в внутренние переключения убрал, функцию, та вApplication.ScreenUpdating
Слэн и вычисления переводим Да и информация
Сколько я бы 1 Then ExitApplication.ScreenUpdating = False что может быть Workbooks.Open(Filename:=ThisWorkbook.Path & «Книга2»).Close SaveChanges:=True
пожалуйста, как пофиксить за это. или забывчивости программиста); картона (разработка)». этом? Как-то расслышал моргание исчезло. свою очередь ввозвращается в прежнее: вот: в массивы(с умом);
эта в 98% ни менял значение Sub
принудительно вышли, если преимуществом.Busine2009End With данную ситуацию.Неясным для меня1. я предложилКод таков: один раз. (мол говорилиВот так-то
цикле другую функцию, русло.ikki сводим обращение к
случаев гостям не в [A1], получаювозможность попасть на более одной ячейки:Относительно: Код: Sub P1()
осталась лишь одна вариант, при котором
Sub ProductionPlan()
Application.ScreenUpdating = 0 (Макросы/Sub)
что кто-то успеет,что-тоManyasha а та и
Особо отмечается, что
: спасибо. ячейкам листа к
интересна — им MsgBox True, не любой лист ExcelIf Target.Count >
База.Close SaveChanges:=Falseто этот Dim База As
Loop
vikttur вещь — это использование ScreenUpdating неApplication.ScreenUpdating = False
сделать!). Заранее огромное: не дуйтесь. Если тоже в цикле если перевести выполнениеоч.хорошая тема. минимуму; нужно готовое решение, смотря на принудительный появляется только после 1 Then Exit код не записывал Excel.Workbook Set База
.ScreenUpdating = True: Попробовать создать пример.
панель задач, в
нужно.
’Application.ShowWindowsInTaskbar = False
спасибо. бы Вы поискали,
— третью. И макроса в пошаговый
Nic70y-правильное объявление переменных(особенно а старожилы итак выход. выполнения Sub так как открытая = GetObject _ ‘обновление экрана Удалите все секретное, которой «нажатой» (активной)Evgeny_1Application.Workbooks.Open («F:ProductionPlanR14.xls») ‘открываемIgor67 что такое кругом стоит true/false. режим (с помощью: Отключаем обновление экрана массивы — рамер все об оптимизацииНо стоит мнеApplication.ScreenUpdating = True
а обновление не База нужна во (PathName:=»C:Documents and SettingsПользовательРабочий
.DisplayAlerts = True листы, с которыми
показывается временная книга,: KukLP, спасибо, разобрался, необходимую книгу: На работе написалCall Когда все внутренние F8 клавиши выполнять в начале макроса,
не должен быть знают (ну или скопировать 2 ячейкиЮрий М
включили. второй книге. столБаза.xls») ‘Проверяем, что ‘вывод системных сообщений
макрос не работает, которую я открывал, буду использовать предложеннуюApplication.Workbooks(«расчет картона (разработка).xls»).Activate макрос с открытиеми поняли, что строчки переключения отображения по 1-й строкев конце включаем. неоправданом велик); почти все :-)) — можно мышем: Покажите файл ТОЛЬКОThe_PristЦипихович Эндрю База открыта иEnd With внутри макроса закомментировать а не та вами схему. ‘активируем изначальную книгу исходной, копированием и написали, то тоже закомментарил, мерцание исчезло. кода), то свойство
Вопрос — а-при необходимости отключаемvikttur по листу щелкать с этим фрагментом.: Вопрос на засыпку:: по большому счёту посмотрим содержимое первогоEnd Sub чего-нибудь. Возможно, выявите книга, которая вKuklP’Application.ShowWindowsInTaskbar = True закрытием, снятиями защиты бы посмеялись)Всем спасибо !Application.ScreenUpdating обязательно включать?
отслеживание событий, обновление: Обработка ячеек листа до посинения, ничегоПытливый что делает эта
в начале процедуры листа первой ячейки.ВОТ КАК БЫЛО источник. действительности является активной: А вот GetObject,Application.ScreenUpdating = True и переходами. КомпЦитата Проблема решена.всегда будет TrueВроде как и экрана, вычисления, показ по сравнению с не происходит (в: Ну так The_Prist строка?а в конце MsgBox База.Worksheets(1).Cells(1, 1).Value СДЕЛАНО:Radist_514 на момент окончания как раз функция:-)End Sub
слабый, моргал какSGerman, 12.07.2016 вRAN независимо от установленной без включения, после предупреждений. обработкой данных в ячейку попасть не так и написал:If Target.Count > ничего не пишут ‘Закрываем. База.Close SaveChanges:=FalseКод200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub update(): Окей, обязательно попробую, макроса (по процедуре Ну, считайте занудой..Изначально в процедуре сумашедший. Обрабатывается куча 19:10, в сообщении
: Есть. разработчиком. И отслеживать завершения макроса он
Dima S массиве — тормоз.
могу, курсор -Если процедура завершается
1 Then ExitВ функции эту ‘Далее удаляем объектнуюWith Application спасибо! Думал, может
Убрать мерцание экрана при выполнении кода (VBA+Excel)
приведенной в 1м Все это я
естественно не было формул. Столбцы на № 7200?’200px’:»+(this.scrollHeight+5)+’px’);»>У меня
200?’200px’:»+(this.scrollHeight+5)+’px’);»>Call Макрос()
реальное состояние этого
обновляется.: Не использовать SelectВставка макросом формул стрелка) до того,
«естественным путем» через
Sub строку не пишут
переменную База. ‘Если.ScreenUpdating = False кто-то уже сталкивался
посте). Если например беру из справки строчек Application.ShowWindowsInTaskbar, которые А — закончились.вообще нет
включает обновление экрана, свойства можно будет
Или я чего-то без надобности вместо вычисления в как в VBA End Sub, тоДля общего понимания:И всё ОК, объектная переменная объявлена.DisplayAlerts = False с такой же временную книгу просто — F1. в коде выше
Мучался со вставкойCall Macros, как
и в этом только с помощью
не понимаю?
Range(«A1»).Select: Selection.Value = коде — тормоз. выполню обновление включается автоматом.
если Вы вышли разве нет.
внутри процедуры, ‘тоTest2 = «C:Test22.xlsx»
проблемой, в плане открыть и закрыть,
Evgeny_1
помечены как комментарии.
формул, их распространением и
макросе его снова ввода булевой переменной,Подскажите тупому пожалуйста. «Hello»Отключили обновление экрана,
Application.ScreenUpdating = TrueЕсли «неестественным» - из процедуры, завершаяА по правильному
это просто формальность,Testing = Dir(Test2 корня проблемы: это то в панели
: KukLP, я правильноРезультат вышеописанного кода на реальный диапазонсамих макросов нужно отключать.
которая будет дублироватьRoman777можно записать как а тут нужно. nerv
через Exit Sub её логически, т.е. да нужно в т.к. объектная переменная & «2.xls») из-за перехода на задач активной (нажатой) понимаю что эта в экселе выполняется данных.
.Возврат в исходную значение свойства при:Range(«A1») = «Hello»АналогичноНет такого, чтобы: Дмитрий, спасибо за автоматического включения обновления
дойдя до End конце процедуры всё сама ‘удалится послеDo While Testing обновленный софт или книги после выполнения
функция применима к правильно, то естьА решение -. только Function и процедуру — тоже. изменениях.
Nic70y и с Activate.»примени вот это - участие) Но если не происходит. Sub, то VBA же поставить в
завершения процедуры. Лучше <> «» просто я натупил
макроса вообще не любому кол-ву открываемых запустив макрос в ScreenUpdating = False SubSub — это
SGermanУпоминается, что «перезагрузка», Добрый день.Когда записать макрос и счастье на честно, то яnerv
сам возвращает значение Труе всегда использовать, ‘чтобы
With .Workbooks.Open _ где-то? Поэтому и будет. хотя на
книг/листов, из которых
текущей открытой книге,Поставил формулы с и есть макрос.: Уточнение.Application.ScreenUpdatingЛично у меня макрорекордером там будет века!
не понял :: А теперь читаем Application.ScreenUpdating в True.то есть 1 не забыть это(Filename:=Test2 & 2, интересуюсь, если из-за экране активной становится нужно в кучу
в фоне открывается двукратным запасом иМакрос внутри другого
Везде стояло, конечносвойства происходит, когда в любом случае
множество таких конструкций.
»
)
Димин пост от
Если же Вы
раз в начале
сделать тогда, когда
UpdateLinks:=True)
нового оффиса, то
та книга, которую
собрать информацию на
2я книга и
отключил обновление.
макроса можно вызвать же: задействуется другой макрос необходимость включить послеЕсли нужно вывестиpaylevanПравильно ли я 03.12.2011, 16:14Как плохо,
принудительно завершили процедуру Фальше и 1 это надо. Set.Close SaveChanges:=True как пофиксить, чтобы я в конце итоговом листе активной активной остается 1я
Раньше пользователи дергались так:200?’200px’:»+(this.scrollHeight+5)+’px’);»>Application.ScreenUpdating = False (?) или модуль. отключения остаётся, поскольку массив на лист,:
понимаю, что в что я не — то. короче ничего раз в конце База = NothingEnd With не тратить время
процедуры собственно и книги? книга. Однако в и пытались файлик200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub t1()Application.ScreenUpdating = TrueПомимо прочего нашёл всё-таки, с отключенным
то лучше неber$erk коде ниже оно умею читать!))) Спасибо,
никуда не возвращается. на Труе и End SubИмя = Dir на долгие поиски. указал сделать активной.Всмысле без принудительного панели задач почему
ScreenUpdating. VBA
не однократно загубить,’коди экран моргал в сети упоминания, обновлением не видно циклом в каждую, если собрать всё должно отключаться и
понял : )ran всёMishel915LoopІгор ГончаренкоЭта ситуация исправляется свойства ScreenUpdating =
то активной отображается а теперь МАШИНАEnd Sub как ненормальный :) что можно работать не только изменений, ячейку, а сразу воедино, то когда не включаться?Юрий М
: Но ведь здесьЯ почему так: Спасибо за отзыв..ScreenUpdating = True: не работал с только принудительным обновлением False у меня 2я книга, а СЧИТАЕТ и всеSub t2()Почему — так со свойством которые я выполняю весь массив в
тема со временемЕсли нет, то,
: Мало ли что в обоих случаях рассуждаю, потому что
Так тоже не.DisplayAlerts = True офис 2016, тем панели задач после ничего мелькать не не первая.
спокойно ждут.t1’Вызываем t1 и не понял.
Application.StatusBar в той или диапазон. уедет вниз, её
пожалуйста, приведите пример написал, Главное - принудительное завершение процедуры! надо пробовать в проходит. Применяю код:End With не менее уверен:
Есть ли команда разового обновления экрана в Excel
выполнения макроса (свойством будет при выполненииПри убирании ковычекПо времени не
End Sub Такое впечатление, чтои оно всегда иной ячейке, ноЮрий М легко будет найти когда, когда оно прочитать 🙂 АЯ специально удалил
разных процедурах иSub Макрос_Щелкнуть() Dim
End Sub1) что Application.ScreenUpdating ShowWindowsInTaskbar). Когда процедура макроса на фоне?
со строчек Application.ShowWindowsInTaskbar, скажу, по нервама можно так: false на false будет отображаться в
и просто какая: И я немного по тематическим запросам не включается) у Саши утро.
весь код, оставив глаза это не База As Excel.WorkbookПредварительно активировал макросы работает там так написана с принудительнымKuklP после выполнения макроса,
вообще 0.Код200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub t1() дает true экселе с учётом ячейка выделена. добавлю: в любом поисковике.Private Sub Worksheet_SelectionChange(ByValran только строки принудительного
Application.ScreenUpdating и панель задач
техника надо сажать Dim wb1 As и сделал их же как и обновлением панели задач,: Не правильно. Если в панели задачА то раньше’код
SGerman
изменений даже приNic70y- стараться использовать Поэтому, всё же, Target As Range): . выхода. робота чтобы считал Workbook Set База
доступными. Потом зашел
во всех предыдущих
то активное книга
Ваш итоговый лист
активным показывается правильная — придумал фигню
End Sub:
выключенном обновлении экрана.
: ну например
конструкцию With -
польза, мне кажется,With ApplicationЮрий МЕсли выходить по мерцание
= GetObject _ в Visual Basic версиях экселя совпадает с неактивен и в книга (изначальная из нам, а онаSub t2()RAN Опробовал — можно200?’200px’:»+(this.scrollHeight+5)+’px’);»>Sub tipakod() End With; есть.
Debug.Print .ScreenUpdating ‘: Что нужно выполнить, строкеran (PathName:=»C:Documents and SettingsПользовательРабочий нажал Insert -2) проблема не «нажатой» книгой на
это время вы
которой и запускался не работает. Call t1’Вызываем t1, задавать текст строки,
Application.ScreenUpdating = 0- максимально использовать
vikttur всегда True чтобы «сломалось»?If Not Intersect(Target,: Приветствую! столКнига1.xls») Set wb1 Module. Появилось окошко,
в переходе на панели задач. меняете на нем
макрос)Guest_EEnd SubУ меня вообще которая в моём[a1] = «8» переменные — один
, спасибо большое за.ScreenUpdating = Falsenerv
Range(«A1»)) Is NothingПомогите разобраться с
= Workbooks.Open(Filename:=ThisWorkbook.Path & куда и вставил
новую версию, аEvgeny_1 данные(берете из других
Вопрос:
: Спасибо Igor, обяснил
Андрей ( нет Call Macros,
2013-м Экселе показана
End Sub раз вычислили (присвоили)
практические рекомендации.Exit Sub: Пытливый, Юрий, а Then Exit Sub непонятным
«Книга2») Set База выше описанный макрос. проблема в Вашем: Я всетаки с
книг), то открытие-закрытиепочему Application.ScreenUpdating так на примерах, да,RAN
как и самих в самом низу,и все ок. значение, а затемber$erkEnd With
теперь скажите мнето Application.ScreenUpdating возвращаетсяPrivate Sub Worksheet_Change(ByVal
= Nothing End Жму Play ниче коде дома скину скриншот этих книг не работает странно, как хорошое решение пришло) рассказал про особенность
макросов. рядом с кнопкойне, наверное я обращаться только к
: не в обидуEnd Sub почему здесь результат в True, а
Target As Range) SubПеред открытием Книги2 не происходит(думал, чтодостаточно сделать так: проблемы с панелью повлияет на обновление избежать этого «бага»
людям! Я тебя 2-го способа (Кстати,Весь код - записи макроса. Также все-таки туплю. ним. будет сказано, ноЮрий М тот же самый) если по строке
Application.ScreenUpdating = False «мерцает» Книга1, тоесть операция маленькая может Sub X1 Application.ScreenUpdating задач. экрана, Вы никак
без прописывания дополнительных тоже признаю как я про нее на листах, формах в обход отключенногоRoman777- принудительный выход Вы пользовались поиском: У меня такогоНе утро, простоIf Target.Count >If Target.Count > База. быстро сделал). Закрыл = False X2Юрий М не сможете отследить строчек с Application.ShowWindowsInTaskbar. знатока форума! не знала. Андрей, и модулях - обновления экрана работает: из циклов, если прежде чем начать не происходит - с одного языка 1 Then Exit 1 Then ExitРазница в том, все сохраняя (но
‘ и все: Далась Вам эта это. Однако, изменениеНадеюсь описал непонятный
AndreA SN спасибо за информацию! только Function и и обновление внешнегоNic70y
достигнут результат. эту тему?
могу сразу после на другой пока
Sub Sub что при использовании
при сохранении были что написано тут панель задач :-)
данных на активном момент доступно. : Допустим, я отключил) Sub вида формы с, Что-то тут не- при использованииDima S копирования/вставки активировать любую еще туго переключаюсь)то нет.If Not Intersect(Target, GetObject кнопка «База» кучи каких-то надписей). после Х2 будет Представьте, что она листе НЕИЗБЕЖНО вызовет
Evgeny_1 обновление Application.screenupdating =Еще одна особенность:krosav4ig
помощью метода чисто, у меня вложенных Если (If): Отключили обновление экрана, ячейку. Параллельно на js
Вопрос возник в Range(«A1»)) Is Nothing или «Книга1» на Зашел в нужный мигать по страшной вообще не отображается. ScreenUpdating, если он: Пытаюсь прикрепить скриншот falseApplication.ScreenUpdating:.RePaint код отрабатывает, апервой а тут нужно. Вот-вотpaylevan сижу мастерю : процессе разбирательства с Then Exit Sub панели уведомлений отсутствует файл который должен силе Application.ScreenUpdating =Guest не установлен в проблемы — страницаНо потом мне
относится только кSGerman. лист остаётся пустым,(внешней) проверкой сразу — если весь: Здравствуйте. Прошу поделиться ) кодом, превая строкаEnd Sub (что тоже хорошо).
был обновиться, но True end sub: Мне эта панель False. Такого не с ответом виснет
нужно в определенный приложению Excel. Если, ну вы хотяВозвращаясь к изначальному до тех пор
отсекать ненужное. код все делает функциями, а такжеSub io() которогоЕсли изменить А1, Без использования GetObject он не обновился Sub X2 Application.ScreenUpdating задач действительно не произойдет, если не и скриншот вместе момент просто обновить Вы внутри макроса бы код покажите вопросу. Судя по пока не включуHugo через Ж. то приёмами, которые помогаютWith ApplicationApplication.ScreenUpdating = False то все продолжает кнопка «Книга1» на НИЧЕРТА! = False . сдалась, просто я
делать Ваш итоговый с постом не экран, чтобы посмотреть, используете, например, word,RAN
Отключение обновление экрана
всему, да, включать скринАпдейтинг. и честно
: Да, точно - отключение обновлений экрана ускорить выполнение макросов.Debug.Print .ScreenUpdatingпоследняя работать, а если панели уведомлений присутствует.Формуляр Application.ScreenUpdating = True пишу не только лист активным, либо загружается. — чего там в нем экран:крайне желательно говоря, не пойму, если в цикле тут не поможет.К примеру, чтобы.ScreenUpdating = FalseApplication.ScreenUpdating = True скопировать и вставитьBusine2009: Так зачем вы end Subа универсально для себя код все же прямоТолькоУчусь
у меня натворилось.
будет обновляться.Цитата. Ведь поведение программы почему вы могли часто используется проверкаКак по мне, экран не обновлялсяExit Sub
а внутри кода 2 ячейки, то: весь его код это пишется так но и для указав ScreenUpdating =: Объясню как сам И ничего дальшеЦитатаSGerman, 12.07.2016 в разработчики меняли со бы видеть результатand. and. and то наверное в при каждом исполнении
End With — прерывания. требуется принудительное включениеMishel915
искаверкали? Sub X2 Dim других людей, которые False. Как я понимаю это :)
не делать. ВычисленийSGerman, 12.07.2016 в 19:10, в сообщении временем и нет (если изначально ячейка
то использовать большинстве случаев для процесса, я используюEnd Subnerv обновления экрана.,Всё, что требовалось, aSU aSU = вообще далеки от упоминал, «как толькоМетод «Application.ScreenUpdating» отвечает в книге нет. 19:35, в сообщении № 7200?’200px’:»+(this.scrollHeight+5)+’px’);»>Весь код никакой уверенности, что А1 была пуста).if then ускорения работы макроса строку:ran: Всем добрый день)Юрий Мобложите 4 строку указать в константе Application.ScreenUpdating: Application.ScreenUpdating =
Макрос для автоматического обновления файлов (Требуется помощь! Срочно!)
VBA. И ради процедура закончилась, свойство за обновление экранаЕсть ли такая № 12200?’200px’:»+(this.scrollHeight+5)+’px’);»>В каждом — на листах, во всех версиях Мб у Васif then нужна оптимизация кода,
Application.ScreenUpdating = FalseКакие: Скопировать и вставитьОбъясните мне, пожалуйста,: А всё потому, кода в путь: False . Application.ScreenUpdating
их спокойствия я автоматом возвращается в
самого «Excel», но
команда обновления экрана? «макросе» в начале формах и модулях свойство будет работать
в коде всё-такиif then
а не вкл/выкл. ещё желательно добавить
[b5:b6] зачем включать обновление
что строка Application.ScreenUpdating#3
200?’200px’:»+(this.scrollHeight+5)+’px’);»>Папка = «C:Test2» = aSU end
пытаюсь сделать так, true», но хорошим
не других приложений.
RefSol вырубал, в конце
— только Function одинаково. Причём в есть включение, или
располагая проверки в
paylevan
строки в VBA-код,
Юрий М
экрана : ) = False срабатывает
командойДмитрий
Subа еще ошибки
чтобы все для
тоном будет вернуть Например, удаление значений
:
— врубал
и Sub
официальной документации нет
действие, после которого
порядке от более:
чтобы убыстрить, в: Скопировал, вставил -
Запустите два раза.
до принудительного выходаScreenUpdating
: Для англоязычной версии
отследить, чтобы дело
них было как
его директивно -
в ячейках, строк
AndreA SN
Application — относится
Цитата
никакого уточнения о Application.ScreenUpdating становится равным редкого условия кber$erk целом, работу Excel-приложения? что дальше?Sub io() из процедуры (Then. Excel также все дошло до выполнения можно проще и Application.ScreenUpdating = True. и т.д., попробуйте сделать так: к запущенному приложениюSGerman, 12.07.2016 в том, как метод True (если такие более частому (обычно
, конечно пользовался, ноber$erkranWith Application
Exit Sub). АИ после 6 оставлять ?
последней строки и
Источник
Содержание
- Отключить обновление экрана
- Включить обновление экрана
- Пример обновления экрана VBA
- Обновление экрана Обновить
Как бы здорово это ни выглядело, наблюдая, как ваш макрос VBA манипулирует экраном, вы можете помочь вашему макросу работать быстрее, если отключите (отключите) ScreenUpdating.
Отключить обновление экрана
1. Чтобы отключить ScreenUpdating, в начале кода поместите эту строку:
1 | Application.ScreenUpdating = False |
Включить обновление экрана
2. Чтобы снова включить ScreenUpdating, в конце кода поместите эту строку:
1 | Application.ScreenUpdating = True |
Тогда ваша процедура будет выглядеть так:
1234567891011 | Sub ScreenUpdating_Example ()Application.ScreenUpdating = False’Сделай что-нибудьДиапазон («a1»). Копировать диапазон («b1»)Диапазон («a2»). Копировать диапазон («b2»)Диапазон («a3»). Копировать диапазон («b3»)Application.ScreenUpdating = TrueКонец подписки |
Обновление экрана Обновить
Отключение ScreenUpdating заставит ваш код VBA работать НАМНОГО быстрее, но это также сделает вашу работу более профессиональной. Конечные пользователи обычно не хотят видеть закулисные действия ваших процедур (особенно, когда процедура выполняется медленно). Кроме того, вы можете не захотеть, чтобы конечные пользователи видели скрытые функции (например, скрытые рабочие листы). Я рекомендую отключить (и снова включить) ScreenUpdating практически во всех ваших процедурах.
Однако бывают случаи, когда вы хотите, чтобы экран обновился. Чтобы обновить экран, вам нужно будет временно снова включить ScreenUpdating (нет команды «обновить» экрана):
123 | Application.ScreenUpdating = True’Сделай что-нибудьApplication.ScreenUpdating = False |
Настройки VBA — код ускорения
Есть несколько других настроек, с которыми можно поиграть, чтобы улучшить скорость вашего кода.
Отключение автоматических вычислений может ОГРОМНО изменить скорость:
1 | Application.Calculation = xlManual |
Отключение строки состояния также имеет небольшое значение:
1 | Application.DisplayStatusBar = False |
Если ваша рабочая книга содержит события, вам обычно следует отключать события в начале процедуры:
1 | Application.EnableEvents = False |
Наконец, ваш код VBA может замедлиться, когда Excel пытается повторно вычислить разрывы страниц (Примечание: не все процедуры будут затронуты). Чтобы отключить отображение разрывов страниц, используйте эту строку кода:
1 | ActiveSheet.DisplayPageBreaks = False |
Вы поможете развитию сайта, поделившись страницей с друзьями
Disabling Screen Updates in Excel VBA
You can give your VBA code a performance boost by simply turning off screen updating while your code runs. This blog explains how to achieve this and how to create a basic timer to test the results.
Posted by
Andrew Gould
on 26 November 2015
You need a minimum screen resolution of about 700 pixels width to see our blogs. This is because they contain diagrams and tables which would not be viewable easily on a mobile phone or small laptop. Please use a larger tablet, notebook or desktop computer, or change your screen resolution settings.
One quick and easy technique to make your code run faster in Excel VBA is to
simply prevent the screen from being redrawn each time something changes.
You can achieve this by using the ScreenUpdating property of
the Application object.
Creating a Simple Example
To demonstrate the principle of this technique we’ll need a small example
procedure that makes lots of visible changes to the Excel workbook. You
can either download the example here, or create a new blank workbook, add around
five worksheets to it and then copy the code shown below into a new module.
Sub ColourInABunchOfCells()
Dim ws As Worksheet
Dim r As Range
For Each ws In Worksheets
ws.Select
For Each r In Range(«A1:Z50»)
r.Select
r.Interior.Color = rgbRed
Next r
Next ws
End Sub
Running the Code with Screen Updates On
Before disabling screen updates it’s worth running the code with the property
switched on so that you can appreciate the difference. Head back into
Excel and either press ALT + F8
on the keyboard or, from the ribbon select Developer | Macros.
On the dialog box that appears select the ColourInABunchOfCells
macro and then click the Run button.
Select the macro and then click
Run.
You should be able to see the Excel screen flickering in the background as the
macro carries out its tasks until, eventually, it finishes.
Disabling Screen Updates
The next time we run the procedure we don’t want to be able to see the screen
flickering in the background. To achieve this we need to add a single line
of code to the subroutine, just below the variable declarations. It’s
probably also worth changing the colour that we’re using so that we can see when
things have changed.
Sub ColourInABunchOfCells()
Dim ws As Worksheet
Dim r As Range
Application.ScreenUpdating = False
For Each ws In Worksheets
ws.Select
For Each r In Range(«A1:Z50»)
r.Select
r.Interior.Color = rgbBlue
Next r
Next ws
End Sub
Now switch back to Excel, display the list of macros by pressing ALT
+ F8 and then run the code again. This time
you won’t be able to see the macro carrying out its tasks; once the subroutine
has finished the screen will update once at the end to show you the final
result.
The ScreenUpdating property resets at the end of a
procedure. This means that if you run a different subroutine after the one
above and you haven’t added the line of code to disable screen updates to it,
you’ll be able to see the screen updating in the background.
Adding a Basic Timer
You may have noticed that when running the procedure with screen updates
disabled the subroutine appeared to run faster. This should certainly be
the case as Excel doesn’t have to continually redraw the screen each time
something changes. If we want to quantify how much time we’ve saved we can
add some code to create a basic timer system. The general structure of our
timer is shown below:
Sub BasicTimer()
Dim StartTime As Date, EndTime As Date
Dim TimeTaken As Double
StartTime = Time
EndTime = Time
TimeTaken = (EndTime — StartTime) * 24 * 60 * 60
MsgBox TimeTaken
End Sub
This isn’t the most accurate timer system you can create in VBA but it’s good
enough for our example. Should you need something a little more accurate
you might want to investigate the
Timer
function instead. Alternatively, if you’re feeling ambitious, you might
consider using some Windows API functions to
create
incredibly accurate timers.
Adding this timer system to our colour macro should result in the following
code:
Sub ColourInABunchOfCells()
Dim ws As Worksheet
Dim r As Range
Dim StartTime As Date, EndTime As Date
Dim TimeTaken As Double
StartTime = Time
Application.ScreenUpdating = False
For Each ws In Worksheets
ws.Select
For Each r In Range(«A1:Z50»)
r.Select
r.Interior.Color = rgbGreen
Next r
Next ws
EndTime = Time
TimeTaken = (EndTime — StartTime) * 24 * 60 * 60
MsgBox TimeTaken
End Sub
When you run the subroutine again you should now see the time taken in
seconds displayed at the end of the procedure. You should test this both
with and without screen updating to determine how much faster your code runs.
Your results will vary depending on your computer’s specifications and a
range of other factors but you should certainly see an improvement in
performance when screen updates are turned off.
A More Complex Example
Although the example above demonstrates the principle of the technique, it
doesn’t really reflect the type of code you’re likely to write in the real
world. The example below is slightly more realistic. The basic idea
behind this example is to separate a list of films into separate worksheets
based on each film’s genre.
The idea is to create a separate worksheet for each genre and copy each film into the appropriate sheet.
You can download the completed example file here and the code is shown below for
your reference.
Sub SeparateFilmsByGenre()
Dim Genre As String
Dim StartTime As Date, EndTime As Date
Dim TimeTaken As Double
Dim ws As Worksheet
Application.ScreenUpdating = False
StartTime = Time
wsMovies.Select
Range(«A2»).Select
Do Until ActiveCell.Value = «»
Genre = ActiveCell.Offset(0, 7).Value
If Not SheetExists(Genre) Then
Worksheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = Genre
wsMovies.Range(«A1»).EntireRow.Copy ActiveCell
Range(«A2»).Select
End If
wsMovies.Select
ActiveCell.EntireRow.Copy
Worksheets(Genre).Select
ActiveCell.PasteSpecial
ActiveCell.Offset(1, 0).Select
wsMovies.Select
ActiveCell.Offset(1, 0).Select
Loop
Application.CutCopyMode = False
For Each ws In Worksheets
ws.Select
Range(«A1»).Select
ActiveCell.CurrentRegion.EntireColumn.AutoFit
Next ws
wsMovies.Select
EndTime = Time
TimeTaken = (EndTime — StartTime) * 24 * 60 * 60
MsgBox TimeTaken & » seconds»
End Sub
Function SheetExists(SheetName As String) As Boolean
On Error GoTo NoSheet
Sheets(SheetName).Select
SheetExists = True
Exit Function
NoSheet:
SheetExists = False
End Function
There’s also a simple routine that you can run to reset the workbook back to
the original state by deleting all of the genre worksheets.
Sub DeleteAllButMovies()
Dim ws As Worksheet
Application.DisplayAlerts = False
For Each ws In Worksheets
If Not ws Is wsMovies Then ws.Delete
Next ws
End Sub
Again, to test the performance gain you should run the code with screen
updates turned on and then turned off.
An Alternative Approach: Avoiding Selecting Things
Although you can save a lot of time by turning screen updates off, you can
also find performance gains by writing your code in such a way that Excel needs
to update the screen as little as possible. The easiest way to achieve
this to avoid selecting or activating objects such as worksheets and ranges as
much as possible. In the example code shown below the only time an object
is selected is when a new worksheet is added to the workbook.
Sub SeparateFilmsAvoidingSelectingThings()
Dim Genre As String
Dim StartTime As Date, EndTime As Date
Dim TimeTaken As Double
Dim ws As Worksheet
Dim r As Range, rs As Range
StartTime = Time
Set rs = _
wsMovies.Range(«A2», wsMovies.Range(«A1»).End(xlDown))
For Each r In rs
Genre = r.Offset(0, 7).Value
If Not SheetExists(Genre) Then
Worksheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = Genre
wsMovies.Range(«A1»).EntireRow.Copy ActiveCell
End If
r.EntireRow.Copy _
Worksheets(Genre).Range(«A1048576»).End(xlUp).Offset(1, 0)
Next r
Application.CutCopyMode = False
For Each ws In Worksheets
ws.Range(«A1»).CurrentRegion.EntireColumn.AutoFit
Next ws
EndTime = Time
TimeTaken = (EndTime — StartTime) * 24 * 60 * 60
MsgBox TimeTaken & » seconds»
End Sub
Running this code even with screen updates turned on results in the following
time:
This code runs quickly even with screen updates turned on.
This blog has 0 threads
Add post