Получение Excel для обновления данных на листе из VBA

38

Как получить данные таблицы в Excel для пересчета изнутри VBA, без изменения только значения ячейки?

Теги:
excel-vba
excel

6 ответов

47
Лучший ответ

Следующие строки сделают трюк:

ActiveSheet.EnableCalculation = False  
ActiveSheet.EnableCalculation = True  

Изменить: метод .Calculate() не будет работать для всех функций, я проверил его на листе с функциями надстроек. Рабочий лист, который я использую, достаточно сложный, я не хочу пытаться проверить метод .CalculateFull(), поэтому он может работать.

  • 1
    На самом деле, есть методы .Calculate () и .CalculateFull () для этого на разных уровнях.
  • 1
    Я проверил Рассчитать на листе, и не все функции в ячейке пересчитываются. Вы также можете сделать это, переключив «грязный» бит, но я нашел, что это самое простое решение.
Показать ещё 2 комментария
14

Это должно сделать трюк...

'recalculate all open workbooks
Application.Calculate

'recalculate a specific worksheet
Worksheets(1).Calculate

' recalculate a specific range
Worksheets(1).Columns(1).Calculate
  • 1
    см. комментарий к моему ответу
6

Иногда Excel будет икать, и ему нужно начинать повторное применение уравнения. Это происходит в некоторых случаях, когда вы используете пользовательские формулы.

Убедитесь, что у вас есть следующий script

ActiveSheet.EnableCalculation = True

Примените уравнение выбора.

Cells(RowA,ColB).Formula = Cells(RowA,ColB).Formula

Затем это может быть закодировано по мере необходимости.

3

Вы также можете попробовать

Application.CalculateFull

или

Application.CalculateFullRebuild

если вы не возражаете восстановить все открытые книги, а не только активный рабочий лист. (CalculateFullRebuild также восстанавливает зависимости.)

2

У меня возникла проблема с отключением фонового изображения (водяного знака DRAFT) в VBA. Мое изменение не показывалось (что было выполнено с помощью метода Sheets(1).PageSetup.CenterHeader = ""), поэтому мне нужен был способ обновления. Подход ActiveSheet.EnableCalculation частично сделал трюк, но не покрывал неиспользуемые ячейки.

В конце концов я нашел то, что мне нужно, с одним лайнером, который заставлял изображение исчезать, когда оно больше не было установлено: -

Application.ScreenUpdating = True

-4

Я вижу ответы на вопрос о том, как обновить одиночный лист и все открытые книги, но не как рассчитать все листы из активной книги, и это то, что мне нужно.

Я тестировал этот код и делает трюк. Вот он:

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, что может вызвать проблемы при открытии большого или большого количества книг.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню