Макрос удалить все строки таблицы excel

 

Benson

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

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

Приветствую Вас.  
Я хочу с помощью макроса удалить все строки в таблице с одной или несколькими пустыми ячейками.  
Подскажите пожалуйста, как это сделать.  
Пример таблицы приведён в приклеплённом файле.  
Заранее благодарю Вас за помощь.

 

Serge

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

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

Поиском пользовались?  
Нет? А зря. Даже я смог найти такой готовый макрос.

 

KuklP

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

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

E-mail и реквизиты в профиле.

А почему не в поиск? «Удаление строк с пустой ячейкой»

Я сам — дурнее всякого примера! …

 

Benson

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

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

я только начинаю изучать макросы, может сможете мне подкинуть готовый вариант макроса для моего примера.

 

Serge

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

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

{quote}{login=Benson}{date=27.12.2011 11:36}{thema=Re: }{post}я только начинаю изучать макросы, может сможете мне подкинуть готовый вариант макроса для моего примера.{/post}{/quote}В поиск забейте название темы.

 

на сайте

http://www.excel-vba.ru/

есть хороший макрос удаления строк по условию

 

Станислав

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

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

При удалении строк таблицы excel при помощи vba:  

  При записи макроса пишет код:  
Range(«Расходы_товары»).Select  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  
Selection.ListObject.ListRows(1).De lete  

  А код написанный мной для таблицы содержащей разное количество строк не работает.  

  Range(«Расходы_товары»).Select  
Selection.ListObject.ListRows.De lete

 

Станислав

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

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

Использовал макрос умных людей:  

  Option Explicit  

  Sub УдалениеСтрокПоУсловию()  
   Dim ra As Range, delra As Range, ТекстДляПоиска As String  
   Application.ScreenUpdating = False    ‘ отключаем обновление экрана  
  ‘ТекстДляПоиска = InputBox(«Введите криерий для удаления строк»)    ‘ удаляем строки с таким текстом  
   ТекстДляПоиска = «»  ‘ удаляем пучтые строки  
   ‘ перебираем все строки в используемом диапазоне листа  
  For Each ra In ActiveSheet.UsedRange.Rows  
       ‘ если в строке найден искомый текст  
      If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then  
           ‘ добавляем строку в диапазон для удаления  
          If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)  
       End If  
   Next  
   ‘ если подходящие строки найдены — удаляем их  
  If Not delra Is Nothing Then delra.EntireRow.Delete  
End Sub  

    Он мне стёр все таблицы, и даже те которые удалять не надо было.

 

KuklP

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

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

E-mail и реквизиты в профиле.

Вот макрос для Вашего примера:  
Sub www()  
On Error Resume Next  
   [D:D].Replace 0, «», LookAt:=xlWhole
   [a1].CurrentRegion.SpecialCells(4).EntireRow.Delete
End Sub

Я сам — дурнее всякого примера! …

 

Станислав

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

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

{quote}{login=KukLP}{date=27.12.2011 11:50}{thema=}{post}Вот макрос для Вашего примера:  
Sub www()  
On Error Resume Next  
   [D:D].Replace 0, «», LookAt:=xlWhole
   [a1].CurrentRegion.SpecialCells(4).EntireRow.Delete
End Sub{/post}{/quote}  

  А как заставить макрос работать с этой таблицей?  
Спасибо.

 

k61

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

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

попаразитировать на макросе Сергея:  
Sub www1()  
On Error Resume Next  
[a1].CurrentRegion.SpecialCells(4).EntireRow.Delete
End Sub

 

Станислав

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

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

Попытался использовать    
   Range(«Таблица2»).Select

 

Станислав

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

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

Попробовал прописать так:  

  Dim i As Integer  
i = ActiveCell.Row — Range(«Таблица2»).Row + 1  
Range(«Таблица2»).ListObject.ListRows(i).Delete  

  По прежнему не работает.

 

Станислав

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

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

{quote}{login=Станислав}{date=28.12.2011 07:15}{thema=}{post}Попробовал прописать так:  

  Dim i As Integer  
i = ActiveCell.Row — Range(«Таблица2»).Row + 1  
Range(«Таблица2»).ListObject.ListRows(i).Delete  

  По прежнему не работает.{/post}{/quote}  

  Dim i As Integer  

  i = Range(«Расходы_товары»).Row  
Range(«Расходы_товары»).ListObject.ListRows(i).Delete  

  Такой вариант тоже не проходит

 

ran

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

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

А так?  
Sub www()  
Dim aaa&  
On Error Resume Next  
   [D:D].Replace 0, «», LookAt:=xlWhole
   For i = [a1].CurrentRegion.Rows.Count To 2 Step -1
   aaa = 0  
   aaa = Rows(i).SpecialCells(4).Count  
   If aaa > 0 Then Rows(i).Delete  
   Next  
End Sub  

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

 

ran

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

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

Понял, спасибо. Про ошибку не подумал.

 

{quote}{login=KukLP}{date=27.12.2011 11:50}{thema=}{post}Вот макрос для Вашего примера:  
Sub www()  
On Error Resume Next  
   [D:D].Replace 0, «», LookAt:=xlWhole
   [a1].CurrentRegion.SpecialCells(4).EntireRow.Delete
End Sub{/post}{/quote}  

    ОГРОМНОЕ ВАМ СПАСИБО!!!!  
ПРОСТО КЛАСС….  
РАБОТАЕТ НА ВСЕ 100%….

 

Benson

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

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

{quote}{login=}{date=28.12.2011 09:52}{thema=Re: }{post}{quote}{login=KukLP}{date=27.12.2011 11:50}{thema=}{post}Вот макрос для Вашего примера:  
Sub www()  
On Error Resume Next  
   [D:D].Replace 0, «», LookAt:=xlWhole
   [a1].CurrentRegion.SpecialCells(4).EntireRow.Delete
End Sub{/post}{/quote}  

    ОГРОМНОЕ ВАМ СПАСИБО!!!!  
ПРОСТО КЛАСС….  
РАБОТАЕТ НА ВСЕ 100%….

 

Benson

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

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

{quote}{login=KukLP}{date=27.12.2011 11:50}{thema=}{post}Вот макрос для Вашего примера:  
Sub www()  
On Error Resume Next  
   [D:D].Replace 0, «», LookAt:=xlWhole
   [a1].CurrentRegion.SpecialCells(4).EntireRow.Delete
End Sub{/post}{/quote}  

    ОГРОМНОЕ ВАМ СПАСИБО!!!!  
ПРОСТО КЛАСС….  
РАБОТАЕТ НА ВСЕ 100%….

 

KuklP

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

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

E-mail и реквизиты в профиле.

Че-то Bensonа заело:-)

Я сам — дурнее всякого примера! …

 

Benson

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

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

Да уж…Бывает и такое…Комп завис :)  
Щас проверил Ваш макрос для таблицы с другим расскладом, но что-то не работает :(

 

KuklP

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

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

E-mail и реквизиты в профиле.

Насчет «другим расскладом, но что-то не работает». В правилах форума: «Совсем необязательно выкладывать файл полностью. Зачастую, чтобы понять и помочь — достаточно таблицы на 10-20 строк. Но при этом старайтесь сохранить структуру, расположение таблиц, имена листов — аналогично оригиналу. Если файл содержит служебную информацию — просто замените Ваши данные на нейтральные. На сайте любят оперировать с апельсинами :-)» Отправил Ваш файл по почте.

Я сам — дурнее всякого примера! …

 

Benson

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

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

Ещё раз хочу поблагодарить Вас за помощь…  
Вы мне очень помогли…  
Вот мне бы так уметь писать макросы, в этом деле я только начинающий :)…

 

{quote}{login=Станислав}{date=28.12.2011 07:17}{thema=Re: }{post}{quote}{login=Станислав}{date=28.12.2011 07:15}{thema=}{post}Попробовал прописать так:  

  Dim i As Integer  
i = ActiveCell.Row — Range(«Таблица2»).Row + 1  
Range(«Таблица2»).ListObject.ListRows(i).Delete  

  По прежнему не работает.{/post}{/quote}  

  Dim i As Integer  

  i = Range(«Расходы_товары»).Row  
Range(«Расходы_товары»).ListObject.ListRows(i).Delete  

  Такой вариант тоже не проходит{/post}{/quote}  

      Попробуй так, может получится:  
Sub DelRow()  
   With ListObjects(«Таблица2»)  
       .ListRows(.ListRows.Count).Delete  
   End With  
End Sub  
А если нет, тогда я тоже не знаю…. )))

 

KuklP

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

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

E-mail и реквизиты в профиле.

Sub www()  
   Dim i&, a As Range: On Error Resume Next  
   With ActiveSheet.ListObjects(«Таблица2»)  
       For i = 1 To 4  
           .Range.AutoFilter i, «=0», 2, «=»  
           For Each a In .DataBodyRange.SpecialCells(12).Areas  
               a.EntireRow.Delete  
           Next  
           .Range.AutoFilter Field:=i  
       Next  
   End With  
End Sub

Я сам — дурнее всякого примера! …

 

KuklP

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

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

E-mail и реквизиты в профиле.

Для 0:  
           .Range.AutoFilter i, «=0.00», 2, «=»

Я сам — дурнее всякого примера! …

 

Станислав

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

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

{quote}{login=KukLP}{date=28.12.2011 04:24}{thema=}{post}Для 0:  
           .Range.AutoFilter i, «=0.00», 2, «=»{/post}{/quote}  
Спасибо. Попробую.

 

Станислав

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

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

{quote}{login=KukLP}{date=28.12.2011 04:20}{thema=}{post}Sub www()  
   Dim i&, a As Range: On Error Resume Next  
   With ActiveSheet.ListObjects(«Таблица2»)  
       For i = 1 To 4  
           .Range.AutoFilter i, «=0», 2, «=»  
           For Each a In .DataBodyRange.SpecialCells(12).Areas  
               a.EntireRow.Delete  
           Next  
           .Range.AutoFilter Field:=i  
       Next  
   End With  
End Sub{/post}{/quote}  

  SpecialCells(12).Areas, при увеличении таблица цифру 12 менять  
Range.AutoFilter i, «=0», 2, «=», а это разбивка по столбцам?

 

KuklP

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

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

E-mail и реквизиты в профиле.

1) >>SpecialCells(12).Areas, при увеличении таблица цифру 12 менять  
Ни в коем случае. SpecialCells(12) — это только видимые(отобранные) ячейки.  
2) Да.

Я сам — дурнее всякого примера! …

 

Муля

Гость

#30

28.12.2011 23:56:42

{quote}{login=KukLP}{date=27.12.2011 11:50}{thema=}{post}Вот макрос для Вашего примера:  
Sub www()  
On Error Resume Next  
   [D:D].Replace 0, «», LookAt:=xlWhole
   [a1].CurrentRegion.SpecialCells(4).EntireRow.Delete
End Sub{/post}{/quote}  
Ребята извините за непрошеное вторжение в тему, но вот никак не пойму, что в макросе поменять, чтобы он удалял строку, по пустым ячейкам, только одного, конкретно взятого столбца?  
С ув. Муля!

