Как удалить строку умную таблицу excel

Работа с умной таблицей из кода 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. Создание таблицы (умной, обычной)


 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#1

29.05.2018 14:23:32

Доброго времени суток, Планетяне!

Вставка строк рассмотрена

тут

Писал большой макрос и возникла необходимость удалять из умной таблицы данные по критерию в одном столбце.

Алгоритм нехитрый:

фильтруем умную по нужному значению в нужном столбце, удаляем видимые, снимаем фильтр.
И всё бы ничего, если бы это можно было сделать обычным (привычным) способом, типа
[именованный_диапазон_в_умной_таблице].SpecialCells(xlCellTypeVisible).EntireRow.Delete, но так сделать нельзя.
Можно циклом, но это долго. В то же время, выделить нужный столбец, потом выделить видимые и удалить эти строки целиком (всё стандартными встроенными командами) вполне можно, но, если записать всё это макрорекордером и запустить, то не выйдет (странно)… Вот такие пироги  :(

Единственный вариант без Select‘ов и Activate‘ов, который я нашёл это ровно такая же строка, но без .EntireRow. Однако, дорожка это кривая: в определённых ситуациях (диапазон из одной области по столбцу(-цам)) таким способом можно удалить не только строки целиком, но и столбцы.

Поделитесь опытом — как быть?

Макрос из файла

Прикрепленные файлы

  • Удалить отфильтрованные.xlsm (104.82 КБ)

Изменено: Jack Famous06.03.2019 15:26:51

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#2

29.05.2018 15:19:09

Цитата
Jack Famous написал:
Однако, дорожка это кривая

может с руками что-то не то?

Код
Private Sub Main()
  Dim t
  Application.ScreenUpdating = 0: t = Timer
  shDB.ListObjects(1).Range.AutoFilter 1, "=1", xlOr, "=3"
  If shDB.ListObjects(1).Range.Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then _
    [_DBFilter].SpecialCells(xlCellTypeVisible).EntireRow.Delete
  shDB.ListObjects(1).Range.AutoFilter
  Debug.Print Timer - t: Application.ScreenUpdating = 1
End Sub

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#3

29.05.2018 15:30:37

Цитата
Ігор Гончаренко написал:
может с руками что-то не то?

может, но вы бы тогда и на свои обратили внимание, потому что не работает… Злой вы какой-то стали
К чему проверка на количество видимых ячеек — не понимаю. Как я понял, метод .Delete удалит столбец, если область видимых ячеек одна (отсоритовано типа). А вот .EntireRow вообще не хочет.

Прикрепленные файлы

  • Удалить отфильтрованные.xlsm (119.08 КБ)
  • 2.png (11.7 КБ)
  • 1.png (19.79 КБ)

Изменено: Jack Famous29.05.2018 15:35:43

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#4

29.05.2018 17:29:20

как выяснилось, из таблицы строк не выкинешь….

Код
Private Sub Main()
  Dim nm$
  Application.ScreenUpdating = 0
  shDB.ListObjects(1).Range.AutoFilter 1, "=2"
  If shDB.ListObjects(1).Range.Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then _
    [_DBFilter].SpecialCells(xlCellTypeVisible).EntireRow.Select
  nm = shDB.ListObjects(1).Name:  shDB.ListObjects(1).Unlist:  Selection.Delete
  shDB.ListObjects.Add(xlSrcRange, [a1].CurrentRegion, , xlYes).Name = nm
  Application.ScreenUpdating = 1
End Sub

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#5

29.05.2018 18:00:38

Цитата
Ігор Гончаренко написал:
из таблицы строк не выкинешь

вот и я о том же)) мало того, что Select’ы приходится использовать (а я стараюсь вообще без них обходиться), так ещё «разбивать», а потом обратно «собирать» «умную»  :(  а так — вариант, конечно, но не хотелось бы… Спасибо  :)

Если никто больше не подскажет, то думаю вот что:

