Все, що наведено нижче, стосується Excel 2007 і раніше. Відповідно до посилання @ ʜcʜιᴇ007 опубліковано в коментарях вище, є деяка рідна підтримка багатопоточності в Excel 2013. Тим не менш, попередження просто забути, якщо ви досвідчений програміст все ще застосовується.
На жаль, VBA не підтримує багатопоточність, тому розрахунки VBA будуть обмежені одним ядром вашого процесора.
Тим не менш, існує розширений спосіб обманювати VBA у виконанні декількох потоків, генеруючи файли VBscript і виконуючи їх одночасно. Це обходить проблему, запустивши код за межами процесу Excel і дозволяє Windows керувати ресурсами, виділеними для різних потоків.
Тим не менш, переведення цього на роботу буде ймовірно означати повне переосмислення логіки вашого коду (тобто вам доведеться з'ясувати, як розділити завдання таким чином, що має сенс для їх одночасного запуску), що може Дуже добре бути неможливим для вашого проекту. Я ніколи цього не реалізовував, тому не можу допомогти вам у цьому більше, ніж розповісти вам те, що я вже казав вам.
Якщо ви хочете вступити в кролячу дірку, хоча, ось цікавий блог що показує приклад цього. Будьте обережні: якщо ви не виконаний програміст, ви можете забути цю ідею і просто прийняти, що VBA працює в одному потоці.
Інші ресурси щодо переповнення стека для сміливих:
https://stackoverflow.com/q/19159025/657668
https://stackoverflow.com/q/5721564/657668
Є, звичайно, інші способи оптимізації коду VBA без використання декількох потоків. Не бачачи вашого коду, неможливо зробити чіткі пропозиції, але тут є кілька звичних підозрюваних:
- Завантажуйте дані з аркуша в масив для більш швидкої обробки. Взаємодія з робочим листом є головним вузьким місцем у виконанні VBA, і їх можна звести до мінімуму, працюючи з масивами.
- Це пов'язано з тим, що Excel перераховує книгу після кожної зміни клітинки. Цього можна уникнути, встановивши
Application.Calculation = xlManual
. Просто переконайтеся, що ви повернетеся назад Application.Calculation = xlAutomatic
перед виходом з підпрограми.