Excel vba удаление строк умной таблицы

Sub Переработки()
    
    Dim tbl As Object
    Dim lastrow, lastrow1, lastrow2, lastcol As Integer
    Dim i, j As Integer
    Dim tip, fio, data, ob, vid, vr As Variant
    Dim mes As Integer
    Dim ListRow As ListRow
    
    Set tbl = Workbooks("Люди.xlsm").Sheets("Переработки").ListObjects("Переработка")
    mes = Workbooks("Люди.xlsm").Sheets("Табель").Range("B1").Value
    lastrow = Workbooks("Люди.xlsm").Sheets("Табель").Cells(Rows.Count, 1).End(xlUp).Row
    lastrow1 = tbl.DataBodyRange.Rows.Count
    tbl.DataBodyRange.Delete
    
    lastrow2 = Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Rows.Count + 1
    lastcol = Workbooks("Люди.xlsm").Sheets("Табель").Cells(3, Columns.Count).End(xlToLeft).Column
    
    For i = 4 To lastrow
        For j = 6 To lastcol
            If Workbooks("Люди.xlsm").Sheets("Табель").Cells(i, j).Interior.Color = vbYellow Then
                lastrow1 = lastrow1 + 1
                fio = Workbooks("Люди.xlsm").Sheets("Табель").Cells(i, 2)
                data = CDate(Workbooks("Люди.xlsm").Sheets("Табель").Cells(3, j) & "." & mes & ".2022")
                If Workbooks("Люди.xlsm").Sheets("Табель").Cells(3, j).Interior.Color = vbGreen Then
                    tip = "выходной"
                    vr = Workbooks("Люди.xlsm").Sheets("Табель").Cells(i, j)
                Else
                    tip = "рабочий"
                    vr = Workbooks("Люди.xlsm").Sheets("Табель").Cells(i, j) - 8
                End If
                Call Значения(lastrow2, tip, fio, data, ob, rab)
                Call Переработки_заполнить(tbl, lastrow1, fio, data, ob, rab, vr)
            End If
        Next j
    Next i
    MsgBox ("Переработки сформированы согласно табелю за " & mes & ".2022 г.")
End Sub

Private Sub Значения(last, tip, fio, data, ob, rab)
    Dim a, b As Integer
    Dim arr_ob() As Variant
    Dim arr_rab() As Variant
    Erase arr_ob
    Erase arr_rab
    b = 0
    If tip = "выходной" Then
        For a = 2 To lastrow2
            If Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 1) = data And Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 3) = fio Then
                ob = Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 8)
                rab = Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 9)
            End If
        Next a
    Else
        For a = 2 To last
            If Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 1) = data And Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 3) = fio And Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 7) > 8 Then
                ob = Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 8)
                rab = Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 9)
            Else
                If Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 1) = data And Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 3) = fio And Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 7) <= 8 Then
                    b = b + 1
                    ReDim Preserve arr_ob(0 To b)
                    arr_ob(UBound(arr_ob)) = Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 8)
                    ReDim Preserve arr_rab(0 To b)
                    arr_rab(UBound(arr_rab)) = Workbooks("Люди.xlsm").Sheets("Для заполнения").ListObjects("Заполнение").DataBodyRange.Cells(a, 9)
                    ob = arr_ob(UBound(arr_ob))
                    rab = arr_rab(UBound(arr_rab))
                End If
            End If
        Next a
    End If
End Sub

Private Sub Переработки_заполнить(tbl, str, fio, data, ob, rab, vr)
    tbl.Resize (tbl.Range.Resize(str, 5))
    tbl.DataBodyRange.Cells(str, 1) = fio
    tbl.DataBodyRange.Cells(str, 2) = data
    tbl.DataBodyRange.Cells(str, 3) = ob
    tbl.DataBodyRange.Cells(str, 4) = rab
    tbl.DataBodyRange.Cells(str, 5) = vr
End Sub

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


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

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

 

Ответить

Автор vasa, 21 марта 2017, 14:44


vasa

  • Посетитель форума
  • Сообщения: 31
  • Записан

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



Администратор

  • Administrator
  • Сообщения: 2,251
  • Записан

Sub Макрос()

        Dim shMat As Worksheet, lr As Long

        ‘1. Присваиваем листу «Материалы» имя «shMat», чтобы удобнее писать код.
    Set shMat = Sheets(«Материалы»)
    ‘2. Поиск последней строки по столбцу «A».
        ‘ При использовании метода «End» не должно быть скрытых строк на листе.
    lr = shMat.Cells(shMat.Rows.Count, «A»).End(xlUp).Row
    ‘3. Удаление строк с 4 по последнюю.
    shMat.Rows(«4:» & lr).Columns(«A:C»).Delete Shift:=xlUp

    End Sub



vasa

  • Посетитель форума
  • Сообщения: 31
  • Записан

Все работает правильно.
Большое спасибо.



Администратор

  • Administrator
  • Сообщения: 2,251
  • Записан

Если используется умная таблица, то можно не искать последнюю строку.
Этот макрос удаляет в умной таблице строки с 4 по последнюю.

Sub Макрос()

        Dim shMat As Worksheet, tbl As ListObject

        ‘1. Присваиваем листу «Материалы» имя «shMat», чтобы удобнее писать код.
    Set shMat = Sheets(«Материалы»)
    ‘2. Присваиваем умной таблице имя «tbl».
    Set tbl = shMat.ListObjects(«Таблица1»)
    ‘3. Удаление строк с 4 по последнюю.
    tbl.Range.Rows(«4:» & tbl.Range.Rows.Count).Delete Shift:=xlUp

    End Sub


  • Форум по VBA, Excel и Word

  • VBA, Excel

  • VBA, макросы в Excel

  • Excel Макрос: Как удалить строки вместе с форматом в умной таблице

Vba excel удалить строку умной таблицы

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

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

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

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

Сообщение Добрый день.

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

Я написал цикл и повесил на кнопку, который удаляет все строчки, где встречается Недостача. Но что-то явно упустил, после цикла 1 строка остается нетронутой. Что там поправить нужно, подскажите? Автор — Raven2009
Дата добавления — 15.12.2019 в 18:03

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

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

Raven2009 Дата: Воскресенье, 15.12.2019, 19:08 | Сообщение № 3
RAN Дата: Воскресенье, 15.12.2019, 19:33 | Сообщение № 4
Быть или не быть, вот в чем загвоздка!

Ответить

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

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

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

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

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

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

На кнопке цикл уже написан был, но там что-то поправить нужно (возможно 1 строчку). Автор — Raven2009
Дата добавления — 15.12.2019 в 19:41

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

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

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

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

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

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

Ответить

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

.ListColumns(«Тип аномалии»).Range.Column можно заменить на 6 Автор — RAN
Дата добавления — 15.12.2019 в 20:08

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

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

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

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

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

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

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

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

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

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

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

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

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

Может получится все-таки посмотреть вариант с Do Until. Loop? Мне интересно понять, что я не так написал там? 1 строка остается не удаленной. Автор — Raven2009
Дата добавления — 15.12.2019 в 20:19

RAN Дата: Воскресенье, 15.12.2019, 20:21 | Сообщение № 9
Быть или не быть, вот в чем загвоздка!

Ответить

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

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

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

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

Ответить

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

bmv98rus Дата: Воскресенье, 15.12.2019, 20:27 | Сообщение № 12
Замечательный Временно просто медведь , процентов на 20.

Ответить

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

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

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

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

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

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

Я с автофильтром не очень знаком, что-то наверно не так. Автор — Raven2009
Дата добавления — 16.12.2019 в 09:37

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

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

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

Что то не работают ваши экземпляры у меня. Строки с недостачами не удаляются. Автор — Raven2009
Дата добавления — 16.12.2019 в 10:31

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

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

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

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

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

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

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

Источник

Vba excel удалить строку умной таблицы

Здравствуйте, дамы и господа.
Есть шаблон расчёта коммерческого предложения, и ячейки, содержащие формулы, во избежание изменений и удаления, защищены.
Но! Стандартный шаблон расчёта содержит только две строки, а бывает, что считать нужно по 10-50 и более наименований.
Нарыл в сети макросы добавления/удаления строк, вроде бы приспособил под свою таблицу, но что-то идёт не так.
Во-первых, макрос, который должен вставлять строки ИСКЛЮЧИТЕЛЬНО в выделенном диапазоне(A3:H4), может их вставить и вне этого диапазона, что недопустимо. И более того, макрос удаления строк не может удалить строки, вставленные вне диапазона(A3:H4).
В файле примера жёлтым выделен диапазон, в котором не должны вставляться строки.
Пытался внести изменения самостоятельно, но желаемый результат не достигнут.
Подскажите, пожалуйста, как можно реализовать задумку?
И ещё вопрос: можно ли оптимизировать макросы удаления/добавления строк так, чтобы в шаблоне изначально стояла только одна строка, но имелась бы возможность добавлять сколько угодно(при этом формулы бы копировались во вновь добавленные строки), а потом удалять их, оставляя лишь первую?

Заранее благодарю за помощь.

Здравствуйте, дамы и господа.
Есть шаблон расчёта коммерческого предложения, и ячейки, содержащие формулы, во избежание изменений и удаления, защищены.
Но! Стандартный шаблон расчёта содержит только две строки, а бывает, что считать нужно по 10-50 и более наименований.
Нарыл в сети макросы добавления/удаления строк, вроде бы приспособил под свою таблицу, но что-то идёт не так.
Во-первых, макрос, который должен вставлять строки ИСКЛЮЧИТЕЛЬНО в выделенном диапазоне(A3:H4), может их вставить и вне этого диапазона, что недопустимо. И более того, макрос удаления строк не может удалить строки, вставленные вне диапазона(A3:H4).
В файле примера жёлтым выделен диапазон, в котором не должны вставляться строки.
Пытался внести изменения самостоятельно, но желаемый результат не достигнут.
Подскажите, пожалуйста, как можно реализовать задумку?
И ещё вопрос: можно ли оптимизировать макросы удаления/добавления строк так, чтобы в шаблоне изначально стояла только одна строка, но имелась бы возможность добавлять сколько угодно(при этом формулы бы копировались во вновь добавленные строки), а потом удалять их, оставляя лишь первую?

Заранее благодарю за помощь. Xpert

Сообщение Здравствуйте, дамы и господа.
Есть шаблон расчёта коммерческого предложения, и ячейки, содержащие формулы, во избежание изменений и удаления, защищены.
Но! Стандартный шаблон расчёта содержит только две строки, а бывает, что считать нужно по 10-50 и более наименований.
Нарыл в сети макросы добавления/удаления строк, вроде бы приспособил под свою таблицу, но что-то идёт не так.
Во-первых, макрос, который должен вставлять строки ИСКЛЮЧИТЕЛЬНО в выделенном диапазоне(A3:H4), может их вставить и вне этого диапазона, что недопустимо. И более того, макрос удаления строк не может удалить строки, вставленные вне диапазона(A3:H4).
В файле примера жёлтым выделен диапазон, в котором не должны вставляться строки.
Пытался внести изменения самостоятельно, но желаемый результат не достигнут.
Подскажите, пожалуйста, как можно реализовать задумку?
И ещё вопрос: можно ли оптимизировать макросы удаления/добавления строк так, чтобы в шаблоне изначально стояла только одна строка, но имелась бы возможность добавлять сколько угодно(при этом формулы бы копировались во вновь добавленные строки), а потом удалять их, оставляя лишь первую?

Заранее благодарю за помощь. Автор — Xpert
Дата добавления — 25.10.2017 в 11:30

Источник

