Мой макрос, который фиксирует циклические ссылки с помощью метода Calculate, кропотливо медленный. Как я могу заставить его работать быстрее?
У меня есть модель Excel (2016) с круговыми ссылками, которые приводят к тому, что модель ломается каждый раз. У меня есть макрос «fileFixer», который исправляет файл, когда он ломается, и он работает хорошо. Однако проблема заключается в времени, которое требуется для запуска: прибл. 15s. Я чувствую, что можно сократить время, но пока не могу понять, как.
Что я не до конца понимаю, так это то, почему мне приходится многократно повторять цикл «Рассчитать», чтобы исправить файл. И еще более странным для меня является то, что если я зацикливаю Calculate, мне придется зацикливать его почти в 2 раза по сравнению с простым написанием Calculate для нескольких отдельных строк кода (мне нужно зациклить Calculate 400 раз, чтобы исправить файл, но он работает, если я напишите «просто» 200 строк «Рассчитать».
Я пробовал следующее:
1. CalculateFull, который не оказал существенного влияния
2. CalculateFullRebuild, который требовал меньше циклов, но выполнялся значительно дольше
3. Добавлен «триггер» для определения точного времени, когда модель снова начинает работать (обнаружил необходимое количество циклов при попытке), но это не работает, потому что Excel не обновляет ячейку триггера во время работы макроса?
Я вставил здесь довольно длинный (но урезанный вариант) код, чтобы вы получили полную картину. Однако основное внимание уделяется разделу "== CALCULATE ==" (параметры 1 и 2).
Sub fileFixer()
Option Explicit
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Calculate
Dim count, count2, i, calLoopCount As Integer
count2 = Range("Num_of_Assets").Value '# of asset sheets. 1 sheet for 1 asset
calLoopCount = 400 'number of times "Calculate" is looped
i = 1
' ======================== CLEARS CELLS ========================
'Clears the cells causing the circular reference:
Sheets("Assets=>").Select 'all asset sheets come after this "Assets=>" sheet
For count = 1 To count2
ActiveSheet.Next.Select
Range("I210:BT210").Select
Selection.ClearContents
Next count
' ======================== CALCULATE ========================
'Option 1: "Calculate" x400 in a loop:
For i = 1 To calLoopCount
Calculate
If Not Application.CalculationState = xlDone Then
DoEvents
End If
i = i + 1
Next i
'Option 2: "Calculate" x200:
'Calculate
'Calculate
'Calculate
'.
'.
'.
'Calculate
' ======================== FILLS IN THE CELLS ========================
Sheets("Assets=>").Select
For count = 1 To count2
Range("I210").Select
ActiveCell.FormulaR1C1 = "=R160C*R[-38]C" 'Inputs the formula
Range("I210:BT210").Select
Selection.FillRight
Next count
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub