Страницы: 1
RSS
Перезапись таблицы ListObject vba
 
Здравствуйте.
Поделитесь способом пожалуйста, как по нормальному перезаписать таблицу?
Проблема возникает, когда новых строк меньше, чем существующих.
Пробовал варианты:
1. Вычислить разницу между новым и старым размером, удалить лишние строки в цикле как
Код
                        Do While .ListRows.Count > rows_count
                            .ListRows(.ListRows.Count).Delete
                            Loop

При больших разницах - это долго.

2.
Код
  .DataBodyRange.Rows.Delete
  .ListRows.Add
  .DataBodyRange.Resize(UBound(rezult), UBound(rezult, 2)).Value = rezult

это быстро, но слетает условное форматирование, в котором ссылка на две строки таблицы.
Вариант с ClearContents оставляет форматирование внизу.
Вариант с удалением всей строки не подходит, так как влияет на другие таблицы на листе.
По этой же причине не подходит.Listrows(i).range.resize(dif_rows).delete
способа  удаления нескольких listrows за раз не нашел.
 
Пока ждал ответа - нашел более-менее адекватный способ.

Код
    Table.DataBodyRange.Rows(1).ClearContents
    Table.DataBodyRange.Offset(1, 0).Resize(Table.DataBodyRange.Rows.Count - 1, _
    Table.DataBodyRange.Columns.Count).Rows.Delete
 
Это макрорекордер халтурно записывает команду "удалить строки таблицы" и вводит в заблуждение...
Если, например, просто выделить часть строк "умной" таблицы и выполнить макрос:

Код
Selection.Delete

то должно отрабатывать правильно.
Владимир
 
Поелику примера нет, спорить сложно, но этот код УФ в таблице оставляет.
Код
Sub ww()
    Dim ar
    With ActiveSheet
        ar = [m1:n3].Value
        With .ListObjects(1)
            If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
            .Range(1).Offset(1).Resize(UBound(ar), UBound(ar, 2)).Value = ar
        End With
    End With
End Sub
 
Думал  уже нашел решение - не тут то было)
Цитата
RAN написал:
Поелику примера нет,
Вот пример.
RAN - ваш способ в макросе write_table2.
Обратите внимание на УФ - оно ломается.

При перезаписи с помощью write_table - нет.
Но появился другой баг - форматы с первой строки вроде бы копируются, но значения в этих форматах - только в первой строке, в остальных - срабатывает автоформат.
если же продублировать строку
     
Код
 .DataBodyRange.Resize(UBound(rezult), UBound(rezult, 2)).Value = rezult

то все вставляется правильно.
пока использую как временный костыль, ибо на больших массивах, думаю, будет лишняя задержка.
У кого есть мысли почему так происходит?
 
Цитата
sokol92 написал:
Если, например, просто выделить часть строк "умной" таблицы
речь идет не просто о части строк, а о полном их удалении и последующей вставки новых данных,
не поломав при этом вычисляемые столбцы, форматы столбцов и УФ.
 
Неча на макрос пенять, коли формула крива.
=$A1<>СМЕЩ($A1;1;0)
 
RAN, вопрос не в том, чтобы формулу изменить - это я уже сделал.
вопрос как адекватно очистить таблицу перед вставкой новых данных.
ведь ламается не только УФ, но и "обычное"(см више).
Изменено: Dima S - 23.06.2020 16:32:24
 
Цитата
Dima S: речь идет не просто о части строк, а о полном их удалении и последующей вставки новых данных,не поломав при этом вычисляемые столбцы, форматы столбцов и УФ
1. выделить столбец таблицы (без шапки) и удалить строки целиком (см. скрин)
2. вставить новые данные со 2ой строки листа

На больших объёмах будет тупить, т.к. Excel будет постоянно "растягивать" умную под очередную строку, поэтому можно ускориться, "растянув" её сразу на весь объём и вставив в готовое место данные

Оба способа не трогают формулы и УФ, если они корректно написаны
То же кодом
Изменено: Jack Famous - 23.06.2020 17:07:32
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
спасибо, но это уже реализовано в файле-примере и проблемы, которые такой способ приносит описаны више.
Страницы: 1
Наверх