Adblock
detector

Хитрости »

28 Май 2011              644588 просмотров


Как удалить строки по условию?

Предположу, что почти каждый сталкивался с ситуацией, когда необходимо удалить только определенные строки: имеется большая таблица и необходимо удалить из неё только те строки, которые содержат какое-то слово (цифру, фразу). Для выполнения подобной задачи можно воспользоваться несколькими способами.

Способ первый:
Использовать встроенное средство Excel — фильтр. Сначала его необходимо «установить» на листе:

  • Выделяем таблицу с данными, включая заголовки. Если их нет — то выделяем с самой первой строки таблицы, в которой необходимо удалить данные
  • устанавливаем фильтр:
    • для Excel 2003: ДанныеФильтрАвтофильтр
    • для Excel 2007-2010: вкладка Данные(Data)Фильтр(Filter)(или вкладка Главная(Home)Сортировка и фильтр(Sort&Filter)Фильтр(Filter))

Теперь выбираем условие для фильтра:

  • в Excel 2003 надо выбрать Условие и в появившейся форме выбрать непосредственно условие(«равно», «содержит», «начинается с» и т.д.), а напротив значение в соответствии с условием.
  • Для 2007-2010 Excel нужно выбрать Текстовые фильтры(Text Filters) и либо сразу выбрать одно из предлагаемых условий, либо нажать Настраиваемый фильтр(Custom Filter) и ввести значения для отбора в форме

После этого удалить отфильтрованные строки. В 2007 Excel могут возникнуть проблемы с удалением отфильтрованных строк, поэтому рекомендую сначала так же прочитать статью: Excel удаляет вместо отфильтрованных строк — все?! Как избежать.


 
Способ второй:

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

Sub Del_SubStr()
    Dim sSubStr As String 'искомое слово или фраза(может быть указанием на ячейку)
    Dim lCol As Long      'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim lMet As Long
    Dim arr
 
    sSubStr = InputBox("Укажите значение, которое необходимо найти в строке", "www.excel-vba.ru", "")
    If sSubStr = "" Then lMet = 0 Else lMet = 1
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "www.excel-vba.ru", 1))
    If lCol = 0 Then Exit Sub
 
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    arr = Cells(1, lCol).Resize(lLastRow).Value
    Application.ScreenUpdating = 0
    Dim rr As Range
    For li = 1 To lLastRow 'цикл с первой строки до конца
        If -(InStr(arr(li, 1), sSubStr) > 0) = lMet Then
            If rr Is Nothing Then
                Set rr = Cells(li, 1)
            Else
                Set rr = Union(rr, Cells(li, 1))
            End If
        End If
    Next li
    If Not rr Is Nothing Then rr.EntireRow.Delete
    Application.ScreenUpdating = 1
End Sub

Если значение sSubStr не будет указано, то будут удалены строки, ячейки указанного столбца которых, пустые.
Данный код необходимо поместить в стандартный модуль. Вызвать с листа его можно нажатием клавиш Alt+F8, после чего выбрать Del_SubStr и нажать Выполнить. Если в данном коде в строке
If -(InStr(Cells(li, 1), sSubStr) > 0) = lMet Then
вместо = lMet указать <> lMet, то удаляться будут строки, не содержащие указанное для поиска значение. Иногда тоже удобно.
Но. Данный код просматривает строки на предмет частичного совпадения указанного значения. Например, если Вы укажете текст для поиска «отчет», то будут удалены все строки, в которых встречается это слово(«квартальный отчет», «отчет за месяц» и т.д.). Это не всегда нужно. Поэтому ниже приведен код, который будет удалять только строки, указанные ячейки которых равны конкретно указанному значению:

Sub Del_SubStr()
    Dim sSubStr As String 'искомое слово или фраза(может быть указанием на ячейку)
    Dim lCol As Long 'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim arr
 
    sSubStr = InputBox("Укажите значение, которое необходимо найти в строке", "www.excel-vba.ru", "")
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "www.excel-vba.ru", 1))
    If lCol = 0 Then Exit Sub
 
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    arr = Cells(1, lCol).Resize(lLastRow).Value
 
    Application.ScreenUpdating = 0
    Dim rr As Range
    For li = 1 To lLastRow 'цикл с первой строки до конца
        If CStr(arr(li, 1)) = sSubStr Then
            If rr Is Nothing Then
                Set rr = Cells(li, 1)
            Else
                Set rr = Union(rr, Cells(li, 1))
            End If
        End If
    Next li
    If Not rr Is Nothing Then rr.EntireRow.Delete
    Application.ScreenUpdating = 1
End Sub

Здесь так же, как и в случае с предыдущим кодом можно заменить оператор сравнения(Cells(li, lCol) = sSubStr) с равно на неравенство(Cells(li, lCol) <> sSubStr) и тогда удаляться будут строки, значения ячеек которых не равно указанному.


УДАЛЕНИЕ СТРОК НА ОСНОВАНИИ СПИСКА ЗНАЧЕНИЙ(МНОЖЕСТВЕННЫЕ КРИТЕРИИ)
Иногда бывают ситуации, когда необходимо удалить строки не по одному значению, а по нескольким. Например, если строка содержит или Итог или Отчет. Ниже приведен код, при помощи которого можно удалить строки, указав в качестве критерия диапазон значений.
Значения, которые необходимо найти и удалить перечисляются на листе с именем «Лист2». Т.е. указав на «Лист2» в столбце А(начиная с первой строки) несколько значений — они все будут удалены. Если лист называется иначе(скажем «Соответствия») в коде необходимо будет «Лист2» заменить на «Соответствия». Удаление строк происходит на активном в момент запуска кода листе. Это значит, что перед запуском кода надо перейти на тот лист, строки в котором необходимо удалить.

Sub Del_Array_SubStr()
    Dim sSubStr As String    'искомое слово или фраза
    Dim lCol As Long    'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim avArr, lr As Long
    Dim arr
 
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "www.excel-vba.ru", 1))
    If lCol = 0 Then Exit Sub
    Application.ScreenUpdating = 0
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    'заносим в массив значения листа, в котором необходимо удалить строки
    arr = Cells(1, lCol).Resize(lLastRow).Value
    'Получаем с Лист2 значения, которые надо удалить в активном листе
    With Sheets("Лист2") 'Имя листа с диапазоном значений на удаление
        avArr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
    End With
    'удаляем
    Dim rr As Range
    For lr = 1 To UBound(avArr, 1)
        sSubStr = avArr(lr, 1)
        For li = 1 To lLastRow 'цикл с первой строки до конца
            If CStr(arr(li, 1)) = sSubStr Then
                If rr Is Nothing Then
                    Set rr = Cells(li, 1)
                Else
                    Set rr = Union(rr, Cells(li, 1))
                End If
            End If
            DoEvents
        Next li
        DoEvents
    Next lr
    If Not rr Is Nothing Then rr.EntireRow.Delete
    Application.ScreenUpdating = 1
End Sub

Чтобы код выше удалял строки не по точному совпадению слов, а по частичному(например, в ячейке записано «Привет, как дела?», а в списке есть слово «привет» — надо удалить, т.к. есть слово «привет»), то надо строку:

If CStr(arr(li, 1)) = sSubStr Then

заменить на такую:

If InStr(1, arr(li, 1), sSubStr, 1) > 0 Then

УДАЛЕНИЕ ИЗ ЛИСТА СТРОК, КОТОРЫХ НЕТ В СПИСКЕ ЗНАЧЕНИЙ(МНОЖЕСТВЕННЫЕ КРИТЕРИИ)