1. до 5-10к строк — циклы (можно снизу вверх по строкам, но лучше собирать всё в Union, а потом скопом удалить)
2. всё, что более, будет чуть сложнее

  • копируем данные «умной» на временный лист (вставить значениями)
  • полностью очищаем «умную» (EntireRow.Delete) по любому столбцу. Формулы при этом сохранятся
  • на временном листе быстро-быстро делаем все манипуляции
  • копируем данные со временного листа обратно в «умную»
  • удаляем временный лист

Как-то так  :)

Изменено: Jack Famous29.05.2018 18:04:32

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#6

29.05.2018 18:04:15

Привет, Алексей

Цитата
Jack Famous написал:
использовать, так ещё «разбивать», а потом обратно «собирать» «умную

по позже вечером напишу, есть два стравнительно простых подхода без этого танца с бубном.

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Доброго вечера, Андрей!
уииии))) буду ждать  :D

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#8

29.05.2018 18:26:19

Код
.ListRows(r).Delete

— удаляет по одной
циклом от последний строк к первым…
коллективного метода не нашел: только преобразовать таблицу в диапазон, удалить выбранное, одеть таблицу на то, что осталось

Изменено: Ігор Гончаренко29.05.2018 18:26:36

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Казанский

Пользователь

Сообщений: 8839
Регистрация: 11.01.2013

#9

29.05.2018 18:50:16

Смежный диапазон строк — можно

Код
ActiveSheet.ListObjects(1).databodyrange.rows("3:5").delete

С несмежным не получается.

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#10

29.05.2018 20:18:32

Код
Sub qq()
    Dim r As Range
    Dim ar As Range
    Set r = ActiveSheet.ListObjects(1).DataBodyRange.SpecialCells(xlCellTypeVisible).EntireRow
    For Each ar In r.Areas
        ar.Delete
    Next
End Sub
 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#11

29.05.2018 20:30:44

Вариант, с удалением строк.
На тестовом примере около 5 секунд. Чтобы было быстрее, по идее лучше с начала отсортировать по ключам фильтра (предварительно вставив временный индекс столбец для восстановления порядка. Хотя если там хитрозакрученные формулы будут, то можно и замедлить), удалить и восстановить по индексу исходную сортировку.

Скрытый текст

Второй вариант, это то, что предложил Игорь, только он требует сброса фильтрации, иначе на 2010. ListRows®.Delete спокойно выполняется, только ничего не удаляется, поэтому применяется сброс фильтра. Естественно, будет самым медленным, у меня выполняется 7 секунд. Правда, есть выгода, не удаляются данные вне таблицы, совпадающие с номерами видимых строк.

Скрытый текст

Изменено: Андрей VG29.05.2018 20:31:12

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

Здравствуйте, коллеги! Поддерживаю Андрея в такой редакции (модификация известного метода ZVI): добавить в таблицу столбец с формулой (0-не удалять, 1-удалять), отсортировать по этому столбцу, удалить строки. Временный индекс для восстановления порядка, мне кажется, не нужен, как как сортировка Excel всегда после ключей сохраняет первоначальный порядок строк.

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Господа, спасибо вам огромное!
Знатно вы мне мне тут идей накидали))) Завтра-послезавтра надеюсь всё подробно затестить. По итогам обязательно отпишусь и тогда уже жду ваших комментариев)))
Подписывайтесь на канал, ставьте лайки (шутка  :D ) не отписывайтесь от темы, пожалуйста — надо полевые испытания провести с замером скорости и удобства  :)

Изменено: Jack Famous29.05.2018 21:37:49

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

#14

30.05.2018 17:23:43

Цитата
Jack Famous написал:
надо полевые испытания провести

Редакция, описанная выше:

Скрытый текст

Изменено: sokol9230.05.2018 18:52:01

Владимир

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

sokol92, благодарю вас! Всё ещё занимаюсь большим проектом (пока ограничился циклом в силу небольшого объёма). Как только сдам (надеюсь завтра) — устрою тест-драйв. Радует что принцип работы и логика всех предложенных вариантов ясны  :)

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#16

01.06.2018 13:32:30

Всем доброго времени суток!