макрос удалит на листе все строки, в которых содержится искомый текст:

(пример — во вложении ConditionalRowsDeleting.xls)

Sub УдалениеСтрокПоУсловию()
    Dim ra As Range, delra As Range, ТекстДляПоиска As String
    Application.ScreenUpdating = False    ' отключаем обновление экрана

    ТекстДляПоиска = "Наименование ценности"    ' удаляем строки с таким текстом

    ' перебираем все строки в используемом диапазоне листа
    For Each ra In ActiveSheet.UsedRange.Rows
        ' если в строке найден искомый текст
        If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then
            ' добавляем строку в диапазон для удаления
            If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
        End If
    Next
    ' если подходящие строки найдены - удаляем их
    If Not delra Is Nothing Then delra.EntireRow.Delete
End Sub

Чтобы вместо удаления просто скрыть такие строки, замените строку

If Not delra Is Nothing Then delra.EntireRow.Delete

на

If Not delra Is Nothing Then delra.EntireRow.Hidden=TRUE

Расширенная версия этого макроса — с использованием UserForm для ввода искомого значения

Function ПоискСтрокПоУсловию(ByVal ТекстДляПоиска As String, Optional HideOnly As Boolean) As Long
    ' функция получает в качестве параметра ТекстДляПоиска (можно использовать символы * и ?)
    ' Если HideOnly = TRUE, то строки, содержащие в ячейках ТекстДляПоиска, скрываются,
    ' иначе (HideOnly = FALSE - по умолчанию) - удаляются
    ' Функция возвращает количество удалённых строк
    Dim ra As Range, delra As Range
    Application.ScreenUpdating = False    ' отключаем обновление экрана

    ' перебираем все строки в используемом диапазоне листа
    For Each ra In ActiveSheet.UsedRange.Rows
        ' если в строке найден искомый текст
        If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then
            ' добавляем строку в диапазон для удаления
            If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
        End If
    Next
    On Error Resume Next: ПоискСтрокПоУсловию = delra.Areas.Count ' количество найденных строк
    
    If Not delra Is Nothing Then    ' если подходящие строки найдены - скрываем или удаляем их
        If HideOnly Then delra.EntireRow.Hidden = True Else delra.EntireRow.Delete
    End If
End Function

Ещё один вариант кода, позволяющего выполнять поиск (с последующим удалением или скрытием строк) сразу по нескольким условиям:

Sub УдалениеСтрокПоНесколькимУсловиям()
    Dim ra As Range, delra As Range
    Application.ScreenUpdating = False    ' отключаем обновление экрана

    ' ищем и удаляем строки, содержащие заданный текст
    ' (можно указать сколько угодно значений, и использовать подстановочные знаки)
    УдалятьСтрокиСТекстом = Array("Наименование *", "Количество", _
                                  "текст?", "цен*сти", "*78*")
 
    ' перебираем все строки в используемом диапазоне листа
    For Each ra In ActiveSheet.UsedRange.Rows
        ' перебираем все фразы в массиве
        For Each word In УдалятьСтрокиСТекстом
            ' если в очередной строке листа найден искомый текст
            If Not ra.Find(word, , xlValues, xlPart) Is Nothing Then
                ' добавляем строку в диапазон для удаления
                If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
            End If
        Next word
    Next
 
    ' если подходящие строки найдены, то: (оставьте одну из 2 следующих строк)
    If Not delra Is Nothing Then delra.EntireRow.Hidden = True    ' скрываем их
    If Not delra Is Nothing Then delra.EntireRow.Delete    ' удаляем их
End Sub

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

Программное удаление всех строк динамической таблицы.

Сергей13

Дата: Суббота, 09.03.2019, 13:03 |
Сообщение № 1

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

Ранг: Обитатель

Сообщений: 344


Репутация:

0

±

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


Excel 2016

Здравствуйте!
Ребята, через запись действий пытаюсь записать макрос удаления всех строк динамической таблицы, типа полная очистка ненужного. Но в коде прописывается фиксированное количество удалений, в зависимости от созданных строк. Как это можно обойти, дабы удалить все строки таблицы (конечно за исключением начальной) в независимости от количества созданных строк.
[vba]

Код

Application.Goto Reference:=»tabl_logbook»
    Selection.ListObject.ListRows(1).delete
    Selection.ListObject.ListRows(1).delete
    Selection.ListObject.ListRows(1).delete
    Selection.ListObject.ListRows(1).delete
    Selection.ListObject.ListRows(1).delete

[/vba]

Сообщение отредактировал Сергей13Суббота, 09.03.2019, 13:04

 

Ответить

anvg

Дата: Суббота, 09.03.2019, 13:20 |
Сообщение № 2

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

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

Сообщений: 581


Репутация:

271

±

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


2016, 365

Доброе время суток
Как-то так, если предполагать, что вы хотите удалять только строки в таблице (иначе если строки листа, то можно проще)
[vba]

Код

    Dim i As Long
    For i = 1 To Selection.ListObject.ListRows.Count
        Selection.ListObject.ListRows(1).Delete
    Next

[/vba]

 

Ответить

Pelena

Дата: Суббота, 09.03.2019, 13:28 |
Сообщение № 3

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Как вариант
[vba]

Код

Activesheet.ListObjects(«tabl_logbook»).DatabodyRange.Delete

[/vba]


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Сергей13

Дата: Суббота, 09.03.2019, 14:11 |
Сообщение № 4

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

Ранг: Обитатель

Сообщений: 344


Репутация:

0

±

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


Excel 2016

anvg, Pelena, Ребята спасибо!

