Коллеги! Нужна помощь! Обладаю весьма приличным опытом в VBA Excel, но безуспешно потратил много (очень много!) времени на борьбу с ListObjects(**) и «умной таблицей» в связи с добавлением строки. Необходимо всего лишь (даже как-то стыдно!) программным способом увеличить размер таблицы на одну строку. Использовал несколько вариантов 1. Изменение размера методом ….Resize 2. Добавление строки методом .Add 3. Добавление строки вниз таблицы с автоматическим изменением размера.
В тестах и простеньких макросах все работает прекрасно, но в составе достаточно сложного макроса дает системную ошибку – Excel вылетает. Все простые варианты (контролирую нахождение на лист и в активном файле, погасил все окна и объекты, контролирую адреса таблиц и ячеек и пр. мелочи). Острое ощущение, что что-то блокирует методы работы с таблицей и объектом и это критически зависит от контекста макроса.
[/vba] <<< в отдельном макросе работает, а в составе системы системную ошибку.
Коллеги! Нужна помощь! Обладаю весьма приличным опытом в VBA Excel, но безуспешно потратил много (очень много!) времени на борьбу с ListObjects(**) и «умной таблицей» в связи с добавлением строки. Необходимо всего лишь (даже как-то стыдно!) программным способом увеличить размер таблицы на одну строку. Использовал несколько вариантов 1. Изменение размера методом ….Resize 2. Добавление строки методом .Add 3. Добавление строки вниз таблицы с автоматическим изменением размера.
В тестах и простеньких макросах все работает прекрасно, но в составе достаточно сложного макроса дает системную ошибку – Excel вылетает. Все простые варианты (контролирую нахождение на лист и в активном файле, погасил все окна и объекты, контролирую адреса таблиц и ячеек и пр. мелочи). Острое ощущение, что что-то блокирует методы работы с таблицей и объектом и это критически зависит от контекста макроса.
Так это один из вариантов, который и не работает. Точнее как тест отдельно работает, а в системе генерит ошибку. Вопрос только в том, что я не понимаю про контекст в системе. Про то, что нужно быть на этом листе, не запутаться со строкой итогов и т.д. я знаю, но это не помогает. Есть что-то еще. Или это глюк VBA+Microsoft.
krosav4ig:
Так это один из вариантов, который и не работает. Точнее как тест отдельно работает, а в системе генерит ошибку. Вопрос только в том, что я не понимаю про контекст в системе. Про то, что нужно быть на этом листе, не запутаться со строкой итогов и т.д. я знаю, но это не помогает. Есть что-то еще. Или это глюк VBA+Microsoft.Павел2019
Еще бредовее, наличие строки итогов может влиять только на скорость работы макроса (если он написан корректно) Чуть ли не единственный возможный случай возникновения ошибки в коде из моего поста - если в активной книге нет таблицы с таким именем или лист, на котором находится таблица защищен
[vba]
Код
Dim r As Range, b As Boolean With Range("Книга2!Spisok[#All]") Set r = .Resize(.Rows.Count + 1) With .ListObject b = .ShowTotals .ShowTotals = False .Resize r .ShowTotals = b End With End With
[/vba] отключение .ShowTotals - только для ускорения работы
Еще бредовее, наличие строки итогов может влиять только на скорость работы макроса (если он написан корректно) Чуть ли не единственный возможный случай возникновения ошибки в коде из моего поста - если в активной книге нет таблицы с таким именем или лист, на котором находится таблица защищен
[vba]
Код
Dim r As Range, b As Boolean With Range("Книга2!Spisok[#All]") Set r = .Resize(.Rows.Count + 1) With .ListObject b = .ShowTotals .ShowTotals = False .Resize r .ShowTotals = b End With End With
[/vba] отключение .ShowTotals - только для ускорения работыkrosav4ig
Я конечно благодарен умным людям за комментарии типа "Бред ... это не может быть причиной... ", но это не ко мне, а к тем кто задает мне вопросы на эту тему (лист, строка итогов ...). А мне хотелось увидеть какую нибудь конструктивную идею: что же может сформировать в большом макросе ситуацию, когда перестают работать методы .Add, .Resize, .Del и просто добавление вниз умной таблицы строки с автоматическим изменением размера? При том, что все тесты на маленьких макросах проходят успешно. Так вот какой получается итог обсуждения в 3х форумах: 1. НЕТ НИКАКИХ КОНСТРУКТИВНЫХ ИДЕЙ! Видимо глюк VBA Exel+Microsoft. 2. Получается только "некрасивый и тупой" вариант удалить таблицу (преобразовать в диапазон), дописать строку и вновь создать таблицу.
Я конечно благодарен умным людям за комментарии типа "Бред ... это не может быть причиной... ", но это не ко мне, а к тем кто задает мне вопросы на эту тему (лист, строка итогов ...). А мне хотелось увидеть какую нибудь конструктивную идею: что же может сформировать в большом макросе ситуацию, когда перестают работать методы .Add, .Resize, .Del и просто добавление вниз умной таблицы строки с автоматическим изменением размера? При том, что все тесты на маленьких макросах проходят успешно. Так вот какой получается итог обсуждения в 3х форумах: 1. НЕТ НИКАКИХ КОНСТРУКТИВНЫХ ИДЕЙ! Видимо глюк VBA Exel+Microsoft. 2. Получается только "некрасивый и тупой" вариант удалить таблицу (преобразовать в диапазон), дописать строку и вновь создать таблицу.Павел2019
увидеть какую нибудь конструктивную идею: что же может сформировать в большом макросе ситуацию, когда перестают работать методы .Add, .Resize, .Del и просто добавление вниз умной таблицы строки с автоматическим изменением размера?
увидеть какую нибудь конструктивную идею: что же может сформировать в большом макросе ситуацию, когда перестают работать методы .Add, .Resize, .Del и просто добавление вниз умной таблицы строки с автоматическим изменением размера?
' Увеличить размер таблицы на 1 строку. Set rng = ActiveSheet.Range("Spisok[#All]").Resize(tbl.Range.Rows.Count + 1, tbl.Range.Columns.Count) tbl.Resize rng
' Добавление строки в конец таблицы tbl.ListRows.Add AlwaysInsert:=True
' Удаление последней строки перед строкой с итогами i = tbl.TotalsRowRange.Row tbl.ListRows(i - 2).Delete ' или, например, последних двух tbl.Range.Rows(i - 2 & ":" & i - 1).Delete
' Увеличить размер таблицы на 1 строку. Set rng = ActiveSheet.Range("Spisok[#All]").Resize(tbl.Range.Rows.Count + 1, tbl.Range.Columns.Count) tbl.Resize rng
' Добавление строки в конец таблицы tbl.ListRows.Add AlwaysInsert:=True
' Удаление последней строки перед строкой с итогами i = tbl.TotalsRowRange.Row tbl.ListRows(i - 2).Delete ' или, например, последних двух tbl.Range.Rows(i - 2 & ":" & i - 1).Delete