VBA: как получить макрос, используя метод Calculate, чтобы работать быстрее? - PullRequest
0 голосов
/ 04 июля 2019

Мой макрос, который фиксирует циклические ссылки с помощью метода 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...