Pelena, в результате пустой одной строки и случайного выполнения действия по удалению, выходит ошибка, с учетом этого установил обработчик ошибок. Думаю это не критично…
[vba]

[/vba]
Спасибо!

Сообщение отредактировал Сергей13Суббота, 09.03.2019, 14:12

 

Ответить

krosav4ig

Дата: Суббота, 09.03.2019, 14:28 |
Сообщение № 5

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

Ранг: Старожил

Сообщений: 2346


Репутация:

989

±

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


Excel 2007,2010,2013

Сергей13, проверку на пустоту можно так сделать
[vba]

Код

    With [tabl_logbook].ListObject
        If .InsertRowRange Is Nothing Then .DataBodyRange.Delete
    End With

[/vba]


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

 

Ответить

Сергей13

Дата: Суббота, 09.03.2019, 14:56 |
Сообщение № 6

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

Ранг: Обитатель

Сообщений: 344


Репутация:

0

±

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


Excel 2016

krosav4ig, Лаконично, без наворотов. Спасибо!

 

Ответить

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

Как выделить все пустые строки макросом

Есть таблица годового бюджета, разделенная на отдельные группы статей расходов и кварталы. Каждая группа статей расходов разделена между собой пустыми строками:

Таблица бюджета.

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

Откройте редактор Visual Basic (ALT+F11):

редактор Visual Basic.

И воздайте в нем новый модуль для текущей книги «Insert»-«Module», а потом запишите в него следующий VBA-код макроса:

Sub SelectLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.Select
End If
End Sub

VBA-код макроса.

Теперь если нам нужно автоматически выделить все пустые строки в таблице бюджета перед тем как их удалить, выберите инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«SelectLine»-«Выполнить». В результате выделяться все пустые ячейки только для пустых строк внутри исходной таблицы.

Пример работы первого VBA-кода:

Выделить пустые строки.

Пустые строки, которые находиться под последними заполненными ячейками не будут выделены. Теперь для удаления выделенных строк пользователю осталось только выбрать инструмент: «ГЛАВНАЯ»-«Ячейки»-«Удалить»-«Удалить строки с листа». Или нажать комбинацию горячих клавиш CTRL+=. А после в появившемся окне «Удаление ячеек» выбрать опцию «строку» и нажать ОК.

Вначале кода присваиваем для переменной diapaz1 диапазон ячеек в границах между A1 и последней используемой ячейкой на рабочем листе Excel.

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

Далее в цикле проверяются все строки в этом диапазоне, каждая по отдельности, на количество непустых ячеек. В том случаи если метод CountA возвращает значение 0, то адреса этих ячеек дополняют несмежный диапазон в переменной diapaz2 еще на одну пустую строку.

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



Макрос для удаления пустых строк

Как удалить строку макросом? Если нужно сделать так чтобы макрос автоматически не только выделял, но и сам удалял пустые целые и смежные диапазоны ячеек без использования других инструментов, тогда в конце кода для переменной diapaz2.Select следует изменить метод на [Delete]:

diapaz2.[Delete]

Удалить:

Sub DelLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.[Delete]
End If
End Sub

Пример второго VBA-кода:

Пример второго VBA-кода удалить.

Макрос для скрытия пустых строк

Как скрыть пустые строки макросом? Но если вам нужно не удалить, а только скрыть (например, при подготовке документа на печать), тогда эту строку кода следует модифицировать несколько иначе:

diapaz2.EntireRow.Hidden = True

Скрыть:

Sub HidLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.EntireRow.Hidden = True
End If
End Sub

Пример третьего VBA-кода:

Пример третьего VBA-кода скрыть.

Добавление строк макросом

Как вставить строки макросом? Если мы изменим код в этом же месте как показано ниже, то получиться инструмент для добавления и вставки строк после пустых:

diapaz2.[Insert]

Добавить:

Sub AddLine()
  Dim i As Long
  Dim diapaz1 As Range
  Dim diapaz2 As Range
Set diapaz1 = Application.Range(ActiveSheet.Range("A1"), _
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell))
For i = 1 To diapaz1.Rows.Count
If WorksheetFunction.CountA(diapaz1.Rows(i).EntireRow) = 0 Then
If diapaz2 Is Nothing Then
Set diapaz2 = diapaz1.Rows(i).EntireRow
Else
Set diapaz2 = Application.Union(diapaz2, diapaz1.Rows(i).EntireRow)
End If
End If
Next
If diapaz2 Is Nothing Then
MsgBox "Ненайдено ниодной пустой строки!"
Else
diapaz2.[Insert]
End If
End Sub

Пример четвертого VBA-кода:

Пример четвертого VBA-кода добавить.

Если же вы хотите, чтобы макрос работал исключительно только для пустых строк предварительно выделенного определенного диапазона листа перед запуском макроса, то в начале макроса следует изменить строку создания экземпляра объекта для переменной diapaz1, на:

Set diapaz1 = Selection

Читайте также: Как выделить столбцы в Excel макросом.

Внимание! Следует помнить о том, что если таким образом создавать экземпляр объекта для переменной diapaz1, то тогда нельзя перед запуском макроса выделять все ячейки листа или все ячейки любого столбца. Иначе это затормозит программу Excel, так как один лист содержит аж 1 048 576 строк и тогда они все будут обрабатываться макросом, а пользователь будет ждать.

Skip to content

6 способов — как безопасно удалить лишние пустые строки в Excel

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

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