Я закончил тесты. На 5к строк все методы, связанные с работой в отфильтрованном диапазоне в 10-20 раз медленнее метода с созданием дополнительного столбца с формулой фильтра и последующей сортировкой (от 4 секунд с вариантами от Андрея и до 10-20 секунд с вариантами от Игоря и RAN против 0,28-0,33 сек варианта с сортировкой). И это при том, что столбец надо создать и удалить. а это небыстро для умных таблиц. Метод предложил Андрей и sokol92, и, как я понимаю это демонстрировал легендарный ZVI. Что ж…прекрасный приём обхода фильтрации, надо сказать — взял на вооружение! И, кстати, не сразу допёр, но ведь действительно

Цитата
sokol92 написал:
Временный индекс для восстановления порядка, мне кажется, не нужен, как как сортировка Excel всегда после ключей сохраняет первоначальный порядок строк.

потому что, когда мы сортируем по временному столбцу, это просто позволяет быстро удалять строки, а порядок оставшихся никак не меняется (при условии, что все строки, попадающие под критерии удаляются, разумеется). Это круто!  :D
Немного изменил код, убрав парочку необязательных расчётов. Пробовал заменить EntireRow на Rows (по методу удаления сплошного диапазона от Казанского, и никакой разницы в скорости не заметил. EntireRow лично мне удобнее в написании)))

В завершении хочу сказать огромное спасибо всем откликнувшимся! Разумеется, это не соревнование и все предложенные здесь методы являются новыми для меня и знать их просто необходимо (тем более с моей любовью к «умным» таблицам). Спасибо вам большое за науку!  :idea:

В процессе штудирования матчасти активно юзал эту

статью о работе с «умными» таблицами

(англ.)

Макросы

Прикрепленные файлы

  • Удалить отфильтрованные.xlsm (252.12 КБ)

Изменено: Jack Famous01.06.2018 13:34:05

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#17

06.03.2019 10:11:12

Доброго времени суток, Планетяне!

Выкладываю функцию, позволяющую удалить строки независимо, простой ли это диапазон или умная таблица. Без циклов  ;)

Код
Public Function PRDX_RowsDelete(rng As Range) As Boolean
Dim tbl As ListObject
On Error Resume Next: Set tbl = ActiveWorkbook.Worksheets(rng.Parent.Name).ListObjects(1): Err.Clear: On Error GoTo 0
If Not tbl Is Nothing Then Intersect(rng.EntireRow, tbl.DataBodyRange).Delete Else rng.EntireRow.Delete
PRDX_RowsDelete = True
End Function

Выдаст ошибку, если в умной таблице удалены все строки (одна видна, но тип «дежурная»). Чтобы удалить все строки умной таблицы, нужно выделить диапазон любого столбца (без шапки/заголовка) и нажать кнопку «удалить строки с листа» Если удалять ВСЕ строки «умной» таблицы, то макросное удаление через Range.EntireRow.Delete сработает.

Вдохновляли:
Казанский (

тут

и

тут

)

The VBA Guide To ListObject Excel TablesP.S.:

если у вас области умной таблицы разделены на область ввода и область формул, то есть столбцы для ввода и формульные не перемешаны и можно выделить одной областью весь диапазон для ручного ввода (см. столбцы «B-L» на скрине), то есть способ, который на больших объёмах даст существенный выигрыш:
забираем область ввода в массив, удаляем все строки умной таблицы (см. выше), фильтруем массив в памяти, выгружаем обратно в таблицу (в моём примере со скрина [b2].Resize(ubound(arr,1),ubound(arr,2)).value2=arr)

Прикрепленные файлы

  • 2.png (74.35 КБ)

Изменено: Jack Famous06.03.2019 15:29:16

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

Тем, кто не знает, как в Экселе добавить строку или столбец, а потом их удалить, стоит познакомиться с нашей инструкцией. Тем более, что сделать это можно с помощью разных методик — начиная от использования «горячих клавиш» и заканчивая «умными таблицами». 

Вставка строк и столбцов между уже существующих 

Самый простой способ, как в Экселе добавить строки в таблице, будет одинаковым для всех версий офисного пакета, от 1997 до 2019. Алгоритм добавления выглядит следующим образом: 

  1. Открыть нужный лист и таблицу, в которую будут добавляться элементы. 
  2. Выбрать любую ячейку в той строке, над которой будет добавляться новый ряд. 
  3. Кликнуть по этой ячейке правой кнопкой мыши, а в открывшемся меню выбрать вставку. Или заменить это действие нажатием комбинации Ctrl + «+». 
  4. Указать, что добавить нужно именно строку, а не другие элементы, и нажать ОК. 

