Как программно удалить строки в excel

  • VBA Удалить строку

VBA Удалить строку

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

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

Синтаксис для удаления строки в Excel VBA

Синтаксис для удаления строки в Excel, как показано ниже.

Worksheets.Rows (Row #). Удалить

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

Range ( «Cell»). EntireRow.Delete

То, что будет делать вышеприведенный оператор, — это удаление строки для данной строки. Например, если мы напишем Range («A1»). FullRow.Delete, то первая строка будет удалена, так как ячейка A1 принадлежит первой строке.

Также мы можем использовать Rows (row_num) .delete для удаления строки.

Как удалить строку в Excel, используя VBA?

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

Вы можете скачать этот шаблон VBA Удалить строку Excel здесь — VBA Удалить шаблон Excel строку

VBA Delete Row — Пример № 1

Давайте используем первый простой метод для удаления строк. Для демонстрации я введу случайное значение в ячейки A1 и B1. Посмотрите на это ниже.

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

Примечание. Для использования Excel VBA необходимо включить вкладку разработчика на вкладке «Файлы» в разделе параметров.

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

Шаг 1. Перейдите на вкладку разработчика, щелкните Visual Basic, чтобы открыть редактор VBA.

Шаг 2: В сегменте кода объявите подфункцию, чтобы начать писать код.

Код:

 Sub Sample () End Sub 

Шаг 3: Теперь напишите следующий код, чтобы удалить строку.

Код:

 Диапазон Sub Sample () ("A1"). CompleteRow.Delete End Sub 

Шаг 4: Запустите этот код, нажав F5 или кнопку Run, и посмотрите результат.

Запустив код, мы увидим, что значения из ячеек A1 и B1 удаляются, поскольку вся первая строка была удалена.

VBA Delete Row — Пример № 2

Ранее в первом примере я удалил только одну строку. Но что делать, если нам нужно удалить несколько строк? Для демонстрации, у меня есть следующие данные, как показано ниже,

Я хочу удалить все первые пять строк. Выполните следующие шаги, чтобы удалить строку в Excel с помощью VBA.

Шаг 1. На вкладке разработчика щелкните Visual Basic, чтобы открыть редактор VBA.

Шаг 2: В коде объявите подфункцию, чтобы начать писать код,

Код:

 Sub Sample1 () End Sub 

Шаг 3: Напишите следующий код, показанный ниже, чтобы удалить все пять строк.

Код:

 Диапазон Sub Sample1 () ("A1: B5"). CompleteRow.Delete End Sub 

Шаг 4: Запустите этот код, нажав F5 или кнопку Run, и посмотрите результат.

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

Примечание: я вставлю данные обратно в образец листа Excel для демонстрации.

VBA Delete Row — Пример № 3

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

Посмотрите на данные ниже,

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

Шаг 1. На вкладке разработчика щелкните Visual Basic, чтобы открыть редактор Visual Basic.

Шаг 2: Объявите подфункцию в окне кода, чтобы начать писать код,

Код:

 Sub Sample2 () End Sub 

Шаг 3: Напишите следующий код, чтобы удалить строки с пустыми ячейками.

Код:

 Диапазон Sub Sample2 () ("A1: D5"). SpecialCells (xlCellTypeBlanks) .EntireRow.Delete End Sub 

SpecialCells — это функция в VBA, которая возвращает нам все ячейки, которые соответствуют нашим условиям, и нашим условием были пустые ячейки в этом диапазоне, поэтому мы использовали функцию xlCellTypeBlanks.

Шаг 4: Запустите этот код, нажав F5 или кнопку Run, и посмотрите результат.

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

Примечание: я снова вставлю данные в образец листа Excel для демонстрации.

VBA Delete Row — Пример № 4

Существуют и другие подобные методы удаления строк, например, использование строк и функция удаления. Например, у нас есть данные в строке 4, и я хочу удалить строку 4. Мы можем дать команду Excel для удаления 4- й строки в данных. Посмотрите на скриншот ниже. У меня есть случайные данные в строке 4 в первой ячейке.

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

Шаг 1. Откройте редактор VBA, щелкнув Visual Basic на вкладке разработчика.

Шаг 2: Объявите подфункцию, чтобы начать писать код.

Код:

 Sub Sample3 () End Sub 

Шаг 3: Напишите следующий код для удаления 4-й строки.

Код:

 Sub Sample3 () Строки (4). Удалить End Sub 

Шаг 4: Запустите этот код, нажав F5 или кнопку Run, и посмотрите результат.

Данные были удалены, так как 4- я строка была удалена сама.

VBA Delete Row — Пример № 5

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

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

Шаг 1: Откройте VB Editor, нажав Visual Basic на вкладке разработчика,

Шаг 2: Объявите подфункцию, чтобы начать писать код.

Код:

 Sub Sample4 () End Sub 

Шаг 2: Объявите две переменные как диапазон, A и B.

Код:

 Sub Sample4 () Dim A как диапазон Dim B как конец диапазона Sub 

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

Код:

 Sub Sample4 () Dim A в качестве диапазона Dim B в качестве набора диапазонов A = Application.InputBox («Выбрать данные», «Образец макроса», Тип: = 8) End Sub 

Шаг 4: Установите B = A, чтобы ввод от пользователя можно было сохранить в диапазоне B.

Код:

 Sub Sample4 () Dim A в качестве диапазона Dim B в качестве диапазона Set A = Application.InputBox («Выбор данных», «Sample Macro», Тип: = 8) Set B = A End Sub 

Шаг 5: Теперь мы удалим данные с пустыми ячейками из диапазона, выбранного пользователем.

Код:

 Sub Sample4 () Dim A в качестве диапазона Dim B в качестве диапазона Set A = Application.InputBox («Выбрать данные», «Sample Macro», Type: = 8) Set B = A A.SpecialCells (xlCellTypeBlanks) .EntireRow.Delete End Sub 

Шаг 6: Теперь запустите код с помощью кнопки запуска.

Шаг 6: Появляется поле ввода.

Шаг 7: Выберите диапазон от A1: D8 в этом примере. Нажмите OK, чтобы увидеть результат.

Данные с пустыми ячейками были удалены.

То, что нужно запомнить

Есть несколько вещей, которые мы должны помнить об удалении строки в Excel VBA:

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

Рекомендуемые статьи

Это был путеводитель по VBA Delete Row. Здесь мы обсудили, как удалить строку в Excel VBA вместе с практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи —

  1. Как использовать функцию замены в VBA?
  2. Excel Удалить строку ярлык
  3. VBA Case | Excel Tricks
  4. Ярлык строки вставки Excel
  5. Как суммировать несколько строк в Excel?

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

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

Хитрости »

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


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

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

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

Добрый день.
Подскажите пожалуйста, задача следующая:
Необходимо пройтись по всем рядам таблицы.
Если в колонке А стоит «-» и в колонке В стоит «-«, то данную строку необходимо удалить.
Можно ли реализовать данную задачу через макросы?
Спасибо.

7 ответов

37K

06 марта 2013 года

freets

97 / / 15.10.2010

Конечно можно. Ставишь на запись макрос, выполняешь какие нужно действия(удаление строки), останавливаешь запись. Открываешь Макросы->Изменить и смотришь какой код получился.
Будет примерно так:

Код:

Rows(«1:1»).Select              //выделяем первую строку
Selection.Delete Shift:=xlUp    //удаляем со сдвигом вверх

только добавь нужное условие и всё.

88K

06 марта 2013 года

Vanderlog

4 / / 06.03.2013

А как правильно организовать перебор всех элементов, и, собственно, если не трудно то условие скажите как задать?

37K

06 марта 2013 года

freets

97 / / 15.10.2010

Код:

Sub Macros()
Dim rw As Long
For rw = 1 To 100
    If Cells(rw, «A»).Value = «-« And Cells(rw, «B»).Value = «-« Then
        Rows(rw & «:» & rw).Delete Shift:=xlUp
    End If
Next rw
End Sub

88K

06 марта 2013 года

Vanderlog

4 / / 06.03.2013

Работает, но почему-то за один проход не справляется. Причем строк меньше 100. 10 строк удаляет за 4 прохода. Что может останавливать скрипт?

275

06 марта 2013 года

pashulka

985 / / 19.09.2004

Вообще-то, при удалении строки необходимо уменьшать счётчик, ибо в противном случае могут остаться строки, содержащие «-» (разумеется, если «-» содержатся в смежных ячейках) или начать удаление снизу вверх, т.е.

Код:

Private Sub Test()

   
    Application.ScreenUpdating = False
    Dim rw&
    For rw = 100 To 1 Step -1
        If Cells(rw, 1) = «-» And Cells(rw, 2) = «-» Then Rows(rw).Delete
    Next
    Application.ScreenUpdating = True

   
End Sub

88K

06 марта 2013 года

Vanderlog

4 / / 06.03.2013

Все верно, при переборе снизу вверх работает корректно. Спасибо всем!

275

22 марта 2013 года

pashulka

985 / / 19.09.2004

Чуть не забыл :) если в дальнейшем потребуется проверять наличие «-» в большем количестве столбцов, чем сейчас, то вместо увеличения And или дополнительного цикла по столбцам, можно программно воспользоваться стандартной функцией рабочего листа =СЧЁТЕСЛИ() (см. листинг)

Код:

Private Sub Test2()

   
    Dim rw&, ws As Worksheet
    Set ws = ActiveSheet

   
    With Application
         .ScreenUpdating = False
         For rw = 100 To 1 Step -1
             If .CountIf(ws.Cells(rw, «A»).Resize(, 2), «-«) = 2 Then ws.Rows(rw).Delete
         Next
         .ScreenUpdating = True
    End With

   
End Sub

P.S. Разумеется номер последней заполненной строки мы можем определять программно.

Like this post? Please share to your friends:
  • Как программно сохранить word
  • Как программно создать документ word
  • Как программно прочитать excel
  • Как программно запустить word
  • Как программно записать документы excel в один документ