Получение 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