Имеет ли таблица Excel listobject какую-либо кэш-память? повторно заполняет удаленные формулы

#excel #vba

#excel #vba

Вопрос:

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

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

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

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

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

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

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

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

Комментарии:

1. какой-либо из этих ответов сработал для вас? Если да, пожалуйста, отметьте это как «отвеченный». Спасибо

2. Здравствуйте, вам обоим, извините за задержку — Excel не понравилась vbnullstring, поэтому я закончил тем, что удалил databodyrange несколькими способами, а также заставил формулу быть нулевой строкой через «», что, я полагаю, одно и то же. Спасибо за ваши ответы, высоко ценится! Лана

Ответ №1:

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

Это объект списка из 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. Большое спасибо, я сейчас протестирую это и дам вам знать. Массив выглядит довольно длинным, я попытаюсь просто использовать lo.ListColumns(12).Range . Значение = vbNullString 🙂

2. Проблема с массивом заключалась в том, что я просто тестировал заполнение ячеек, в которых нет формулы, чтобы посмотреть, появится ли формула волшебным образом снова.

Ответ №2:

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

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

 ListObject.ListRows(n).Delete
  

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

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

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

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

Комментарии:

1. Привет, спасибо, я удаляю ее как ListObject. DatabodyRange. Удалить — я попробую ваш метод и дам вам знать, сработал ли он как можно скорее!