10 способів прискорити роботу макросів

Оскільки макроси Excel стають все більш надійними та складними, ви можете виявити, що вони втрачають продуктивність. Під час обговорення макросів слово продуктивність зазвичай є синонімом швидкості . Швидкість — це те, наскільки швидко ваші процедури VBA виконують свої передбачувані завдання. Нижче наведено десять способів, які допоможуть підтримувати роботу макросів Excel на оптимальному рівні продуктивності.

Зупинка розрахунків аркуша

Чи знаєте ви, що кожного разу, коли комірка, яка впливає на будь-яку формулу у вашій електронній таблиці, змінюється або маніпулюється, Excel перераховує весь аркуш? На робочих аркушах, які містять велику кількість формул, така поведінка може різко сповільнити роботу макросів.

Ви можете використовувати властивість Application.Calculation, щоб повідомити Excel перейти в режим ручного обчислення. Коли книга перебуває в режимі ручного обчислення, вона не буде перерахована, доки ви явно не запустить обчислення, натиснувши клавішу F9.

Переведіть Excel в режим ручного обчислення, запустіть свій код, а потім перейдіть до автоматичного режиму обчислення.

Підмакрос1()
Application.Calculation = xlCalculationManual
 'Помістіть свій код макросу тут
Application.Calculation = xlCalculationAutomatic
Кінець суб

Повернення режиму обчислення на xlCalculationAutomatic автоматично запускає перерахунок робочого аркуша, тому не потрібно натискати клавішу F9 після запуску макросу.

Вимкнення оновлення екрана аркуша

Ви можете помітити, що під час запуску макросів ваш екран досить мерехтить. Це мерехтіння означає, що Excel намагається перемалювати екран, щоб показати поточний стан аркуша. На жаль, кожен раз, коли Excel перемальовує екран, він займає ресурси пам’яті.

Ви можете використовувати властивість Application.ScreenUpdating, щоб вимкнути оновлення екрана, доки ваш макрос не завершиться. Вимкнення оновлення екрана економить час і ресурси, дозволяючи вашому макросу працювати трохи швидше. Після завершення роботи коду макросу ви можете знову ввімкнути оновлення екрана.

Підмакрос1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
 'Помістіть свій код макросу тут
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Кінець суб

Після того як ви встановите для властивості ScreenUpdating значення True, Excel автоматично запустить перемалювання екрана.

Вимкнення оновлень рядка стану

Рядок стану Excel, який з’являється внизу вікна Excel, зазвичай відображає перебіг певних дій у Excel. Якщо ваш макрос працює з великою кількістю даних, рядок стану займе певні ресурси.

Важливо зазначити, що вимкнення оновлення екрана є окремою від вимкнення відображення рядка стану. Рядок стану продовжуватиме оновлюватися, навіть якщо ви вимкнули оновлення екрана. Ви можете використовувати властивість Application.DisplayStatusBar, щоб тимчасово вимкнути будь-які оновлення рядка стану, ще більше покращуючи продуктивність вашого макросу:

Підмакрос1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
 'Помістіть свій код макросу тут
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Кінець суб

Повідомлення Excel ігнорувати події

Ви можете реалізувати макроси як процедури подій, вказуючи Excel запускати певний код, коли аркуш або книга змінюються.

Іноді стандартні макроси вносять зміни, які запускають процедуру події. Наприклад, якщо у вас є стандартний макрос, який маніпулює кількома клітинками на аркуші 1, кожен раз, коли комірка на цьому аркуші змінюється, ваш макрос повинен призупинятися під час виконання події Worksheet_Change.

Ви можете додати ще один рівень підвищення продуктивності, використовуючи властивість EnableEvents, щоб повідомити Excel ігнорувати події під час виконання макросу.

Перед запуском макросу встановіть для властивості EnableEvents значення False. Після завершення роботи коду макросу ви можете повернути властивість EnableEvents значення True.

Підмакрос1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
 'Помістіть свій код макросу тут
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Кінець суб

Приховування розривів сторінок

Кожного разу, коли ваш макрос змінює кількість рядків, змінює кількість стовпців або змінює налаштування сторінки аркуша, Excel змушений витрачати час на перерахунок розривів сторінок, показаних на аркуші.

Ви можете уникнути такої поведінки, просто приховавши розриви сторінок перед запуском макросу.

Встановіть для властивості аркуша DisplayPageBreaks значення False, щоб приховати розриви сторінок. Якщо ви хочете і надалі відображати розриви сторінок після запуску макросу, поверніть властивість аркуша DisplayPageBreaks на True.

Підмакрос1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = False
 'Помістіть свій код макросу тут
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Activesheet.DisplayPageBreaks = True
Кінець суб

