#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. Удалить — я попробую ваш метод и дам вам знать, сработал ли он как можно скорее!