Работа с умной таблицей из кода VBA Excel. Обращение к ячейкам, строкам и столбцам умной таблицы. Добавление и удаление строк и столбцов.
Обращение к умной таблице
Все примеры кода в этой статье привязаны к таблице с именем «Таблица1», расположенной на активном листе:
Обращение к умной таблице:
ActiveSheet.ListObjects(«Таблица1») |
Обращение к диапазону умной таблицы на рабочем листе:
ActiveSheet.ListObjects(«Таблица1»).Range |
Проверяем:
Debug.Print ActiveSheet.ListObjects(«Таблица1»).Range.Address ‘Результат: $B$3:$G$9 |
Далее все примеры кода VBA Excel, чтобы их не дублировать, будут представлены как аргументы метода Debug.Print.
Обращение к строкам
Работа с умной таблицей — обращение к строке заголовков:
Debug.Print ActiveSheet.ListObjects(«Таблица1»).Range.Rows(1).Address ‘Результат: $B$3:$G$3 |
Таким же образом можно обращаться и к остальным строкам таблицы (Строка1-Строка6), указывая индекс нужной строки от 2 до 7.
К записям таблицы (Строка1-Строка6) обращаются через коллекцию ListRows, указывая индекс записи от 1 до 6:
With ActiveSheet.ListObjects(«Таблица1») Debug.Print .ListRows.Count ‘Результат: 6 Debug.Print .ListRows(1).Range.Address ‘Результат: $B$4:$G$4 Debug.Print .ListRows(2).Range.Address ‘Результат: $B$5:$G$5 End With |
Обращение к столбцам
Обращение к третьему столбцу умной таблицы из кода VBA Excel:
With ActiveSheet.ListObjects(«Таблица1») ‘Обращение через диапазон умной таблицы Debug.Print .Range.Columns(3).Address ‘Результат: $D$3:$D$9 Debug.Print .Range.Columns.Count ‘Результат: 6 ‘Обращение через коллекцию ListColumns Debug.Print .ListColumns(3).Range.Address ‘Результат: $D$3:$D$9 Debug.Print .ListColumns.Count ‘Результат: 6 End With |
Обращение к ячейкам
Работа с умной таблицей — обращение к ячейке «E7» с отображением ее значения:
With ActiveSheet.ListObjects(«Таблица1») Debug.Print .Range.Cells(5, 4) ‘Результат: 91 Debug.Print .ListColumns(4).Range(5) ‘Результат: 91 Debug.Print .ListRows(4).Range(4) ‘Результат: 91 End With |
Вставка и удаление строк
Вставка новой строки в конец умной таблицы:
ActiveSheet.ListObjects(«Таблица1»).ListRows.Add |
Удаление последней строки:
With ActiveSheet.ListObjects(«Таблица1») .ListRows(.ListRows.Count).Delete End With |
Вставка новой строки на место пятой записи (Строка5 в таблице) со сдвигом пятой и нижерасположенных записей вниз:
ActiveSheet.ListObjects(«Таблица1»).ListRows.Add 5 |
Удаление пятой строки:
ActiveSheet.ListObjects(«Таблица1»).ListRows(5).Delete |
Вставка и удаление столбцов
Вставка нового столбца в конец умной таблицы из кода VBA Excel:
ActiveSheet.ListObjects(«Таблица1»).ListColumns.Add |
Удаление последнего столбца:
With ActiveSheet.ListObjects(«Таблица1») .ListColumns(.ListColumns.Count).Delete End With |
Вставка нового столбца на место четвертой графы таблицы со сдвигом четвертой и последующих граф вправо:
ActiveSheet.ListObjects(«Таблица1»).ListColumns.Add 4 |
Удаление четвертого столбца таблицы:
ActiveSheet.ListObjects(«Таблица1»).ListColumns(4).Delete |
Создание и удаление умной таблицы описано в статье VBA Excel. Создание таблицы (умной, обычной)
Доброго времени суток форумчане. Я являюсь новичком в написании макросов в vba поэтому прошу отнестись с пониманием:)
Для своей работы я пишу достаточную объёмную программу со внесением в таблицу данных через пользовательскую форму с последующей их обработкой. Мне необходимо, чтобы эти данные «перешли» в умные таблицы на других листах того же самого документа Excel. Но для начала эти умные таблицы необходимо создать.
Немного погуглив я нашел решение:
Код |
---|
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$L$15"), , xlNo).Name = "МояТаблица1" |
Всё прекрасно работает, таблица создается с диапазоном ячеек указанных в параметрах Range. Можно даже вместо ActiveSheet написать
Код |
---|
Workbooks("Mybook").Worksheets("MySheet") |
И данный способ будет работать, но только в одном случае — если данный MySheet является активным в момент исполнения макроса. Если переключить активный лист на другой и попытаться запустить макрос, то будет ошибка:
Run-time error ‘1004’:
Данные листа таблица должны находиться на том же листе, что и таблица.
Есть предположение, что сначала перед созданием умной таблицы в коде vba можно написать, чтобы нужный нам лист где должна располагаться будущая таблица стал активным. Но как и это сделать я пока тоже не знаю.
Решения своего вопроса на просторах в интернете я не нашел, поэтому решил спросить здесь. Буду благодарен за ваши ответы.
Изменено: Максим Белич — 22.07.2022 10:30:23
Добавление удаление строк в умную таблицу по условию |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Medison1 5 / 2 / 1 Регистрация: 04.03.2012 Сообщений: 28 |
||||||||
1 |
||||||||
10.03.2018, 05:32. Показов 37707. Ответов 5 Метки нет (Все метки)
Добрый день.
Последняя строка, мне не нравится, т.к. при добавлении столбца в начало таблицы. Формула «поедет». Т.к. нужно будет брать уже 4ый столбец и т.д. Что-то вроде:
0 |
1232 / 670 / 238 Регистрация: 22.12.2015 Сообщений: 2,089 |
|
10.03.2018, 08:09 |
2 |
Решение
WT.Range(i1, WTName & «[Столбец3]») Полагаю, range возвращает обычный диапазон, для которого доступно свойство cells. Не очень понял, что такое i3 — если это число, равное номеру строки, то код будет (например, что-бы выделить ячейку) Код WT.Range(WTName & "[Столбец3]").Cells(i1,1).Select или Код WT.Range(WTName & "[Столбец3]").Rows.Item(i1).Select
1 |
ji2n … 39 / 37 / 13 Регистрация: 08.10.2016 Сообщений: 171 |
||||
10.03.2018, 12:31 |
3 |
|||
Так формула не «поедет» :
Иными словами R -становится указателем на на искомый диапазон.
0 |
Medison1 5 / 2 / 1 Регистрация: 04.03.2012 Сообщений: 28 |
||||||||
10.03.2018, 12:51 [ТС] |
4 |
|||||||
Dinoxromniy, Пробовал еще так:
Ошибка: #13 Type mismatch Вот этот вариант оказался рабочим. Не нужно было писать перед этим «WT.»
ji2n,
0 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||||||
10.03.2018, 13:31 |
5 |
|||||||
Medison1, весь столбец (включая заголовок и ячейку из строки итогов)
Только столбец с данными например так
Хорошая шпаргалка по тому, как обращаться к разным частям умной таблицы: https://www.thespreadsheetguru… cel-tables
2 |
1232 / 670 / 238 Регистрация: 22.12.2015 Сообщений: 2,089 |
|
10.03.2018, 13:57 |
6 |
по какой-то причине не работают. Да, разумеется в обоих случаях должно быть WS вместо WT. Тут обращение происходит со стороны листа рабочей книги, а не через саму умную таблицу (последний случай смотрите у Казанский).
0 |
содержание видео
Урок 1. Работа с Умной таблицей на VBA
В данном уроке рассматриваем пример, как работать с умной таблицей кодом VBA. Учимся добавлять новые строки, столбцы. Работаем с выделением таблицы, форматированием и учимся включать дополнительные функции умной таблицы
Дата: 2022-01-11
Комментарии и отзывы: 10
Как задать имя умной таблицы не жестко. Дело в том, что лист будет копироваться. И умная таблица на скопированном листе будет иметь другое имя — автоматически добавляется числовой индекс в конце. Если сходная была Таблица, то на скопированном листе будет Таблица1 и т. д. Макрос должен удалять и добавлять строки как в вашем видео как на исходном листе так и на скопированных. Проблема — обращаться при добавлении к умн. таблице на активном листе.
Павел
Не понятно как переименовать умную таблицу!
На листе Платежи создал умную таблицу. Она сразу получила имя Таблица1
При попытке задать ей имя появился псевдоним ТабПлатежи, но Таблица1 тоже осталась.
В диспетчере имён видно. что
имени ТабПлатежи соответствует ДИАПАЗОН Таблица1
Пробую код:
Set ShPayment = ThisWorkbook. Worksheets(Платежи) — работает
Set ListObjPay = ShPayment. ListObjects(Таблица1) — работает
Set ListObjPay = ShPayment. ListObjects(ТабПлатежи) — НЕ РАБОТАЕТ!
Юлия
Спасибо за информативное и понятное видео!
Подскажите, а можно ли обратиться к столбцу не по его номеру, а по названию? Если да, то как это сделать?
Буду Вам очень благодарна, если поможете со следующей задачей: как прописать формулу в умной таблице не по индексам ячейки (А2В2, а по названиям столбцов?
Алексей
а не проще удалить вручную все и ничего не писать. До сих пор не могу понять зачем ВБА. Что в нем такого суперового? По мне так сложно все, писать на английском кучу строк что бы удалить строку. Обьясните мне тупому, зачем ВБА. Сколько не искал ответа нету(
Иван
Отличный урок.
Только 22: 58 маленькая неточность. Думаю строка должна иметь вид:
For i=1 to ListObj. ListColumns. Count
а то как-то не комильфо работать со столбцами по количеству строк)
и переменную і забыли объявить, если установлен Option Explicit VBA будет тоже ругаться.
ivan
Спасибо за Вашу работу, очень полезно, подскажите как сделать чтобы номер столбца который нужно добавить ListObj. ListColumns. Add 7 вставлялся автоматически например у меня лист товар, ячейка А15 = значение 6
ListObj. ListColumns. Add 7 (вместо 7 стало 6. спасибо
Алексей
Спасибо за урок. Очень жду продолжения.
Замечена одна неточность: при форматировании всех колонок считаешь количество строк, а форматируешь колонки. Насколько понимаю, правильным было бы записать ListObj. ListColumns. Count
сергей
В видео допущен ошибка на 22: 55 при установке ширины колонок. Количество столбцов нужно определять ListObj. ListColumns. Count, а не через свойство ListRows
Elnara
Здравствуйте! Почему у меня не получается? Выходит маленькое окошко и там написано: run-time error ‘9’: Subscript out of range. Что это означает не поняла?
Николай
Большое спасибо за урок! Очень ценно. А можно ли удалить сразу несколько смежных строк, указав диапазон? Или только по одной?