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

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

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

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

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

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

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

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

0
Lana B 3 Июл 2014 в 21:00

2 ответа

Лучший ответ

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

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

ListObject.ListRows(n).Delete

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

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

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

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

0
hnk 3 Июл 2014 в 18:00

Он точно помнит, была ли формула в 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 в 17:59