Результатом станет добавление новой строки над выбранным рядом. Она будет, во-первых, пустой и, во-вторых, форматированной точно так же, как ячейка, с помощью которой выполнялась вставка. Сохранятся размеры и границы, выравнивание, цвет текста и заполнения. 

Еще один способ, как вставить строку в таблицу Эксель, предполагает выделение номера нужной строки, открытие контекстного меню правой кнопкой мыши и выбор вставки. С помощью этой же методики можно добавлять сразу несколько рядов. Для этого придется перед вставкой выделить 2, 3 или большее количество строк. Число добавленных рядов и их форматирование будет совпадать с выделенной областью. Новые строки появляются над верхней выделенной. 

Все эти способы могут применяться и для добавления колонок. В первом случае придется выбрать не «строку», а «столбец». Во втором — выделять литеры, которыми обозначены колонки. Новые столбцы добавляются левее выделенных с полным сохранением форматирования. 

Добавление элементов в конце таблицы 

Разбираясь, как добавить строку в готовую таблицу Эксель, стоит рассмотреть еще один способ — вставка нового элемента в самом конце нужной области. Если попробовать сделать это одним из предыдущих способов, новый ряд окажется расположенным отдельно. Его форматирование не будет соответствовать таблице, а при наличии границ строка будет отличаться от основной таблицы даже визуально. Для добавления ряда следует выполнить другие действия: 

  1. Выделить последнюю строку таблицы. Но только не всю, а по ширине готовой таблицы. 
  2. Навести курсор на самую нижнюю ячейку справа, подождав, пока он не примет форму крестика. 
  3. Нажав и не отпуская левую клавишу мыши, «растянуть» таблицу вниз на нужное количество рядов. 
  4. Отпустить кнопку. 

Результатом этих действий станет добавление в конце таблицы нужного количества строк, форматирование которых будет полностью совпадать с последним рядом. Однако ячейки окажутся заполнены данными — так же, как при копировании формул сразу в нескольких столбцах. Чтобы от этого избавиться, информацию можно удалить, выделив всю добавленную область (хотя она и так оказывается выделенной по умолчанию после вставки) и нажать «Delete». 

Точно такими же способами можно увеличивать и количество столбцов. Единственное отличие — сложности с выделением колонки, которая может состоять из десятков, сотен и даже нескольких тысяч значений. Поэтому столбец стоит выделять кликом мыши по обозначающей его литере. А перетягивать — с помощью крестика, расположенного в верхнем правом углу выделенной области. Таблица «растягивается» направо, а область точно так же очищается от данных. 

  • Как в Экселе протянуть формулу по строке или столбцу: 5 способов

Удаление столбцов и строк 

Разобравшись с добавлением колонок и рядов, стоит познакомиться и со способами, как удалить строку в Эксель или избавиться от ненужного столбца. В зависимости от того, как расположены по отношению друг к другу требующие удаления элементы, методика может быть простой или сложной. 

Проще всего пользоваться таким алгоритмом: 

  1. Выделить строки или столбцы, которые будут удаляться. Сделать это быстрее всего можно, кликая по номерам рядов или по литерам, которыми обозначены колонки. Если элементов много, выделяя их, следует держать зажатой клавишу Ctrl. 
  2. Выбрать один из способов удаления строки или столбца. Это может быть команда «Удалить» в контекстном меню и выбор типа удаляемого элемента. Или нажатие комбинации Ctrl + «-». И даже иконка на панели инструментов в группе «Ячейки». 

Если удалению подлежат только пустые, то есть не содержащие ни текста, ни чисел, ни любых других данных ряды или колонки, можно воспользоваться другой методикой. Для этого придется сначала выделить всю таблицу и на главной вкладке выбрать пункт «Найти и выделить». Затем указать, что нужно выделить группу ячеек. 

