Return to VBA Code Examples
In this Article
- Turn Off Automatic Calculations
- Turn Automatic Calculations Back On
- Disable Automatic Calculations Macro Example
- Manual Calculation
- VBA Settings – Speed Up Code
- VBA Coding Made Easy
Whenever you update a cell value, Excel goes through a process to recalculate the workbook. When working directly within Excel you want this to happen 99.9% of the time (the exception being if you are working with an extremely large workbook). However, this can really slow down your VBA code. It’s a good practice to set your calculations to manual at the beginning of macros and restore calculations at the end of macros. If you need to recalculate the workbook you can manually tell Excel to calculate.
Turn Off Automatic Calculations
You can turn off automatic calculation with a macro by setting it to xlmanual. Use the following piece of VBA code:
Application.Calculation = xlManual
Turn Automatic Calculations Back On
To turn back on automatic calculation with the setting xlAutomatic:
Application.Calculation = xlAutomatic
I recommend disabling Automatic calculations at the very beginning of your procedure and re-enabling Automatic Calculations at the end. It will look like this:
Disable Automatic Calculations Macro Example
Sub Auto_Calcs_Example()
Application.Calculation = xlManual
'Do something
Application.Calculation = xlAutomatic
End Sub
Manual Calculation
When Automatic calculations are disabled, you can use the Calculate command to force Excel to recalculate:
Calculate
You can also tell Excel to recalculate only an individual worksheet:
Worksheets("sheet1").Calculate
You can also tell VBA to recalculate just a range (click to read our article about VBA calculation methods)
Here is how this might look inside a macro:
Sub Auto_Calcs_Example_Manual_Calc()
Application.Calculation = xlManual
'Do Something
'Recalc
Calculate
'Do More Things
Application.Calculation = xlAutomatic
End Sub
VBA Settings – Speed Up Code
If your goal is to speed up your code, you should also consider adjusting these other settings:
Disabling Screenupdating can make a huge difference in speed:
Application.ScreenUpdating = False
Turning off the Status Bar will also make a small difference:
Application.DisplayStatusBar = False
If your workbook contains events you should also disable events at the start of your procedures (to speed up code and to prevent endless loops!):
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 turn off DisplayPageBreaks 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!
Learn More!
bobyjoy Пользователь Сообщений: 218 |
Уважаемые коллеги добрый день Подскажите пожалуйста есть как в коде в ВБА прописать перед началом работы макроса отключение автоматического пересчета формул КРОМЕ текущего листа (где работает макрос) в VBA и затем после отработки макроса, обратно включить везде пересчет формул? |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
Цикл по листам. У неугодных вырубаем калькуляцию (sheets(i).enablecalculation=false). Перед окончанием кода в цикле врубаете калькуляцию. <#0> |
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#3 21.04.2017 16:45:46 Куда практичнее вырубить калькуляцию для всего приложения, а потом в нужных местах для нужных диапазонов делать пересчет. Или для всего диапазона нужного листа:
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
bobyjoy Пользователь Сообщений: 218 |
Почему то не получается, отключается везде пересчет. |
bobyjoy Пользователь Сообщений: 218 |
The_Priest |
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#6 25.04.2017 10:40:25
расшифруйте. Везде — это где? В активной книге, во всем приложении? Или что еще? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
kuklp Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
bobyjoy, мой Вам совет, опишите свою задачу(с примером, как положено), а не Ваше видение ее решения. Может получите гораздо более эффективный результат. Я сам — дурнее всякого примера! … |
bobyjoy Пользователь Сообщений: 218 |
У меня маркос лагает, медленно считает, если на любой книге открытой включая текущую ( в которой макрос) и сторонюю, есть какие либо масивы с формлами (не относятся к макросу). Если отключать автоматический пересчет, в таком случае он работает быстро. Я переключил пересчет на ручной и благодаря макросу Sheets(2).UsedRange.Calculate он стал работать быстро. |
bobyjoy Пользователь Сообщений: 218 |
Sheets(«Pivot2»).UsedRange.Calculate всетаки не много не корректно считает, подскажите пожалуйста отражает ли эта формула активизацию пересчта на всем листе (всех сводных и формул)? |
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
UsedRange — это все ячейки, в которых есть значение, формула или форматирование. Следовательно да. Но сводные отдельные объекты и они не будут пересчитываться методом Calculate, т.к. пересчет на них вообще не влияет. У них есть метод Refresh. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
bobyjoy Пользователь Сообщений: 218 |
#11 25.04.2017 12:02:13
Посмотрите пожалуйста если есть возможность, как мне сделать так что бы все свобные несмотря на отключенный пересчет обновлялись при каждой итерации в коде? Изменено: bobyjoy — 25.04.2017 13:30:07 |
||
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#12 25.04.2017 12:11:33
я уже написал — сводные и так обновляются несмотря на пересчет. Они от него вообще не зависят. Другой вопрос в том, что скорее всего есть необходимость пересчитывать формулы таблиц, являющихся источником данных для этих сводных. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Содержание
- Отключить автоматические вычисления
- Снова включите автоматические вычисления
- Пример макроса «Отключить автоматические вычисления»
- Расчет вручную
Каждый раз, когда вы обновляете значение ячейки, Excel выполняет процесс пересчета книги. При работе непосредственно в Excel вы хотите, чтобы это происходило в 99,9% случаев (за исключением случаев, когда вы работаете с очень большой книгой). Однако это может действительно замедлить ваш код VBA. Рекомендуется устанавливать вычисления вручную в начале макроса и восстанавливать вычисления в конце макроса. Если вам нужно пересчитать книгу, вы можете вручную указать Excel для расчета.
Отключить автоматические вычисления
Вы можете отключить автоматический расчет с помощью макроса, установив для него значение xlmanual. Используйте следующий фрагмент кода VBA:
1 | Application.Calculation = xlManual |
Снова включите автоматические вычисления
Чтобы снова включить автоматический расчет с настройкой xlAutomatic:
1 | Application.Calculation = xlAutomatic |
Я рекомендую отключить автоматические вычисления в самом начале процедуры и снова включить автоматические вычисления в конце. Это будет выглядеть так:
Пример макроса «Отключить автоматические вычисления»
12345678 | Sub Auto_Calcs_Example ()Application.Calculation = xlManual’Сделай что-нибудьApplication.Calculation = xlAutomaticКонец подписки |
Расчет вручную
Когда автоматические вычисления отключены, вы можете использовать Рассчитать команда для принудительного пересчета Excel:
Вы также можете указать Excel, чтобы он пересчитывал только отдельный рабочий лист:
1 | Рабочие листы («лист1»). Рассчитать |
Вы также можете указать VBA пересчитать только диапазон (щелкните, чтобы прочитать нашу статью о методах вычисления VBA)
Вот как это может выглядеть внутри макроса:
12345678910111213 | Sub Auto_Calcs_Example_Manual_Calc ()Application.Calculation = xlManual’Сделай что-нибудь’RecalcРассчитать’Делай больше вещейApplication.Calculation = xlAutomaticКонец подписки |
Настройки VBA — код ускорения
Если ваша цель — ускорить код, вам также следует подумать о настройке следующих параметров:
Отключение обновления экрана может существенно повлиять на скорость:
1 | Application.ScreenUpdating = False |
Отключение строки состояния также имеет небольшое значение:
1 | Application.DisplayStatusBar = False |
Если ваша книга содержит события, вам также следует отключить события в начале ваших процедур (чтобы ускорить код и предотвратить бесконечные циклы!):
1 | Application.EnableEvents = False |
Наконец, ваш код VBA может замедлиться, когда Excel пытается повторно вычислить разрывы страниц (Примечание: не все процедуры будут затронуты). Чтобы отключить DisplayPageBreaks, используйте эту строку кода:
1 | ActiveSheet.DisplayPageBreaks = False |
Вы поможете развитию сайта, поделившись страницей с друзьями
Содержание
- VBA — отключить (или включить) автоматические вычисления
- Отключить автоматические вычисления
- Снова включите автоматические вычисления
- Пример макроса «Отключить автоматические вычисления»
- Расчет вручную
- Настройки VBA — код ускорения
- VBA – Turn Automatic Calculations Off (or On)
- Turn Off Automatic Calculations
- Turn Automatic Calculations Back On
- Disable Automatic Calculations Macro Example
- Manual Calculation
- VBA Settings – Speed Up Code
- VBA Coding Made Easy
- VBA Code Examples Add-in
- Как ускорить и оптимизировать код VBA
VBA — отключить (или включить) автоматические вычисления
Каждый раз, когда вы обновляете значение ячейки, Excel выполняет процесс пересчета книги. При работе непосредственно в Excel вы хотите, чтобы это происходило в 99,9% случаев (за исключением случаев, когда вы работаете с очень большой книгой). Однако это может действительно замедлить ваш код VBA. Рекомендуется устанавливать вычисления вручную в начале макроса и восстанавливать вычисления в конце макроса. Если вам нужно пересчитать книгу, вы можете вручную указать Excel для расчета.
Отключить автоматические вычисления
Вы можете отключить автоматический расчет с помощью макроса, установив для него значение xlmanual. Используйте следующий фрагмент кода VBA:
1 | Application.Calculation = xlManual |
Снова включите автоматические вычисления
Чтобы снова включить автоматический расчет с настройкой xlAutomatic:
1 | Application.Calculation = xlAutomatic |
Я рекомендую отключить автоматические вычисления в самом начале процедуры и снова включить автоматические вычисления в конце. Это будет выглядеть так:
Пример макроса «Отключить автоматические вычисления»
12345678 | Sub Auto_Calcs_Example ()Application.Calculation = xlManual’Сделай что-нибудьApplication.Calculation = xlAutomaticКонец подписки |
Расчет вручную
Когда автоматические вычисления отключены, вы можете использовать Рассчитать команда для принудительного пересчета Excel:
Вы также можете указать Excel, чтобы он пересчитывал только отдельный рабочий лист:
1 | Рабочие листы («лист1»). Рассчитать |
Вы также можете указать VBA пересчитать только диапазон (щелкните, чтобы прочитать нашу статью о методах вычисления VBA)
Вот как это может выглядеть внутри макроса:
12345678910111213 | Sub Auto_Calcs_Example_Manual_Calc ()Application.Calculation = xlManual’Сделай что-нибудь’RecalcРассчитать’Делай больше вещейApplication.Calculation = xlAutomaticКонец подписки |
Настройки VBA — код ускорения
Если ваша цель — ускорить код, вам также следует подумать о настройке следующих параметров:
Отключение обновления экрана может существенно повлиять на скорость:
1 | Application.ScreenUpdating = False |
Отключение строки состояния также имеет небольшое значение:
1 | Application.DisplayStatusBar = False |
Если ваша книга содержит события, вам также следует отключить события в начале ваших процедур (чтобы ускорить код и предотвратить бесконечные циклы!):
1 | Application.EnableEvents = False |
Наконец, ваш код VBA может замедлиться, когда Excel пытается повторно вычислить разрывы страниц (Примечание: не все процедуры будут затронуты). Чтобы отключить DisplayPageBreaks, используйте эту строку кода:
Источник
VBA – Turn Automatic Calculations Off (or On)
In this Article
Whenever you update a cell value, Excel goes through a process to recalculate the workbook. When working directly within Excel you want this to happen 99.9% of the time (the exception being if you are working with an extremely large workbook). However, this can really slow down your VBA code. It’s a good practice to set your calculations to manual at the beginning of macros and restore calculations at the end of macros. If you need to recalculate the workbook you can manually tell Excel to calculate.
Turn Off Automatic Calculations
You can turn off automatic calculation with a macro by setting it to xlmanual. Use the following piece of VBA code:
Turn Automatic Calculations Back On
To turn back on automatic calculation with the setting xlAutomatic:
I recommend disabling Automatic calculations at the very beginning of your procedure and re-enabling Automatic Calculations at the end. It will look like this:
Disable Automatic Calculations Macro Example
Manual Calculation
When Automatic calculations are disabled, you can use the Calculate command to force Excel to recalculate:
You can also tell Excel to recalculate only an individual worksheet:
You can also tell VBA to recalculate just a range (click to read our article about VBA calculation methods)
Here is how this might look inside a macro:
VBA Settings – Speed Up Code
If your goal is to speed up your code, you should also consider adjusting these other settings:
Disabling Screenupdating can make a huge difference in speed:
Turning off the Status Bar will also make a small difference:
If your workbook contains events you should also disable events at the start of your procedures (to speed up code and to prevent endless loops!):
Last, your VBA code can be slowed down when Excel tries to re-calculate page breaks (Note: not all procedures will be impacted). To turn off DisplayPageBreaks 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 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.
Источник
Как ускорить и оптимизировать код VBA
- Если в коде есть много всяких Activate и Select , тем более в циклах — следует немедленно от них избавиться. Как это сделать я писал в статье: Select и Activate — зачем нужны и нужны ли?
- Обязательно на время выполнения кода отключить:
- автоматический пересчет формул . Чтобы формулы не пересчитывались при каждой манипуляции на листе во время выполнения кода — это может дико тормозить код, если формул много:
Если во время кода все же нужно пересчитывать какие-то диапазоны, то можно пересчитывать только их:
если печать производится внутри кода, то эту строку желательно вставить сразу после строки, выводящей лист на печать(при условии, что печать не происходит в цикле. В этом случае — по завершению цикла печати).
Я советую всегда отключать разбиение на страницы, т.к. это может тормозить весьма значительно, т.к. заставляет при любом изменении на листах обращаться к принтеру и переопределять кол-во и размер печатных страниц. А это порой очень не быстро.
На всякий случай можно отключить отображение информации в строке статуса 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-битных системах
If s <> s1 Then будет медленнее, чем
If StrComp(s, s1, vbBinaryCompare) <> 0
и тем более, если при сравнении необходимо не учитывать регистр:
If LCase(s) <> LCase(s1) Then будет медленнее, чем
If StrComp(s, s1, vbTextCompare) <> 0
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 секунды, то вероятно нет смысла его дальше оптимизировать. Конечно, если этот код не из тех, которые просто изменяют значение одной-двух ячеек.
Статья помогла? Поделись ссылкой с друзьями!
Источник
How to stop formulas and functions from updating in Excel when running a macro. This can save you a lot of time if you have a large or complex spreadsheet that relies on lots of formulas or cross-spreadsheet functions.
Sections:
Code
Example
Notes
Code
Disable Calculations
Prevent Excel from updating formulas and functions automatically. This should go at the start of your macro.
Application.Calculation = xlCalculationManual
Enable Calculations
Enable normal formula/function updating once again. This should go at the end of your macro.
Application.Calculation = xlCalculationAutomatic
Example
Here, I will make a small macro that inserts the value «hi» into cell C1. In the same worksheet, I have a few RAND() functions that generate a random decimal number each time the worksheet is recalculated, such as when a value is input into a cell.
Here is the full macro:
Sub insert_value()
Application.Calculation = xlCalculationManual
'Code to run here
Range("C1").Value = "hi"
Application.Calculation = xlCalculationAutomatic
End Sub
Here is the spreadsheet after I run the macro:
You can see the three RAND values on the left.
If you just ran the macro you will notice that the RAND values did update! However, it will have happened so fast that you couldn’t have noticed that the calculation did not happen after the value was input into cell C1 but, instead, it happened when calculations were turned back on at the end of the macro.
Note: once you turn the calculations back on, everything will recalculate at that moment.
If you do not want the spreadsheet to recalculate, just remove or comment-out the last line like this:
When I run this code, the RAND values will now not update at all.
Note: if you turn calculations off in a macro, that means that you will need to manually turn them back on or manually calculate them.
Turn Calculations (back) On Manually
Formulas tab > Calculation section > Then click Calculate Now or Calculate Sheet to calculate the worksheet but leave the calculation setting the same or click Calculation Options and then choose the desired calculation setting.
Notes
This is one of those things that is not always needed for your macros. If you have a small worksheet and there are no performance issues when updating formulas and functions, then don’t worry about using this.
However, if you notice a lag from when you enter data to when the spreadsheet «catches-up» and updates everything, then this code will help your macros run faster.
In the attached file, the calculation code has been commented-out so you can test it with and without that code.
Make sure to download the attached file to work with these examples in Excel.
Similar Content on TeachExcel
Prevent Excel Alerts and Messages Appearing While Running a Macro in Excel
Tutorial: How to stop an Excel alert window or message box from appearing while running a macro. Thi…
Run a Macro When a Specific Cell Changes in Excel
Tutorial:
Run a macro in Excel when a specific cell is changed; this also covers when a cell within…
Get Data from the Worksheet into a Macro in Excel
Tutorial: Here, you’ll learn how to get information from the Excel worksheet into a macro so you can…
Put Data into a Worksheet using a Macro in Excel
Tutorial: How to input data into cells in a worksheet from a macro.
Once you have data in your macro…
What is a Macro in Excel?
Tutorial: This is the first step to learning about Macros for Excel and how to use them.
What is a…
5 Simple Tips for Making BETTER Macros in Excel!
Tutorial:
5 ways to make better Macros in Excel — fewer errors, smoother coding, less fuss!
These 5…