Т.к. в последнее время стало поступать все больше и больше вопросов как не удалять значения по списку, а наоборот — оставить в таблице только те значения, которые перечислены в списке — решил дополнить статью и таким кодом.
Значения, которые необходимо оставить перечисляются на листе с именем «Лист2». Т.е. указав на «Лист2» в столбце А(начиная с первой строки) несколько значений — после работы кода на листе будут оставлены только те строки, в которых присутствует хоть одно из перечисленных в списке значений. Если лист называется иначе(скажем «Соответствия») в коде необходимо будет «Лист2» заменить на «Соответствия». Удаление строк происходит на активном в момент запуска кода листе. Это значит, что перед запуском кода надо перейти на тот лист, строки в котором необходимо удалить.
В отличие от приведенных выше кодов, данный код ориентирован на то, что значения в списке указаны не полностью. Т.е. если необходимо оставить только те ячейки, в которых встречается слово «активы», то в списке надо указать только это слово. В этом случае если в ячейке будет записана фраза «Нематериальные активы» или «Активы сторонние» — эти ячейки не будут удалены, т.к. в них встречается слово «активы». Регистр букв при этом неважен.

'процедура оставляет в листе только те значения, которые перечислены в списке
Sub LeaveOnlyFoundInArray()
    Dim sSubStr As String   'искомое слово или фраза
    Dim lCol As Long        'номер столбца с просматриваемыми значениями
    Dim lLastRow As Long, li As Long
    Dim avArr, lr As Long
    Dim arr
    Dim IsFind As Boolean
 
    lCol = Val(InputBox("Укажите номер столбца, в котором искать указанное значение", "www.excel-vba.ru", 1))
    If lCol = 0 Then Exit Sub
    Application.ScreenUpdating = 0
    lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    'заносим в массив значения листа, в котором необходимо удалить строки
    arr = Cells(1, lCol).Resize(lLastRow).Value
    'Получаем с Лист2 значения, которые надо удалить в активном листе
    With Sheets("Лист2") 'Имя листа с диапазоном значений на удаление
        avArr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
    End With
    'удаляем
    Dim rr As Range
    For li = 1 To lLastRow 'цикл с первой строки таблицы до конца
        IsFind = False
        For lr = 1 To UBound(avArr, 1) 'цикл по списку значений на удаление
            sSubStr = avArr(lr, 1)
            If InStr(1, arr(li, 1), sSubStr, 1) > 0 Then
                IsFind = True
            End If
            DoEvents
        Next lr
        'если значение таблицы не найдено в списке - удаляем строку
        If Not IsFind Then
            If rr Is Nothing Then
                Set rr = Cells(li, 1)
            Else
                Set rr = Union(rr, Cells(li, 1))
            End If
        End If
        DoEvents
    Next li
    If Not rr Is Nothing Then rr.EntireRow.Delete
    Application.ScreenUpdating = 1
End Sub

Чтобы код выше сравнивал значения таблицы со значениями списка по точному совпадению слов, а не по частичному, то надо строку:

If InStr(1, arr(li, 1), sSubStr, 1) > 0 Then

заменить на такую:

If CStr(arr(li, 1)) = sSubStr Then

Для всех приведенных кодов можно строки не удалять, а скрывать. Для этого надо строку:

If Not rr Is Nothing Then rr.EntireRow.Delete

заменить на такую:

If Not rr Is Nothing Then rr.EntireRow.Hidden = True

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

For li = 1 To lLastRow 'цикл с первой строки до конца

1 — это первая строка; lLastRow — определяется автоматически кодом и равна номеру последней заполненной строки на листе. Если надо начать удалять строки только с 7-ой строки(например, в первых 6-ти шапка), то код будет выглядеть так:

For li = 7 To lLastRow 'цикл с седьмой строки до конца

А если надо удалять только с 3-ей по 300-ю, то код будет выглядеть так:

For li = 3 To 300 'цикл с третьей строки до трехсотой

Так же см.:
Что такое макрос и где его искать?
Что такое модуль? Какие бывают модули?
Как создать кнопку для вызова макроса на листе
Удаление всех пустых строк в таблице
Удаление пустых столбцов на листе
Установить Быстрый фильтр
Фильтр


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

