Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Зависимость работы c ListObjects(**) контекста - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Зависимость работы c ListObjects(**) контекста (изменение размера умной таблицы в сложном макросе)
Зависимость работы c ListObjects(**) контекста
Павел2019 Дата: Суббота, 06.04.2019, 12:01 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Коллеги! Нужна помощь!
Обладаю весьма приличным опытом в VBA Excel, но безуспешно потратил много (очень много!) времени на борьбу с ListObjects(**) и «умной таблицей» в связи с добавлением строки.
Необходимо всего лишь (даже как-то стыдно!) программным способом увеличить размер таблицы на одну строку. Использовал несколько вариантов
1. Изменение размера методом ….Resize
2. Добавление строки методом .Add
3. Добавление строки вниз таблицы с автоматическим изменением размера.

В тестах и простеньких макросах все работает прекрасно, но в составе достаточно сложного макроса дает системную ошибку – Excel вылетает. Все простые варианты (контролирую нахождение на лист и в активном файле, погасил все окна и объекты, контролирую адреса таблиц и ячеек и пр. мелочи). Острое ощущение, что что-то блокирует методы работы с таблицей и объектом и это критически зависит от контекста макроса.

Если конкретно, то, например, строка
>>>
[vba]
Код
ActiveSheet.ListObjects("Spisok").Resize Range("$A$1:$E$92")
[/vba]
<<<
в отдельном макросе работает, а в составе системы системную ошибку.


Сообщение отредактировал Павел2019 - Суббота, 06.04.2019, 13:59
 
Ответить
СообщениеКоллеги! Нужна помощь!
Обладаю весьма приличным опытом в VBA Excel, но безуспешно потратил много (очень много!) времени на борьбу с ListObjects(**) и «умной таблицей» в связи с добавлением строки.
Необходимо всего лишь (даже как-то стыдно!) программным способом увеличить размер таблицы на одну строку. Использовал несколько вариантов
1. Изменение размера методом ….Resize
2. Добавление строки методом .Add
3. Добавление строки вниз таблицы с автоматическим изменением размера.

В тестах и простеньких макросах все работает прекрасно, но в составе достаточно сложного макроса дает системную ошибку – Excel вылетает. Все простые варианты (контролирую нахождение на лист и в активном файле, погасил все окна и объекты, контролирую адреса таблиц и ячеек и пр. мелочи). Острое ощущение, что что-то блокирует методы работы с таблицей и объектом и это критически зависит от контекста макроса.

Если конкретно, то, например, строка
>>>
[vba]
Код
ActiveSheet.ListObjects("Spisok").Resize Range("$A$1:$E$92")
[/vba]
<<<
в отдельном макросе работает, а в составе системы системную ошибку.

Автор - Павел2019
Дата добавления - 06.04.2019 в 12:01
bmv98rus Дата: Суббота, 06.04.2019, 12:57 | Сообщение № 2
Группа: Проверенные
Ранг: Участник клуба
Сообщений: 2524
Репутация: 436 ±
Замечаний: 0% ±

Excel 2013/2016
Что за ошибка? Точно на активный в этот момент лист тот, который нужен?


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
СообщениеЧто за ошибка? Точно на активный в этот момент лист тот, который нужен?

Автор - bmv98rus
Дата добавления - 06.04.2019 в 12:57
Павел2019 Дата: Суббота, 06.04.2019, 13:06 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Без сомнения! Провожу пошаговую трассировку.
Вот скреен ошибки. Тоже самое бывает и про метод .Add
К сообщению приложен файл: 7308349.png(11.9 Kb)
 
Ответить
СообщениеБез сомнения! Провожу пошаговую трассировку.
Вот скреен ошибки. Тоже самое бывает и про метод .Add

Автор - Павел2019
Дата добавления - 06.04.2019 в 13:06
krosav4ig Дата: Суббота, 06.04.2019, 14:32 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 2164
Репутация: 905 ±
Замечаний: 0% ±

Excel 2007,2010,2013
[vba]
Код
    With Range("Spisok[#All]")
        .ListObject.Resize .Resize(.Rows.Count + 1)
    End With
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщение[vba]
Код
    With Range("Spisok[#All]")
        .ListObject.Resize .Resize(.Rows.Count + 1)
    End With
[/vba]

Автор - krosav4ig
Дата добавления - 06.04.2019 в 14:32
Павел2019 Дата: Суббота, 06.04.2019, 17:05 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
krosav4ig:

Так это один из вариантов, который и не работает.
Точнее как тест отдельно работает, а в системе генерит ошибку.
Вопрос только в том, что я не понимаю про контекст в системе.
Про то, что нужно быть на этом листе, не запутаться со строкой итогов и т.д.
я знаю, но это не помогает. Есть что-то еще. Или это глюк VBA+Microsoft.
 
Ответить
Сообщениеkrosav4ig:

Так это один из вариантов, который и не работает.
Точнее как тест отдельно работает, а в системе генерит ошибку.
Вопрос только в том, что я не понимаю про контекст в системе.
Про то, что нужно быть на этом листе, не запутаться со строкой итогов и т.д.
я знаю, но это не помогает. Есть что-то еще. Или это глюк VBA+Microsoft.

Автор - Павел2019
Дата добавления - 06.04.2019 в 17:05
krosav4ig Дата: Воскресенье, 07.04.2019, 10:11 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 2164
Репутация: 905 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Цитата Павел2019, 06.04.2019 в 17:05, в сообщении № 5 ()
нужно быть на этом листе
Бред.
Цитата Павел2019, 06.04.2019 в 17:05, в сообщении № 5 ()
не запутаться со строкой итогов
Еще бредовее, наличие строки итогов может влиять только на скорость работы макроса (если он написан корректно)
Чуть ли не единственный возможный случай возникновения ошибки в коде из моего поста - если в активной книге нет таблицы с таким именем или лист, на котором находится таблица защищен