После выбора нужного варианта («пустые ячейки») в таблице окажутся выделенными все пустые строки и столбцы. Их можно будет удалить одним нажатием комбинации Ctrl + «-», указав, что удаляются не ячейки, а колонки или ряды. 

Правда, перед тем, как удалить столбец или строку в Эксель, придется удостовериться, что в таблице нет отдельных пустых ячеек. Иначе удаление затронет и те колонки или ряды, которые заполнены только частично. 

  • Как сделать в Экселе выпадающий список: 3 способа 

Работа с «умными таблицами» 

У пользователей MS Excel есть возможность упростить работу с данными с помощью «умных таблиц». Они легко увеличиваются, позволяя добавлять новые строки без лишних действий. Хотя перед началом работы с такими таблицами, их придется создать: 

  1. На главной вкладке выбрать элемент «Форматировать как таблицу». 
  2. В открывшемся списке выбрать подходящий стиль оформления. 
  3. Убедиться в том, что программа автоматически распознала место расположения таблицы. При необходимости изменить адреса расположения данных. 
  4. Нажать «ОК», получив табличку в выбранном стиле. 

Теперь можно заняться форматированием данных. Чтобы вставить столбец в Экселе или строку «умной таблицы» понадобится намного меньше времени. Если элемент добавляется посередине, следует выбрать нужную ячейку, открыть контекстное меню и указать подходящий вариант. Вставлять можно колонки слева или ряды выше выделенной области. 

Вставка может быть автоматической — с помощью комбинации Ctrl + «+». Если добавляется строка, выделяется только одна ячейка. Для добавления столбца придется выделить не меньше двух, расположенных в одной колонке друг под другом. 

Точно такие же способы, «горячие» клавиши или контекстное меню применяют и для удаления колонок и рядов. Но главная особенность «умной» таблицы — автоматическое добавление строки в самом конце и крайнего правого столбца. Для этого нужно заполнить одну ячейку — нужные элементы добавятся автоматически, увеличив таблицу на одну колонку или ряд.  

  • Как сделать сводную таблицу в Excel

Подведение итогов 

Разобравшись, как добавить и убрать столбцы в Эксель или как сделать то же самое со строками таблицы, можно ускорить работу с программой. Для небольших объемов данных стоит выбирать самые простые методики. При необходимости в частом редактировании можно рассматривать возможность использования функций «умной таблицы». 

Читайте также:

  • Матрица монитора: какая лучше? Узнайте до того, как будете покупать
  • Настраиваем VPN сразу на роутере: как это сделать?

ILF_ollie

2 / 2 / 0

Регистрация: 19.08.2010

Сообщений: 70

1

Удаление строк из умной таблицы по условию

10.06.2016, 12:33. Показов 12988. Ответов 6

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день, уважаемые форумчане.
Имеется кусок кода, который удаляет строки по условию
При этом удаляется строка целиком.
Подскажите, пожалуйста, как можно доработать код, чтобы удалялась только строка умной таблицы.
Пробовал вместо delra.EntireRow.Delete использовать ListRow, но не работает

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim Ra As Range, delra As Range, cell As Range
    Set Ra = Application.Range("Table1[Name]")
  
    For Each cell In Ra.Cells
    If (cell = "") Then
    
    If delra Is Nothing Then Set delra = cell Else Set delra = Union(delra, cell)
    End If
    Next cell
 
    If Not delra Is Nothing Then delra.EntireRow.Delete

С уважением,



0



KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

10.06.2016, 13:41

2

Visual Basic
1
If Not delra Is Nothing Then Intersect(delra.EntireRow, [Table1]).Delete Shift:=xlUp



2



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

10.06.2016, 13:53

3

Можно ещё и так :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Test()
    Dim iSource As Range, iRow&, iArr 'As Variant
    Set iSource = Application.Range("Table1[Name]")
  
    If Application.CountIf(iSource, "") > 0 Then
       Application.ScreenUpdating = False
       
       iArr = iSource.Value
       For iRow = UBound(iArr) To 1 Step -1
           If Len(iArr(iRow, 1)) = 0 Then iSource(iRow).Delete
       Next
       
       Application.ScreenUpdating = True
    Else
       MsgBox "Нет данных, подлежащих удалению", , ""
    End If