Призупинення оновлення зведеної таблиці

Якщо ваш макрос маніпулює зведеними таблицями, які містять великі джерела даних, ви можете відчувати низьку продуктивність під час виконання таких речей, як динамічне додавання або переміщення зведених полів.

Ви можете покращити продуктивність свого макросу, призупинивши перерахунок зведеної таблиці, доки не буде внесено всі зміни зведеного поля. Просто встановіть для властивості PivotTable.ManualUpdate значення True, щоб відкласти перерахунок, запустіть код макросу, а потім встановіть для властивості PivotTable.ManualUpdate значення False, щоб запустити перерахунок.

Підмакрос1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
 'Помістіть свій код макросу тут
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
Кінець суб

Уникайте копіювання та вставки

Важливо пам’ятати, що хоча Macro Recorder економить час, пишучи код VBA для вас, він не завжди пише найефективніший код. Яскравим прикладом є те, як Macro Recorder фіксує будь-яку дію копіювання та вставки, яку ви виконуєте під час запису.

Ви можете трохи посилити свої макроси, виключивши посередника та здійснивши пряме копіювання з однієї комірки в комірку призначення. Цей альтернативний код використовує аргумент Destination, щоб обійти буфер обміну та скопіювати вміст комірки A1 безпосередньо в комірку B1.

Діапазон("A1").Призначення копіювання:=Діапазон("B1")

Якщо вам потрібно скопіювати лише значення (не форматування чи формули), ви можете ще більше підвищити продуктивність, уникаючи методу Copy разом. Просто встановіть значення клітинки призначення на те саме значення, що й у вихідній клітинці. Цей метод приблизно в 25 разів швидше, ніж використання методу Copy:

Діапазон("B1").Значення = Діапазон("A1").Значення

Якщо вам потрібно скопіювати лише формули з однієї клітинки в іншу (не значення чи форматування), ви можете встановити для формули цільової клітинки ту саму формулу, що міститься у вихідній клітинці:

Діапазон("B1").Формула = Діапазон("A1").Формула

Використання оператора With

Під час запису макросів ви часто маніпулюєте одним і тим же об’єктом кілька разів. Ви можете заощадити час і підвищити продуктивність, використовуючи оператор With, щоб виконати кілька дій з даним об’єктом за один кадр.

Оператор With, використаний у наведеному нижче прикладі, повідомляє Excel одночасно застосувати всі зміни форматування:

    З діапазоном ("A1"). Шрифт
    .Жирний = правда
    .Курсив = Правда
    .Підкреслення = xlUnderlineStyleSingle
    Закінчити з

Звикання розділяти дії на фрагменти в операторах With не тільки забезпечить пришвидшення роботи ваших макросів, але й полегшить читання коду макросу.

Уникнення методу Select

Macro Recorder любить використовувати метод Select для явного виділення об’єктів перед виконанням дій з ними. Як правило, немає необхідності вибирати об’єкти перед роботою з ними. Насправді, ви можете значно покращити продуктивність макросу, не використовуючи метод Select.

Записавши макроси, візьміть за звичку змінювати згенерований код, щоб видалити методи Select. У цьому випадку оптимізований код буде виглядати так:

    Аркуші("Аркуш1").Діапазон("A1").FormulaR1C1 = "1000"
    Аркуші("Аркуш2").Діапазон("A1").FormulaR1C1 = "1000"
    Аркуші("Аркуш3").Діапазон("A1").FormulaR1C1 = "1000"

Зверніть увагу, що вибирається нічого. Код просто використовує ієрархію об’єктів для застосування необхідних дій.

Обмеження поїздок до робочого аркуша

Інший спосіб прискорити роботу макросів — обмежити кількість посилань на дані робочого аркуша в коді. Завжди менш ефективно захоплювати дані з аркуша, ніж з пам’яті. Тобто ваші макроси будуть працювати набагато швидше, якщо їм не доведеться постійно взаємодіяти з аркушем.

Наприклад, наступний простий код змушує VBA постійно повертатися до Sheets(“Sheet1”).Range(“A1”), щоб отримати число, необхідне для порівняння, яке виконується в операторі If:

Для звітного місяця = від 1 до 12
     Якщо діапазон("A1").Значення = звіт за місяць, то
     MsgBox 1000000 / ReportMonth
Кінець Якщо
Наступний звіт місяць

Набагато ефективнішим методом є збереження значення в Sheets(“Sheet1”).Range(“A1”) у змінній під назвою MyMonth. Таким чином, код посилається на змінну MyMonth замість робочого аркуша:

Dim MyMonth як ціле число
Мій місяць = Діапазон ("A1"). Значення
Для звітного місяця = від 1 до 12
Якщо MyMonth = ReportMonth Тоді
MsgBox 1000000 / ReportMonth
Кінець Якщо
Наступний звіт місяць

