Метод вычисления Excel VBA не обновляет формулы массива;отображается как # N / A - PullRequest
2 голосов
/ 06 февраля 2012

У меня есть ряд формул массива в Excel, которые отличаются друг от друга.Они автоматически изменяются в соответствии с диапазоном данных, которые создаются с помощью собственной надстройки Excel.

Однако всякий раз, когда мой код переписывает некоторые формулы массива с правильным новым размером, все ячейки отображаются как # N / A до тех пор, пока вы не отредактируете другую несвязанную ячейку на листе, сохраните лист или нажмете F9,

Использование кода, такого как Application.Calculate, ActiveSheet.Calculate и т. Д., Не оказывает никакого влияния.

Однако использование SendKeys "{F9}" не дает.

Например, на листе приведены две формулы:

={IF(LEN(INDEX(A:A, ROW()))>0,ROW(A:A)+2)}

и

={LARGE(OFFSET($J$1,0,0,ROW()),1)}

Первая формула работает нормально после ее программной записи в диапазонеклетки.Это просто говорит мне номер строки ячейки, в которой есть текст.

Вторая формула не работает после ее программной записи в диапазон ячеек.Это дает мне наибольший номер строки, который был ранее замечен в списке чисел (который является выходом первой формулы).Если я нажму F9, вторая формула обновится правильно.Если я делаю Application.Calculate в VBA, ничего не происходит.Я также пробовал различные другие методы пересчета, доступные на уровне рабочего листа, но не повезло.

Кто-нибудь сталкивался с чем-то подобным раньше?

edit: Код изменения размера, по сути, сводится к чему-то следующему (удаление всего кода поддержки, который позволяет мне делать более обобщенные вызовы):

Сначала я делаю:

formula = dataSheet.Cells(startRow, startColumn).formula

Затем позже:

Set DeleteRange = dataSheet.Range(dataSheet.Cells(startRow, startColumn), dataSheet.Cells(bottomBound, rightBound))
DeleteRange.ClearContents
Set DeleteRange = Nothing

Затем позже:

Set resultRange = dataSheet.Range(dataSheet.Cells(startRow, startColumn), dataSheet.Cells(startRow + Height - 1, startColumn + Width - 1))
resultRange.FormulaArray = formula
Set resultRange = Nothing

В скорлупе ореха я делаю копиюформула, очистить диапазон, а затем переписать его.

Ответы [ 5 ]

3 голосов
/ 07 февраля 2012

Если вы не можете победить их, присоединяйтесь к ним.

SendKeys "{F9}"
2 голосов
/ 08 февраля 2012

Я уточнил мой комментарий выше, учитывая, что вы применили этот подход

, используя этот код

Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)"
Range("a1:a5").FormulaArray = strFormula
  • xl03 дает числа, но для правильного обновления ячеек необходим калькулятор
  • xl07 дает "# N / A" (и поднимает Calculate в строке состояния)
  • xl10 работает нормально

Как вы указали, ни один изпараметры расчета, включая полную перестройку дерева зависимостей

, с использованием моего предложения RAND, приведенного выше, действительно вызывает обновление в xl07

Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)+ RAND()*0"
Range("a1:a5").FormulaArray = strFormula

OFFSET - это энергозависимая функция, см. Voltatile ExcelФункции (который включает в себя файл, который проверяет волатильность)

Возможно, Чарльз Уильямс может пролить свет на это, я буду пинговать его

1 голос
/ 08 февраля 2012

Похоже на ошибку FormulaArray в 2003 и 2007 годах.
Более простой обход вашей формулы - использовать Range ("a1: A5"). Формула вместо массива формул, поскольку = LARGE (OFFSET ($ J $ 1,0,0, ROW ()), 1) не обязательно должен быть формулой массива

0 голосов
/ 28 мая 2013

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

РЕШЕНИЕ:

Используйте полные ссылки в своих формулах.например, любые формулы, которые выглядят так: YourFunction(G200:H700) должны быть изменены, чтобы они выглядели так: YourFunction('Your Sheet Name'!G200:H700).

Автообновление теперь отлично работает для меня.

0 голосов
/ 06 февраля 2012

Я помню, что есть также метод Application.CalculateFull - это работает?

...