Мой код VBA работает с ListObjects в Excel 2010. Формулы в таблице представляют собой СУММЕСЛИМН, которые суммируют данные на основе значений первых нескольких столбцов (параметров).

Когда я получаю новые данные, макрос выполняет следующую процедуру:

  • 1 - удаляет весь DataBodyRange таблицы
  • 2-вставляет новые данные в столбцы параметров (это текстовые значения)
  • 3-анализирует детализацию новых данных и составляет новые формулы
  • 4 - заполняет формулы.

ПРОБЛЕМА: формулы не должны появляться до шага 3, но они выглядят так, как будто я никогда их не удалял. Это похоже на то, что у листобъекта есть какая-то кеш-память.

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

Я сделаю пример файла, если никто не знает, что вам нужно. Кроме того, я много исследовал это здесь и в Google в целом, пока ничего не нашел.

Заранее благодарим вас за ответы!

С уважением, Лана

0
Lana B 3 Июл 2014 в 21:00
Какой-нибудь из этих ответов сработал для вас? Если это так, отметьте его как «ответил». Спасибо
 – 
hnk
4 Июл 2014 в 00:36
Привет вам обоим, извините за задержку - Excel не понравилась vbnullstring, поэтому в итоге я удалил databodyrange несколькими способами, а также заставил формулу быть нулевой строкой через "", что, я полагаю, одно и то же. . Спасибо за ваши ответы, очень признателен! Лана
 – 
Lana B
24 Июл 2014 в 18:46

2 ответа

Лучший ответ

Да. Это зависит от того, как вы удаляете строки.

Если вы удалите с

ListObject.ListRows(n).Delete

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

Вам нужно удалить его полностью, вы можете сделать что-то вроде

ListObject.DatabodyRange.ClearContents
ListOBject.DatabodyRange.Rows().Delete

Это должно решить вашу проблему

0
hnk 3 Июл 2014 в 22:00
Привет, спасибо, я удаляю его как ListObject.DatabodyRange.Delete - я попробую ваш метод и сообщу вам, сработало ли это как можно скорее!
 – 
Lana B
4 Июл 2014 в 14:17

Он точно помнит, была ли формула в ListColumn. Я не уверен, это кеш или просто нераскрытое свойство ListColumn. Если вы явно установите для listcolumn значение vbNullString, вы можете эффективно очистить кеш.

Это ListObject из 12 столбцов, в котором в столбце 12 есть формула. Без назначения vbNullString столбец 12 заполняется формулой. Как есть, формула потеряна.

Sub TestLOFormulas()

    Dim lo As ListObject
    Dim arr(1 To 1, 1 To 11) As Variant

    Set lo = Sheet1.ListObjects(1)
    lo.DataBodyRange.EntireRow.Delete

    'This line clears the 'cache'
    lo.ListColumns(12).Range.Value = vbNullString

    arr(1, 1) = 1
    arr(1, 2) = 1
    arr(1, 3) = 1
    arr(1, 4) = 1
    arr(1, 5) = 1
    arr(1, 6) = 1
    arr(1, 7) = 1
    arr(1, 8) = 1
    arr(1, 9) = 1
    arr(1, 10) = 1
    arr(1, 11) = 1

    lo.InsertRowRange.Resize(1, 11).Value = arr

End Sub
1
Dick Kusleika 3 Июл 2014 в 21:59
Спасибо большое, сейчас проверю и сообщу. Массив выглядит довольно длинным, я попытаюсь просто использовать lo.ListColumns(12).Range.Value = vbNullString :-)
 – 
Lana B
4 Июл 2014 в 14:19
1
С массивом я просто тестировал заполнение ячеек, у которых нет формулы, чтобы увидеть, появляется ли формула снова волшебным образом.
 – 
Dick Kusleika
6 Июл 2014 в 00:41