End Sub



0



1 / 1 / 0

Регистрация: 23.06.2015

Сообщений: 2

09.02.2018, 16:21

4

Ваш, вариант почему-то удалил столбец с условиями. А KoGG 100% рабочую поправочку дал.



0



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

09.02.2018, 20:03

5

kislotik, Если решили начать с притензий, то опубликуйте(выложите) свою таблицу(или часть), где кроме удаления строк «умной» таблицы будут удалены и данные, которые не относятся к этой таблице. И, разумеется, не забудьте указать Вашу версию Excel.



0



kislotik

1 / 1 / 0

Регистрация: 23.06.2015

Сообщений: 2

09.02.2018, 21:25

6

Прошу прощения уважаемый pashulka, никаких претензий, код не сработал исключительно в моем случае. Так, как я решил свою проблему кодом выше, истязаться экспериментами к сожалению нет ни времени ни желания.

Код ниже, который у меня заработал.
С отключением событий в

моем случае

работает гораздо быстрее.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Application.EnableEvents = False
Dim Ra As Range, delra As Range, cell As Range
    Set Ra = Application.Range("Table1[Name]")
  
    For Each cell In Ra.Cells
    If (cell = "") Then
    
    If delra Is Nothing Then Set delra = cell Else Set delra = Union(delra, cell)
    End If
    Next cell
 
   If Not delra Is Nothing Then Intersect(delra.EntireRow, [Table1]).Delete Shift:=xlUp
Application.EnableEvents = True
End Sub

Извините если неправильно был понят.



1



4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

09.02.2018, 21:36

7

Не должен мой код удалять ничего, кроме строк умной таблицы, без относительно личности поэтому файл-пример важен.

P.S. Возможно причины неудач кроятся в коде событий, но это гадание …



0



Цикл на удаление строк в умной таблице с условием

Raven2009

Дата: Воскресенье, 15.12.2019, 18:03 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Добрый день.

Есть файл, где на листе Аномалии есть умная таблица. На другом листе кнопка.

Я написал цикл и повесил на кнопку, который удаляет все строчки, где встречается Недостача… Но что-то явно упустил, после цикла 1 строка остается нетронутой… Что там поправить нужно, подскажите?

К сообщению приложен файл:

test1.xlsb
(31.2 Kb)

 

Ответить

RAN

Дата: Воскресенье, 15.12.2019, 18:37 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

[vba]

Код

Sub qq()
    Dim i&
    With Worksheets(«$Аномалии»).ListObjects(1).ListColumns(«Тип аномалии»)
        For i = .Range.Row + .ListRows.Count To .Range.Row Step -1
            If Worksheets(«$Аномалии»).Cells(i, .Column) = «Недостача» Then Worksheets(«$Аномалии»).Cells(i, .Column).Delete
        Next
    End With
End Sub

[/vba]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANВоскресенье, 15.12.2019, 18:48

 

Ответить

Raven2009

Дата: Воскресенье, 15.12.2019, 19:08 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Спасибо вам большое)) Значит через Do… Loop, который я писал на кнопку, нельзя сделать?

 

Ответить

RAN

Дата: Воскресенье, 15.12.2019, 19:33 |
Сообщение № 4

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Да почему нельзя? Но мне лень.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Raven2009

Дата: Воскресенье, 15.12.2019, 19:41 |
Сообщение № 5

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Кстати выдает ошибку на вашем коде в строке, где For… Объект не поддерживает метод или что-то вроде этого…

На кнопке цикл уже написан был, но там что-то поправить нужно (возможно 1 строчку).

 

Ответить

RAN