Розгляньте можливість використання змінних для роботи з даними в пам’яті, а не прямих посилань на робочі таблиці.

Уникайте надмірних посилань

Під час виклику методу або властивості об’єкта йому потрібно пройти через інтерфейс IDispatch компонента OLE. Виклики цих компонентів OLE потребують часу, тому зменшення кількості посилань на компоненти OLE може покращити швидкість коду макросу.

Для виклику властивостей або методів об’єкта зазвичай використовується метод представлення Object.Method  ,  тобто «.» символ використовується для виклику властивостей і методів.

Таким чином, кількість викликів методів або властивостей можна оцінити за кількістю символів ".". Чим менше "." символ, тим швидше виконується код.

Наприклад, наступний оператор містить 3 символи ".".

ThisWorkbook.Sheet1.Range("A1").Value = 100

Наступне твердження має лише один символ ".".

Activewindow.Top = 100

Ось кілька прийомів, щоб зменшити кількість символів "." бігти швидше.

По-перше, коли вам потрібно посилатися на той самий об’єкт неодноразово, ви можете встановити для об’єкта змінну, щоб зменшити кількість викликів. Наприклад, наступний код потребує двох викликів на рядок.

ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300

Оскільки  на об’єкт Sheets("Sheet1")  потрібно посилатися неодноразово, його можна спочатку встановити як змінну  sht  , щоб кожен код потрібно було викликати лише один раз.

Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300

По-друге, якщо ви не хочете оголошувати тимчасову змінну sht, ви також можете використати  оператор With  , згаданий раніше. Як показано в наступному прикладі:

With ThisWorkbook.Sheets("Sheet1")
    .Cells(1, 1) = 100
    .Cells(2, 1) = 200
    .Cells(3, 1) = 300
End With

По-третє,  коли є багато циклів, намагайтеся зберігати властивості та методи поза циклом.  Під час повторного використання значення властивості того самого об’єкта в циклі ви можете спочатку призначити значення властивості вказаній змінній поза циклом, а потім використовувати змінну в циклі, що може досягти більшої швидкості. Як показано в наступному прикладі:

For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = Cells(1, 2).Value
Next i

Кожен цикл у цьому прикладі отримує властивість Value комірки Cells(1,2). Якщо ви призначите змінній властивість Value Cells(1.2) перед початком циклу, ви отримаєте швидший запуск. Як показано в наступному прикладі:

tmp = Cells(1, 2).Value
For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = tmp
Next i

Наведений вище код викликає  ThisWorkbook.Sheets("Sheet1")  кожного разу, коли виконується цикл. Ви можете зробити це швидше, використовуючи  оператор With  , щоб перемістити виклик  ThisWorkbook.Sheets("Sheet1")  за межі циклу. Як пок��зано в наступному прикладі:

tmp = Cells(1, 2).Value
With ThisWorkbook.Sheets("Sheet1")
    For i = 1 To 1000
        .Cells(1, 1) = tmp
        .Cells(2, 1) = tmp
        .Cells(3, 1) = tmp
    Next i
End With

Уникайте використання типів варіантів

Початківці зазвичай вважають за краще використовувати змінні типу Variant, перевага яких полягає в тому, що вони менш складні, оскільки можна використовувати будь-який тип даних без проблеми переповнення пам’яті, якщо дані завеликі для типів даних Integer або Long. Однак для даних типу Varienmt потрібно більше додаткового простору пам’яті, ніж для інших указаних типів (2 байти для даних Integer, 4 байти для даних Long і 16 байтів для даних Variant), VBA вимагає більше часу для обробки даних типу Variant, ніж для інших указаних типів. даних. Як показує наступний приклад.

Sub VariantTest()
    Dim i As Long
    Dim ix As Integer, iy As Integer, iz As Integer
    Dim vx As Variant, vy As Variant, vz As Variant
    Dim tm As Date
    vx = 100: vy = 50
    tm = Timer
    For i = 1 To 1000000
        vz = vx * vy
        vz = vx + vy
        vz = vx - vy
        vz = vx / vy
    Next i
    Debug.Print "Variant types take " & Format((Timer - tm), "0.00000") & " seconds"
    ix = 100: iy = 50
    tm = Timer
    For i = 1 To 1000000
        iz = ix * iy
        iz = ix + iy
        iz = ix - iy
        iz = ix / iy
    Next i
    Debug.Print "Integer types take " & Format((Timer - tm), "0.00000") & " seconds"
End Sub

