Как получить данные таблицы в Excel для пересчета изнутри VBA, без изменения только значения ячейки?
Следующие строки сделают трюк:
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
Изменить: метод .Calculate() не будет работать для всех функций, я проверил его на листе с функциями надстроек. Рабочий лист, который я использую, достаточно сложный, я не хочу пытаться проверить метод .CalculateFull(), поэтому он может работать.
Это должно сделать трюк...
'recalculate all open workbooks
Application.Calculate
'recalculate a specific worksheet
Worksheets(1).Calculate
' recalculate a specific range
Worksheets(1).Columns(1).Calculate
Иногда Excel будет икать, и ему нужно начинать повторное применение уравнения. Это происходит в некоторых случаях, когда вы используете пользовательские формулы.
Убедитесь, что у вас есть следующий script
ActiveSheet.EnableCalculation = True
Примените уравнение выбора.
Cells(RowA,ColB).Formula = Cells(RowA,ColB).Formula
Затем это может быть закодировано по мере необходимости.
Вы также можете попробовать
Application.CalculateFull
или
Application.CalculateFullRebuild
если вы не возражаете восстановить все открытые книги, а не только активный рабочий лист. (CalculateFullRebuild
также восстанавливает зависимости.)
У меня возникла проблема с отключением фонового изображения (водяного знака DRAFT) в VBA. Мое изменение не показывалось (что было выполнено с помощью метода Sheets(1).PageSetup.CenterHeader = ""
), поэтому мне нужен был способ обновления. Подход ActiveSheet.EnableCalculation
частично сделал трюк, но не покрывал неиспользуемые ячейки.
В конце концов я нашел то, что мне нужно, с одним лайнером, который заставлял изображение исчезать, когда оно больше не было установлено: -
Application.ScreenUpdating = True
Я вижу ответы на вопрос о том, как обновить одиночный лист и все открытые книги, но не как рассчитать все листы из активной книги, и это то, что мне нужно.
Я тестировал этот код и делает трюк. Вот он:
Sub CalcActiveWbook()
Dim wks As Worksheet
Application.Calculation = xlManual
For Each wks In ActiveWorkbook.Worksheets
wks.Calculate
Next
Set wks = Nothing
End Sub
Это имеет очевидное преимущество перед Application.Calculate
, что может вызвать проблемы при открытии большого или большого количества книг.