Дата: Воскресенье, 15.12.2019, 20:08 |
Сообщение № 6

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Зря я занялся улучшайзингом. :(
В 2х экземплярах
[vba]

Код

Sub qq()
    Dim i&
    With Worksheets(«$Аномалии»).ListObjects(1)
        For i = .Range.Row + .ListRows.Count To .Range.Row Step -1
            If Worksheets(«$Аномалии»).Cells(i, .ListColumns(«Тип аномалии»).Range.Column) = «Недостача» Then Worksheets(«$Аномалии»).Cells(i, .ListColumns(«Тип аномалии»).Range.Column).Delete
        Next
    End With
End Sub
Sub ww()
    Dim i&
    With Worksheets(«$Аномалии»).ListObjects(1)
        i = .Range.Row + .ListRows.Count
        Do While i > .Range.Row
            If Worksheets(«$Аномалии»).Cells(i, .ListColumns(«Тип аномалии»).Range.Column) = «Недостача» Then Worksheets(«$Аномалии»).Cells(i, .ListColumns(«Тип аномалии»).Range.Column).Delete
            i = i — 1
            DoEvents ‘ для возможности прерывания кода в случае ошибки
        Loop
    End With
End Sub

[/vba]

Цикл на удаление строк всегда идет снизу вверх, иначе неизбежны (или преодолимы весьма сложными плясками с бубном) ошибки.

.ListColumns(«Тип аномалии»).Range.Column можно заменить на 6 :)


Быть или не быть, вот в чем загвоздка!

 

Ответить

Kuzmich

Дата: Воскресенье, 15.12.2019, 20:13 |
Сообщение № 7

Группа: Проверенные

Ранг: Ветеран

Сообщений: 707


Репутация:

154

±

Замечаний:
0% ±


Excel 2003

Цитата

Кстати выдает ошибку на вашем коде в строке, где For… Объект не поддерживает метод или что-то вроде этого…

Там нужно строку
[vba]

Код

If Worksheets(«$Аномалии»).Cells(i, .ListColumns(«Тип аномалии»).Range.Column) = «Недостача» Then Worksheets(«$Аномалии»).Cells(i, .ListColumns(«Тип аномалии»).Range.Column).Delete

[/vba]
уместить либо в одну строку, либо
[vba]

Код

If Worksheets(«$Аномалии»).Cells(i, .ListColumns(«Тип аномалии»).Range.Column) = «Недостача» Then
   Worksheets(«$Аномалии»).Cells(i, .ListColumns(«Тип аномалии»).Range.Column).Delete
End If

[/vba]

 

Ответить

Raven2009

Дата: Воскресенье, 15.12.2019, 20:19 |
Сообщение № 8

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Ошибка возникает на строке, которая начинается с For i…

Насчет if я понимаю))

Может получится все-таки посмотреть вариант с Do Until… Loop? Мне интересно понять, что я не так написал там? 1 строка остается не удаленной…

 

Ответить

RAN

Дата: Воскресенье, 15.12.2019, 20:21 |
Сообщение № 9

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Kuzmich, проблема не в этом.
Почему-то, при улучшайзинге, у меня код продолжил работать даже после того, как я туда вклинил 2 ошибки


Быть или не быть, вот в чем загвоздка!

 

Ответить

Kuzmich

Дата: Воскресенье, 15.12.2019, 20:23 |
Сообщение № 10

Группа: Проверенные

Ранг: Ветеран

Сообщений: 707


Репутация:

154

±

Замечаний:
0% ±


Excel 2003

У меня конвертер не берет файл test1.xlsb,
поэтому посмотреть не могу.

 

Ответить

RAN

Дата: Воскресенье, 15.12.2019, 20:25 |
Сообщение № 11

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

что я не так написал там?

Дык я вроде написал, что?
Kuzmich,
[vba]

Код

Sub ClearAnomaly()

Dim l As Long, iRowCount As Long
Set ShAnom = ThisWorkbook.Worksheets(«$Аномалии»)
Set AnomObj = ShAnom.ListObjects(«tAnomaly»)

    l = 1
Do Until IsEmpty(AnomObj.DataBodyRange.Cells(l, 1))
   If AnomObj.Range.Cells(l, 6) = «Недостача» Then
        AnomObj.Range.Delete
    End If
   l = l + 1
Loop

ActiveWorkbook.Save

End Sub

[/vba]


Быть или не быть, вот в чем загвоздка!

 

Ответить

bmv98rus

Дата: Воскресенье, 15.12.2019, 20:27 |
Сообщение № 12

Группа: Друзья

Ранг: Участник клуба

Сообщений: 4009


Репутация:

