Это не исчерпывающий ответ, это всего лишь начало.
Во-первых, Excel VBA обрабатывает Integer
типы как Long
внутри. Этот ответ показывает больше об этом.Поэтому я бы рекомендовал использовать Long
, если это не относится к обратной совместимости для более старых версий Excel.
Далее я вижу, что вы используете функции рабочего листа.Вам не нужно
D = Application.WorksheetFunction.Round(x1 * 0.1, 0)
, поскольку его можно уменьшить до
D = Round(x1 * 0.1, 0)
Кроме того, вы получаете доступ крабочий лист безумное количество раз через вложенные циклы.На мой взгляд, было бы лучше ограничить время, в течение которого VBA должен взаимодействовать с диапазонами или рабочими таблицами, до минимального количества раз, например сохранять значения в массиве и выгружать полный массив в ячейки.
Кроме того, вы можете посмотреть этот ответ о проблемах с памятью, поскольку здесь можно найти несколько советов.
И в качестве общего примечания я бы рекомендовал использовать более значимыеимена переменных, особенно при представлении в SO, чтобы помочь людям определить, что происходит.