[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 - только для ускорения работы


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Воскресенье, 07.04.2019, 10:11
 
Ответить
Сообщение
Цитата Павел2019, 06.04.2019 в 17:05, в сообщении № 5 ()
нужно быть на этом листе
Бред.
Цитата Павел2019, 06.04.2019 в 17:05, в сообщении № 5 ()
не запутаться со строкой итогов
Еще бредовее, наличие строки итогов может влиять только на скорость работы макроса (если он написан корректно)
Чуть ли не единственный возможный случай возникновения ошибки в коде из моего поста - если в активной книге нет таблицы с таким именем или лист, на котором находится таблица защищен

[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
Дата добавления - 07.04.2019 в 10:11
Павел2019 Дата: Среда, 17.04.2019, 22:02 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Я конечно благодарен умным людям за комментарии типа "Бред ... это не может быть причиной... ", но это не ко мне, а к тем кто задает мне вопросы на эту тему (лист, строка итогов ...). А мне хотелось увидеть какую нибудь конструктивную идею: что же может сформировать в большом макросе ситуацию, когда перестают работать методы .Add, .Resize, .Del и просто добавление вниз умной таблицы строки с автоматическим изменением размера? При том, что все тесты на маленьких макросах проходят успешно.
Так вот какой получается итог обсуждения в 3х форумах:
1. НЕТ НИКАКИХ КОНСТРУКТИВНЫХ ИДЕЙ! Видимо глюк VBA Exel+Microsoft.
2. Получается только "некрасивый и тупой" вариант удалить таблицу (преобразовать в диапазон), дописать строку и вновь создать таблицу.
 
Ответить
СообщениеЯ конечно благодарен умным людям за комментарии типа "Бред ... это не может быть причиной... ", но это не ко мне, а к тем кто задает мне вопросы на эту тему (лист, строка итогов ...). А мне хотелось увидеть какую нибудь конструктивную идею: что же может сформировать в большом макросе ситуацию, когда перестают работать методы .Add, .Resize, .Del и просто добавление вниз умной таблицы строки с автоматическим изменением размера? При том, что все тесты на маленьких макросах проходят успешно.
Так вот какой получается итог обсуждения в 3х форумах:
1. НЕТ НИКАКИХ КОНСТРУКТИВНЫХ ИДЕЙ! Видимо глюк VBA Exel+Microsoft.
2. Получается только "некрасивый и тупой" вариант удалить таблицу (преобразовать в диапазон), дописать строку и вновь создать таблицу.

Автор - Павел2019
Дата добавления - 17.04.2019 в 22:02
krosav4ig Дата: Среда, 17.04.2019, 22:54 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 2164
Репутация: 905 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
увидеть какую нибудь конструктивную идею: что же может сформировать в большом макросе ситуацию, когда перестают работать методы .Add, .Resize, .Del и просто добавление вниз умной таблицы строки с автоматическим изменением размера?

в активной книге нет таблицы с таким именем или лист, на котором находится таблица защищен
и, до кучи, если все-таки хочется Activesheet, на активном листе нету таблицы с таким именем
Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
обсуждения в 3х форумах
хде они?
смотрим тут п. 5.s
Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
это не ко мне, а к тем кто задает мне вопросы на эту тему

а вопросы про активный лист задают потому, что
Цитата Павел2019, 06.04.2019 в 12:01, в сообщении № 1 ()
ActiveSheet.ListObjects("Spisok").Resize Range("$A$1:$E$92")


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщение
Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
увидеть какую нибудь конструктивную идею: что же может сформировать в большом макросе ситуацию, когда перестают работать методы .Add, .Resize, .Del и просто добавление вниз умной таблицы строки с автоматическим изменением размера?

в активной книге нет таблицы с таким именем или лист, на котором находится таблица защищен
и, до кучи, если все-таки хочется Activesheet, на активном листе нету таблицы с таким именем
Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
обсуждения в 3х форумах
хде они?
смотрим тут п. 5.s
Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
это не ко мне, а к тем кто задает мне вопросы на эту тему

а вопросы про активный лист задают потому, что
Цитата Павел2019, 06.04.2019 в 12:01, в сообщении № 1 ()
ActiveSheet.ListObjects("Spisok").Resize Range("$A$1:$E$92")

Автор - krosav4ig
Дата добавления - 17.04.2019 в 22:54
boa Дата: Четверг, 18.04.2019, 11:36 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 407
Репутация: 115 ±
Замечаний: 0% ±

2013, 365
Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
Видимо глюк VBA Exel+Microsoft

А может проблема с кодом автора?
Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
что же может сформировать в большом макросе ситуацию, когда перестают работать методы

не правильная работа с методами.

Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
методы .Add, .Resize, .Del

[vba]
Код
  Set tbl = ActiveSheet.ListObjects("Spisok")
  
' Увеличить размер таблицы на 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

[/vba]


 
Ответить
Сообщение
Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
Видимо глюк VBA Exel+Microsoft

А может проблема с кодом автора?
Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
что же может сформировать в большом макросе ситуацию, когда перестают работать методы

не правильная работа с методами.

Цитата Павел2019, 17.04.2019 в 22:02, в сообщении № 7 ()
методы .Add, .Resize, .Del

[vba]
Код
  Set tbl = ActiveSheet.ListObjects("Spisok")
  
' Увеличить размер таблицы на 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

[/vba]

Автор - boa
Дата добавления - 18.04.2019 в 11:36
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Зависимость работы c ListObjects(**) контекста (изменение размера умной таблицы в сложном макросе)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2019 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!