In this Article

  • Delete Entire Row or Column
    • Delete Multiple Rows or Columns
  • Delete Blank / Empty Rows
    • Delete Row if Cell is Blank
  • Delete Row Based on Cell Value
  • More Delete Row and Column Examples
    • Delete Duplicate Rows
    • Delete Table Rows
    • Delete Filtered Rows
    • Delete Rows in Range
    • Delete Selected Rows
    • Delete Last Row
    • Delete Columns by Number

This tutorial will demonstrate different ways to delete rows and columns in Excel using VBA.

Delete Entire Row or Column

To delete an entire row in VBA use this line of code:

Rows(1).Delete

Notice we use the Delete method to delete a row.

Instead of referencing the Rows Object, you can reference rows based on their Range Object with EntireRow:

Range("a1").EntireRow.Delete

Similarly to delete an entire column, use these lines of code:

Columns(1).Delete
Range("a1").EntireColumn.Delete

Delete Multiple Rows or Columns

Using the same logic, you can also delete multiple rows at once:

Rows("1:3").Delete

or columns:

Columns("A:C").Delete

Notice here we reference the specific row and column numbers / letters surrounded by quotations.

Of course, you can also reference the EntireRow of a range:

Range("a1:a10").EntireRow.Delete

Note: The examples below only demonstrate deleting rows, however as you can see above, the syntax is virtually identically to delete columns.

Delete Blank / Empty Rows

This example will delete a row if the entire row is blank:

Sub DeleteRows_EntireRowBlank()

Dim cell As Range

For Each cell In Range("b2:b20")
    If Application.WorksheetFunction.CountA(cell.EntireRow) = 0 Then
        cell.EntireRow.Delete
    End If
Next cell

End Sub

It makes use of the Excel worksheet function: COUNTA.

Delete Row if Cell is Blank

This will delete a row if specific column in that row is blank (in this case column B):

Range("b3:b20").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

Delete Row Based on Cell Value

This will loop through a range, and delete rows if a certain cell value in that row says “delete”.

Sub DeleteRowswithSpecificValue()

Dim cell As Range

For Each cell In Range("b2:b20")
    If cell.Value = "delete" Then
        cell.EntireRow.Delete
    End If
Next cell

End Sub

More Delete Row and Column Examples

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

Delete Duplicate Rows

This code will delete all duplicate rows in a range:

Range("b2:c100").RemoveDuplicates Columns:=2

Notice we set Columns:=2. This tells VBA to check both the first two columns of data when considering if rows are duplicates. A duplicate is only found when both columns have duplicate values.

If we had set this to 1, only the first row would’ve been checked for duplicate values.

Delete Table Rows

This code will delete the second row in a Table by referencing ListObjects.

ThisWorkbook.Sheets("Sheet1").ListObjects("list1").ListRows(2).Delete

Delete Filtered Rows

To delete only rows that are visible after filtering:

Range("b3:b20").SpecialCells(xlCellTypeVisible).EntireRow.Delete

VBA Programming | Code Generator does work for you!

Delete Rows in Range

This code will delete all rows in range:

Range("a1:a10").EntireRow.Delete

Delete Selected Rows

This code will delete all selected rows:

Selection.EntireRow.Delete

Delete Last Row

This will delete the last used row in column B:

Cells(Rows.Count, 2).End(xlUp).EntireRow.Delete

By changing 2 to 1, you can delete the last used row in column A, etc.:

Cells(Rows.Count, 1).End(xlUp).EntireRow.Delete

Delete Columns by Number

To delete a column by it’s number, use a code like this:

Columns (2).Delete

Понравилась статья? Поделить с друзьями:
  • Excel vba удаление пустая строка
  • Excel vba удаление листа без подтверждения
  • Excel vba удаление колонок
  • Excel vba удаление диапазона строк
  • Excel vba удаление всех страниц