760

±

Замечаний:
0% ±


Excel 2013/2016

Raven2009, боротся с недосдачей лучше всего отфильтровав, удалить :-)
[vba]

Код

    With Sheets(«$Аномалии»).ListObjects(«tAnomaly»).Range
        .AutoFilter Field:=6, Criteria1:= _
        «Недостача»
       .Offset(1).Resize(.Rows.Count — 1).EntireRow.Delete Shift:=xlUp
        .AutoFilter Field:=6
    End With

[/vba]


Замечательный Временно просто медведь , процентов на 20.

 

Ответить

Raven2009

Дата: Понедельник, 16.12.2019, 09:37 |
Сообщение № 13

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

здравствуйте. Код на 1 раз. В первый раз удаляются недостачи, во второй раз все остальное, в третий раз — выдает ошибку…

Я с автофильтром не очень знаком, что-то наверно не так…

 

Ответить

Raven2009

Дата: Понедельник, 16.12.2019, 10:31 |
Сообщение № 14

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

у меня код продолжил работать даже после того

Что то не работают ваши экземпляры у меня… Строки с недостачами не удаляются…

К сообщению приложен файл:

test1.xlsm
(34.6 Kb)

 

Ответить

RAN

Дата: Понедельник, 16.12.2019, 10:45 |
Сообщение № 15

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Ну слепой я, и считать плохо умею. А самостоятельно посчитать, что столбец Е пятый, а не шестой не судьба?
Или вообще оставить как было с определением номера столбца по названию? А то в одном месте сменили, в другом нет.

[p.s.]Поглядел старый файл. Оказывается это не я плохо считать умею, это у кого-то ручки шаловливые.[/p.s.]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANПонедельник, 16.12.2019, 10:59

 

Ответить

Raven2009

Дата: Понедельник, 16.12.2019, 11:03 |
Сообщение № 16

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Или вообще оставить как было с определением номера столбца по названию?

Таким способом кстати говоря удаляется сам столбец. Прально, нет столбца — нет проблемы)))

Да и вообще он удаляется. Что цифра там, что ссылка на название…

Сообщение отредактировал Raven2009Понедельник, 16.12.2019, 11:09

 

Ответить

RAN

Дата: Понедельник, 16.12.2019, 11:09 |
Сообщение № 17

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Таким способом кстати говоря удаляется сам столбец

Покажите это чудо.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Raven2009

Дата: Понедельник, 16.12.2019, 11:21 |
Сообщение № 18

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Интересно это чудо работает. То удаляет столбец вообще, то и правильно удаляет строчки с недостачами.

каким образом? видео снять? Вот файл после последнего удаления столбца.

К сообщению приложен файл:

8987635.xlsm
(33.5 Kb)

 

Ответить

китин

Дата: Понедельник, 16.12.2019, 11:29 |
Сообщение № 19

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

моя попыточка

[vba]

Код

Sub ttt()
Dim tt_&, i_&
   With Sheets(«$Аномалии»)
    tt_ = .Cells(Rows.Count, 1).End(xlUp).Row
        For i_ = tt_ To 2 Step -1
         If .Cells(i_, 5).Value = «Недостача» Then
          .Rows(i_).Delete
         End If

                 Next i_
   End With
End Sub

[/vba]


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

RAN

Дата: Понедельник, 16.12.2019, 11:38 |
Сообщение № 20

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Ну не зря же таблицу «умной» называют. Вот она и умничает. :D
Измените строку удаления
[vba]

Код

If Worksheets(«$Аномалии»).Cells(i, .ListColumns(«Тип аномалии»).Range.Column) = «Недостача» Then .ListRows(i — .Range.Row).Delete

[/vba]

[p.s.]Если все сплошь недостача, и ее нужно удалить — то зачем столбец? hands [/p.s.]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANПонедельник, 16.12.2019, 11:40

 

Ответить

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Как удалить строку столбец как добавить строку столбец в excel
  • Как удалить строку в excel по параметру ячейки
  • Как удалить строку столбец или ячейку в excel
  • Как удалить строку содержащую слово excel
  • Как удалить строку с пустой ячейкой в excel vba

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии