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

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

5 ответов

Решение

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

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 происходит сбой, и ему необходимо дать толчок для повторного применения уравнения. Это происходит в некоторых случаях, когда вы используете пользовательские формулы.

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

ActiveSheet.EnableCalculation = True

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

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

Это может быть зациклено по мере необходимости.

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

Application.CalculateFull

или же

Application.CalculateFullRebuild

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

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

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

Application.ScreenUpdating = True

После обновления подключения к данным некоторые UDF не выполнялись. Используя подпрограмму, я пытался пересчитать один столбец с помощью:

Sheets("mysheet").Columns("D").Calculate

Но вышеприведенное заявление не возымело эффекта. Ни одно из вышеперечисленных решений не помогло, за исключением предложения kambeeks о замене формул, которое работало и работало быстро, если во время обновления был включен ручной пересчет. Приведенный ниже код решил мою проблему, даже если он не совсем отвечает за комментарий OP "kluge", он предоставил быстрое и надежное решение для принудительного пересчета указанных пользователем ячеек.

Application.Calculation = xlManual
DoEvents
For Each mycell In Sheets("mysheet").Range("D9:D750").Cells
    mycell.Formula = mycell.Formula
Next
DoEvents
Application.Calculation = xlAutomatic
Другие вопросы по тегам