В этой статье вы узнаете несколько простых и надежных методов удаления “белых пятен” на листах Excel.

  • Как НЕ НАДО удалять пустые строки в Excel
  • Как удалить пустые строки при помощи формул
  • Использование Power Query
  • Удаляем строки с определенными пустыми ячейками
  • Как убрать или скрыть лишние строки под данными
  • Как быстро удалить пустые строки при помощи VBA
  • Макрос 1. Удаление в выбранном диапазоне
  • Макрос 2. Удаляем все пустые строки
  • Макрос 3. Критерий удаления — пустая ячейка
  • Самый быстрый способ удалить пустые строки в Excel

Как НЕ НАДО удалять пустые строки в Excel

Есть несколько различных способов удаления пустых строк в Microsoft Excel. Но на удивление многие онлайн-ресурсы придерживаются в своих рекомендациях наиболее опасных из них.

Пожалуй, самый популярный совет – использовать инструмент «Найти и выделить» > «Перейти к специальному» > «Пробелы» .

Что плохого в этой технике? Она выбирает все пустоты в диапазоне данных. Но ведь в строке может быть, к примеру, только одна пустая ячейка, а в остальных будет записаны какие-то данные. И, следовательно, вы в итоге удалите множество строчек, которые содержат хотя бы одну пустую ячейку. Некоторые нужные данные, естественно, будут утеряны.

Специально не буду подробно описывать последовательность действий в этом методе, чтобы вы случайно его не повторили.

И ключевым в данном случае является вопрос: «Вы уверены, что все ячейки в вашей строке пустые? У вас точно нет таких, в которых по какой-то причине не заполнены одна или несколько ячеек, а остальные содержат данные?»

Просто запомните: «Не следует использовать метод поиска пустых ячеек, чтобы выделить и удалить пустые строки».

В качестве иллюстрации на изображении ниже слева показана исходная таблица, а справа — итоговая таблица. И в результирующей таблице все неполные строки пропали, даже 4,6 и 10, которые были частично заполнены:

Встречаются также предложения удалять незаполненные строки при помощи сортировки таблицы или установления фильтра.

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

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

С фильтрацией примерно та же история. Вы можете установить фильтр по пустым ячейкам в каком-то конкретном столбце. Далее все может произойти так же, как в истории с сортировкой. Какие-то из ячеек могут оказаться заполнены нужной информацией. Чтобы обезопасить себя от случайной её потери, такой фильтр по пустым ячейкам нужно установить в каждом столбце. Хорошо, если их в вашей таблице штук 5. А если 20? А 30? Вряд ли у вас есть желание устанавливать, а затем снимать даже 10 фильтров.

Поэтому эти методы – это также не наш выбор.

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

Формула для удаления пустых строк в Excel

Формулу мы будем использовать в дополнительном столбце, который лучше всего расположить справа от вашей таблицы. Поясним на примере.

У нас имеется таблица с заказами от различных покупателей. В ней имеются пропуски. Часть ячеек не заполнена. Давайте избавимся от пустых строк, но при этом сохраним все прочие данные.

Если вы хотите точно знать, что удаляете, то используйте следующую формулу:

=ЕСЛИ(СЧЁТЗ(A2:E2)=0;»Пусто»;»»)

Где A2 — первая, а E2 — последняя использованная ячейка первой строки данных.

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

В результате у вас будет записано «Пусто» в незаполненных строках и ничего, если есть хотя бы одна ячейка с данными:

Логика формулы очевидна: вы подсчитываете заполненные ячейки с помощью функции СЧЁТЗ и используете оператор ЕСЛИ для возврата «Пусто» для нулевого результата. Если же найдена хоть какая-то информация в нужном диапазоне, то не возвращаем ничего.

Фактически, вы можете обойтись без ЕСЛИ:

=СЧЁТЗ(A2:Е2)=0

В этом случае формула вернет ИСТИНА для пустых и ЛОЖЬ для заполненных строк.

Встречаются также аналогичные решения с использованием функции СЧИТАТЬПУСТОТЫ. В ней указываем диапазон ячеек и затем сравниваем с количеством столбцов.

=ЕСЛИ(СЧИТАТЬПУСТОТЫ(A2:E2)=ЧИСЛСТОЛБ(A2:E2);»Пусто»;»»)

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

Как мы это удаление сделаем?

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

  1. Выберите любую ячейку в заголовке и нажмите «Фильтр» на вкладке «Данные». Это добавит стрелки раскрывающегося списка фильтрации ко всем ячейкам заголовка.
  2. Щелкните стрелку в заголовке столбца формулы, снимите флажок (Выбрать все), выберите «Пусто» и нажмите ОК:

  1. Выделите всё отфильтрованное. Для этого щелкните самую верхнюю ячейку и нажмите Ctrl + Shift + End, чтобы расширить выделение до последней ячейки отфильтрованной области.

Или же щелкните по номеру первой незаполненной строки на вертикальной шкале координат. При этом вся она должна подсветиться. Затем наберите на клавиатуре комбинацию Ctrl + Shift +  

(стрелка вниз). При этом будет выделена вся область до конца таблицы. Поле этого кликните по выделению правой кнопкой мыши и выберите из контекстного меню пункт «Удалить». Все выделенные строки будут удалены.

Можно не вызывать контекстное меню, а просто набрать на клавиатуре сочетание клавиш Ctrl и - .

  1. Снимите фильтр, нажав Ctrl + Shift + L. Или же поставьте курсор в самую верхнюю позицию и вновь нажмите на иконку фильтра в меню «Данные».
  2. Удалите столбец с формулой проверки, поскольку он вам больше не нужен.

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

Совет. Вместо удаления, вы можете скопировать непустые строки в другое место. Для этого отфильтруйте всё, кроме «Пусто», выделите и нажмите Ctrl + C. Затем переключитесь на другой лист, выберите верхнюю левую ячейку целевого диапазона и нажмите Ctrl + V.