У наведеному вище коді рядки з 8 по 13 виконують 1 мільйон операцій додавання, віднімання, множення та ділення змінних типу Variant, а рядки з 17 по 22 виконують 1 мільйон операцій додавання, віднімання, множення та ділення змінних типу Integer. На моєму комп’ютері операція зі змінною Variant зайняла приблизно  0,09375  секунди, тоді як операція зі змінною Integer зайняла приблизно  0,03125  секунди. Результати можуть відрізнятися від комп’ютера до комп’ютера, але  змінні Variant значно повільніші, ніж змінні Integer .

З цієї причини  рекомендується уникати використання змінних Variant, якщо ви можете явно використовувати вказаний тип даних .

Leave a Comment

Як спілкуватися в чаті в Outlook Web App

Як спілкуватися в чаті в Outlook Web App

Досліджуйте, як ефективно спілкуватися в чаті з колегами в Outlook Web App. Дізнайтеся про покрокову інструкцію та нові можливості для підвищення продуктивності.

Як заборонити Microsoft Word відкривати файли в режимі лише для читання в Windows

Як заборонити Microsoft Word відкривати файли в режимі лише для читання в Windows

Як заборонити Microsoft Word відкривати файли в режимі лише для читання в Windows. Microsoft Word відкриває файли в режимі лише для читання, що робить неможливим їх редагування? Не хвилюйтеся, методи наведено нижче

Як виправити неправильний друк документів Microsoft Word

Як виправити неправильний друк документів Microsoft Word

Як виправити помилки під час друку неправильних документів Microsoft Word Помилки під час друку документів Word зі зміненими шрифтами, безладними абзацами, відсутнім текстом або втраченим вмістом є досить поширеними. Однак не варто

Зітріть малюнки ручкою та маркером на слайдах PowerPoint

Зітріть малюнки ручкою та маркером на слайдах PowerPoint

Якщо ви використовували перо або маркер для малювання на слайдах PowerPoint під час презентації, ви можете зберегти малюнки для наступної презентації або стерти їх, щоб наступного разу, коли ви показуватимете їх, розпочали з чистих слайдів PowerPoint. Дотримуйтесь цих інструкцій, щоб стерти малюнки пером і маркером: Стирання рядків на одній з […]

Вміст бібліотеки стилів у SharePoint 2010

Вміст бібліотеки стилів у SharePoint 2010

Бібліотека стилів містить файли CSS, файли мови розширюваної мови таблиць стилів (XSL) та зображення, які використовуються попередньо визначеними основними сторінками, макетами сторінок та елементами керування в SharePoint 2010. Щоб знайти файли CSS у бібліотеці стилів сайту видавництва: виберіть «Дії сайту»→ «Перегляд». Весь вміст сайту. З’являється вміст сайту. Бібліотека Style знаходиться в […]

Форматуйте числа в тисячах і мільйонах у звітах Excel

Форматуйте числа в тисячах і мільйонах у звітах Excel

Не перевантажуйте аудиторію гігантськими цифрами. У Microsoft Excel ви можете покращити читабельність своїх інформаційних панелей і звітів, відформатувавши числа, щоб вони відображалися в тисячах або мільйонах.

Як ділитися сайтами SharePoint і слідкувати за ними

Як ділитися сайтами SharePoint і слідкувати за ними

Дізнайтеся, як використовувати інструменти соціальних мереж SharePoint, які дозволяють особам і групам спілкуватися, співпрацювати, обмінюватися інформацією та спілкуватися.

Як перетворити дати в юліанські формати в Excel

Як перетворити дати в юліанські формати в Excel

Юліанські дати часто використовуються у виробничих середовищах як мітка часу та швидкий довідник для номера партії. Цей тип кодування дати дозволяє роздрібним продавцям, споживачам та агентам з обслуговування визначити, коли був виготовлений продукт, а отже, і вік продукту. Юліанські дати також використовуються в програмуванні, військовій справі та астрономії. Інший […]

Як створити веб-програму Access

Як створити веб-програму Access

Ви можете створити веб-програму в Access 2016. Так що ж таке веб-програма? Ну, веб означає, що він онлайн, а додаток — це просто скорочення від «додаток». Користувацька веб-програма — це онлайн-додаток для баз даних, доступ до якого здійснюється з хмари за допомогою браузера. Ви створюєте та підтримуєте веб-програму у настільній версії […]

Панель швидкого запуску в SharePoint 2010

Панель швидкого запуску в SharePoint 2010

Більшість сторінок у SharePoint 2010 відображають список посилань навігації на панелі швидкого запуску ліворуч. Панель швидкого запуску відображає посилання на пропонований вміст сайту, наприклад списки, бібліотеки, сайти та сторінки публікації. Панель швидкого запуску містить два дуже важливі посилання: Посилання на весь вміст сайту: […]