Как удалить пустые строки в Excel с помощью Power Query

В Excel 2016 и Excel 2019 есть еще один способ удалить незаполненные строки — с помощью инструмента Power Query. В Excel 2010 и 2013 его можно загрузить как надстройку.

Важное примечание! Этот метод работает со следующим предостережением: Power Query преобразует ваши данные в таблицу Excel и изменяет форматирование, такое как цвет заливки, границы и некоторые числовые форматы. Если для вас важно форматирование исходных данных, то лучше выбрать другой способ удаления.

Итак, давайте по порядку.

  1. Выберите диапазон, в котором вы хотите заняться удалением.
  2. Перейдите на   вкладку «Данные»  и нажмите Получить данные — Из других источников —  Из таблицы/диапазона . Это загрузит вашу таблицу в редактор Power Query.

  1. На вкладке Главная в редакторе Power Query щелкните  Удалить строки > Удалить пустые …. (как на рисунке).

  1. Нажмите кнопку «Закрыть и загрузить». Полученная таблица загрузится на новый лист и закроется редактор запросов.

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

Как удалить строки, если ячейка в определенном столбце пуста

В начале этого урока мы предостерегали вас от удаления пустых строк путем выбора пробелов. Однако этот метод пригодится, если вы хотите удалить строки на основе пробелов в определенном столбце.

В качестве примера удалим все строки, в которых ячейка в столбце A не содержит никакой информации:

  1. Выберите ключевой столбец, в нашем случае столбец A.
  2. На вкладке «Главная» нажмите Найти и выделить > Перейти… > Выделить. Или просто нажмите F5 и затем — Выделить… .

  1. В диалоговом окне выберите «Пробелы» и затем — «ОК». Это выделит все пустоты в столбце A.
  2. Щелкните правой кнопкой мыши любую выделенную ячейку и выберите «Удалить…» из контекстного меню.
  3. В диалоговом окне «Удалить» кликните «Строку» и нажмите «ОК».

Готово! Строки, которые не имеют данных в столбце A, больше не существуют.

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

Как удалить лишние строки под данными или скрыть их.

Иногда строки, которые выглядят совершенно пустыми, на самом деле могут содержать пробелы, перевод строки или непечатаемые символы. Чтобы проверить, действительно ли последняя ячейка с данными является последней использованной ячейкой на листе, нажмите Ctrl + End. Если это привело вас к визуально свободной от данных строке под вашими данными, то с точки зрения Excel, в ней на самом деле что-то записано. Чтобы удалить эти лишние строки под таблицей, сделайте следующее:

  1. Щелкните заголовок первой свободной строки под данными, чтобы выбрать ее целиком.
  2. Нажмите Ctrl + Shift + End. Это выберет все строчки ниже, которые содержат что-либо, включая пробелы и непечатаемые символы.
  3. Щелкните выделение правой кнопкой мыши, как это мы уже делали ранее, и выберите «Удалить…».

Однако, удаление — это достаточно радикальный шаг. Поэтому, думаю, стоит поискать более «мягкие» варианты. К примеру, нет ничего, что могло бы помешать вам незаполненные строки либо столбцы просто скрыть. Вот простая инструкция:

  1. Выберите строку под последней строкой с данными, щелкнув ее заголовок.
  2. Нажмите Ctrl + Shift + , чтобы расширить выделение до конца вниз.
  3. Нажмите Ctrl + 9 чтобы скрыть выбранные строки. Или щелкните выделение правой кнопкой мыши и выберите «Скрыть».

Чтобы вновь показать ранее скрытое, нажмите Ctrl + A , чтобы выделить весь лист, а затем нажмите Ctrl + Shift + 9, чтобы снова сделать все видимым.

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

Как быстро удалить пустые строки в Excel с помощью VBA

Excel VBA может исправить множество вещей, включая и несколько пустых строк. Лучшее в предлагаемом подходе — то, что он не требует никаких навыков программирования. Просто возьмите один из приведенных ниже кодов и запустите его в своем Excel.

Макрос 1. Удалить пустые строки в выбранном диапазоне.

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

Макрос удаляет строку, только если вся она пуста . Он определяет количество ячеек с данными в каждой строке, а затем удаляет строки с нулевым результатом.

Public Sub DeleteBlankRows()
Dim SourceRange As Range
Dim EntireRow As Range
Set SourceRange = Application.Selection
If Not (SourceRange Is Nothing) Then
Application.ScreenUpdating = False
For I = SourceRange.Rows.Count To 1 Step -1
Set EntireRow = SourceRange.Cells(I, 1).EntireRow
If Application.WorksheetFunction.CountA(EntireRow) = 0 Then
EntireRow.Delete
End If
Next
Application.ScreenUpdating = True
End If
End Sub

Чтобы дать пользователю возможность выбрать целевой диапазон после запуска макроса, используйте этот код:

Public Sub RemoveBlankLines()
Dim SourceRange As Range
Dim EntireRow As Range
On Error Resume Next
Set SourceRange = Application.InputBox( _
"Выберите диапазон:", "Удалить пустые строки", _
Application.Selection.Address, Type:=8)
If Not (SourceRange Is Nothing) Then
Application.ScreenUpdating = False
For I = SourceRange.Rows.Count To 1 Step -1
Set EntireRow = SourceRange.Cells(I, 1).EntireRow
If Application.WorksheetFunction.CountA(EntireRow) = 0 Then
EntireRow.Delete
End If
Next
Application.ScreenUpdating = True
End If
End Sub

После запуска макрос показывает вам поле ввода, вы указываете целевой диапазон и нажимаете OK:

Через мгновение все лишние строки в выбранном диапазоне будут удалены, а оставшиеся сдвинутся вверх.

Макрос 2. Удалить все пустые строки в Excel

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

Sub DeleteAllEmptyRows()
Dim LastRowIndex As Integer
Dim RowIndex As Integer
Dim UsedRng As Range
Set UsedRng = ActiveSheet.UsedRange
LastRowIndex = UsedRng.Row - 1 + UsedRng.Rows.Count
Application.ScreenUpdating = False
For RowIndex = LastRowIndex To 1 Step -1
If Application.CountA(Rows(RowIndex)) = 0 Then
Rows(RowIndex).Delete
End If
Next RowIndex
Application.ScreenUpdating = True
End Sub

Макрос 3. Удалить строку, если ячейка пуста.

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

Этот код проверяет столбец A на наличие пробелов. Чтобы удалить строки на основе другого столбца, замените «A» другой соответствующей буквой.

Sub DeleteRowIfCellBlank()
On Error Resume Next
Columns("A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

Важно! Макрос удаляет неиспользуемые строки со всего листа , поэтому будьте очень осторожны при его использовании. В качестве меры предосторожности может быть целесообразно создать резервную копию рабочего листа перед запуском этого макроса.

Чтобы удалить незаполненные строки в Excel с помощью макроса, вам нужно вставить код VBA в свою книгу.

Как добавить макрос в свою книгу?

Чтобы вставить макрос в книгу, выполните следующие действия:

  1. Откройте лист, на котором вы хотите произвести удаление.
  2. Нажмите Alt + F11 , чтобы открыть редактор Visual Basic.
  3. На левой панели щелкните правой кнопкой мыши и выберите Insert  >  Module. Те же пункты можно выбрать вверху через главное меню.
  4. Вставьте код в появившееся окно кода.
  5. Нажмите F5 для запуска макроса (но вы можете сделать это и позже прямо из вашей книги).
  6. Нажмите кнопку «Сохранить». При этом вам будет предложено изменить формат вашей книги. Впрочем, запустить макрос на выполнение можно и без сохранения. Просто закройте окно Visual Basic и вернитесь к вашей таблице. Переходите сразу к пункту 3 ниже.

Чтобы выполнить макрос в рабочей книге Excel, сделайте следующее:

  1. Откройте свою собственную книгу и включите макросы, если будет предложено.
  2. Перейдите к нужной таблице.
  3. На листе нажмите Alt + F8, выберите макрос и нажмите «Выполнить».

Вы можете запустить один из следующих макросов:

DeleteBlankRows — удаляет строки без данных в текущем выбранном диапазоне.

RemoveBlankLines — удаляет чистые строки и перемещается вверх в диапазоне, выбранном вами после запуска макроса.

DeleteAllEmptyRows — удаляет все незаполненные строки на активном листе.

DeleteRowIfCellBlank — удаляет строку, если ячейка в определенном столбце пуста.

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

Самый быстрый способ удалить пустые строки в Excel

Читая предыдущие примеры, разве не казалось, что мы используем кувалду, чтобы расколоть орех? Существует способ буквально в два клика мышки удалить пустые строки в Excel.

При помощи надстройки Ultimate Suite вы можете  удалить все пустые строки на листе:

  1. На вкладке Ablebits Tools в группе Преобразование (Transform)  нажмите Удалить пробелы (Delete Blanks) > Пустые строки (Empty Rows) :

  1. Надстройка сообщит вам, что все пустые строки будут удалены из активного листа, и попросит подтвердить. Нажмите ОК, и через мгновение все строки без данных будут удалены.

Как показано на скриншоте ниже, мы удалили только абсолютно пустые строки , в которых нет ни одной ячейки с данными:

Сравните это с первым рисунком, и вы без труда заметите те 3 строки, которые были удалены одним нажатием  мышки. Согласитесь: это самый простой и быстрый способ удаления пустых строк среди всех прочих, рассмотренных в этой статье. Подробнее об инструменте удаления пустот в таблице вы можете прочитать здесь.

Чтобы узнать о других полезных функциях, включенных в надстройку Ultimate Suite, вы можете загрузить пробную версию.

Благодарю вас за чтение.

Формат времени в Excel Вы узнаете об особенностях формата времени Excel, как записать его в часах, минутах или секундах, как перевести в число или текст, а также о том, как добавить время с помощью…
Как сделать диаграмму Ганта Думаю, каждый пользователь Excel знает, что такое диаграмма и как ее создать. Однако один вид графиков остается достаточно сложным для многих — это диаграмма Ганта.  В этом кратком руководстве я постараюсь показать…
Как сделать автозаполнение в Excel В этой статье рассматривается функция автозаполнения Excel. Вы узнаете, как заполнять ряды чисел, дат и других данных, создавать и использовать настраиваемые списки в Excel. Эта статья также позволяет вам убедиться, что вы…
Быстрое удаление пустых столбцов в Excel В этом руководстве вы узнаете, как можно легко удалить пустые столбцы в Excel с помощью макроса, формулы и даже простым нажатием кнопки. Как бы банально это ни звучало, удаление пустых…
Как быстро объединить несколько файлов Excel Мы рассмотрим три способа объединения файлов Excel в один: путем копирования листов, запуска макроса VBA и использования инструмента «Копировать рабочие листы» из надстройки Ultimate Suite. Намного проще обрабатывать данные в…

Хитрости »

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


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

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

Способ первый:
Использовать встроенное средство 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
ссылки
статистика

First, let me say categorically that there is nothing wrong with loops — they certainly have their place!

Recently we were presented with the below situation:

400000  |  Smith, John| 2.4   | 5.66|   =C1+D1
400001  |  Q, Suzy    | 4.6   | 5.47|   =C2+D2
400002  |  Schmoe, Joe| 3.8   | 0.14|   =C3+D3
Blank   |             |       |     |   #VALUE
Blank   |             |       |     |   #VALUE

The OP wanted to delete rows where Column A is blank, but there is a value in Column E.

I suggest that this is an example where we could make use of SpecialCells and a temporary Error Column to identify the rows to be deleted.

Consider that you might add a column H to try and identify those rows; in that row you could use a formula like below:

=IF(AND(A:A="",E:E<>""),"DELETE THIS ROW","LEAVE THIS ROW")

now, it is possible get that formula to put an error in the rows where I test returns True. The reason we would do this is a feature of Excel called SpecialCells.

In Excel select any empty cell, and in the formula bar type

=NA()

Next, hit F5 or CTRL+G (Go to… on the Edit menu) then click the Special button to show the SpecialCells dialog.

In that dialog, click the radio next to ‘Formulas’ and underneath, clear the checkboxes so that only Errors is selected. Now click OK

Excel should have selected all the cells in the worksheet with an Error (#N/A) in them.

The code below takes advantage of this trick by creating a formula in column H that will put an #N/A in all the rows you want to delete, then calling SpecialCells to find the rows, and clear (delete) them…

    Sub clearCells()
    '
    Dim sFormula As String
    '
    ' this formula put's an error if the test returns true, 
    ' so we can use SpecialCells function to highlight the
    ' rows to be deleted!

Create a formula that will return #NA when the formula returns TRUE

sFormula = "=IF(AND(A:A="""",E:E<>""""),NA(),"""")"

Put that formula in Column H, to find the rows that are to be deleted…

Range("H5:H" & Range("E65536").End(xlUp).Row).Formula = sFormula

Now use SpecialCells to highlight the rows to be deleted:

Range("H5:H" & Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).entirerow.select

This line of code would highlight just Column A by using OFFSET in case instead of deleting the entire row, you wanted to put some text in, or clear it

Range("H5:H" & Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).Offset(0, -7).select

and the below line of code will delete thhe entire row because we can :)

Range("H5:H" & Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete shift:=xlup

' clean up the formula
Range("H5:H" & Range("E65536").End(xlUp).Row).Clear
'
End Sub

BTW, it’s also possible WITH A LOOP if you really want one :)

One more thing, before Excel 2010 there was a limit of 8192 rows (I think because this feature went all the way back to 8-bit versions of Excel maybe)

The VBA legend Ron de Bruin (on whose website I first picked up this technique, among others) has something to say about this

Philip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Sub DeleteRowsEnhancedSafety()
    Dim i As Long, n As Long, m As Long, k As Long
    Dim rng As Range, arr() As Variant, response As VbMsgBoxResult
    Set rng = Cells(Cells.Rows.Count, 1)
    'Формируем массив, состоящий из значений столбцов "A" и "B"
    'от первой строки до последней заполненной в столбце "A".
    If Not IsEmpty(rng) Then Set rng = Range("A:B") Else Set rng = Range(Range("B1"), rng.End(xlUp))
    arr = rng
    'Формируем из данного массива новый, во втором столбце которого
    'нет значений, эквивалентных константе vbNullString.
    n = UBound(arr)
 
    'Вычислим количество непустых ячеек в диапазоне столбца "B".
    'При этом адрес диапазона передается в том же стиле ссылок,
    'который выставлен в приложении. В противном случае может
    'возникнуть ситуация, когда в приложении используется стиль
    'ссылок R1C1, а мы передаем ей адрес в стиле A1. В этом случае
    'функция не сможет распознать адрес и вернет ошибку (а ошибки
    'со значениями не сравниваются - "Type Mismatch"!)
 
    m = n - Evaluate("COUNTBLANK(" & rng.Columns(2).Address(ReferenceStyle:=Application.ReferenceStyle) & ")")
    'Альтернативная поправка для предыдущей строки.
    'm = n - Application.WorksheetFunction.CountBlank(rng.Columns(2))
 
    'Учтем случай, когда в столбце "B" есть только пустые ячейки и ячейки с vbNullString.
    If m = 0 Then
        response = MsgBox("В столбце ""B"" есть только пустые ячейки и ячейки с vbNullString. Удалить все значения столбцов ""A"" и ""B""?", vbYesNo, "Потверждение операции")
        If response = vbYes Then Range("A:B").Clear Else MsgBox "Операция отменена пользователем.", , "Информация"
        Exit Sub
    End If
    ReDim arr2(1 To m, 1 To 2) As Variant
    For i = 1 To n
        'Учтем случай, когда столбец "B" содержит коды ошибок (которые несравнимы с vbNullString)
        If IsError(arr(i, 2)) Then
            k = k + 1
            arr2(k, 1) = arr(i, 1)
            arr2(k, 2) = arr(i, 2)
        ElseIf arr(i, 2) <> vbNullString Then
            k = k + 1
            arr2(k, 1) = arr(i, 1)
            arr2(k, 2) = arr(i, 2)
        End If
    Next i
 
    'Очищаем столбцы "A:B" от старых данных.
    Range("A:B").Clear
    'Выгружаем на лист сформированный массив.
    Cells(1).Resize(m, 2) = arr2
End Sub

Понравилась статья? Поделить с друзьями:
  • Макроса данные с одной таблицы excel в другую
  • Макросы excel ввод данных в ячейку
  • Макрос удалил все листы в excel
  • Макроса в excel обновление сводных таблиц
  • Макросы excel vba синтаксис