VBA Удаление строк с помощью оператора Like

Простая вещь не простая. Я пытаюсь удалить строки на основе определенного столбца, в котором данные начинаются с «2L». Вот я и написал этот код (LastRow понимается):

Sub Cleanup()

For i = 1 To LastRow
    If Range("F" & i) Like "2L*" Then Rows(i).delete
Next i
End Sub

Проблема в том, что он удаляет строки. Я понятия не имею, каковы критерии для удаления строк, но я знаю, что он не получает каждую строку с ячейкой, которая начинается с «2L» в этом столбце, как это было написано. Я начинаю с 1100-го ряда, потом идет 677-й.

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

Мысли?

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

Comintern 04.10.2018 03:28

Или вам нужно добавить строки, которые нужно удалить, в объединение. Это позволяет нет возвращаться назад

urdearboy 04.10.2018 03:29
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
2
283
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Во-первых, домашнее хозяйство ...

  1. Добавить Option Explicit
  2. Добавить Option Explicit
  3. Оцените все объекты (Range) с помощью рабочего листа

Вам следует избегать удаления строк во время цикла по нескольким причинам. Основная причина в том, что это может быть очень неэффективно. Скажем, например, что у вас есть 500 клеток с Like "2L*". Это означает, что у вас будет 500 итераций удаляемых строк.

Вместо, добавьте каждый экземпляр Like "2L*" в Union (коллекцию) ячеек и после завершения цикла удалите все Union сразу. Теперь у вас есть только 1 экземпляр удаляемых строк.

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


Option Explicit

Sub Cleanup()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("???")
Dim i As Long, DeleteMe As Range

'Gather up union of CELLS like 2L*
For i = 1 To ws.Range("F" & ws.Rows.Count).End(xlUp).Row
    If ws.Range("F" & i) Like "2L*" Then
        If DeleteMe Is Nothing Then
            Set DeleteMe = ws.Range("F" & i)
        Else
            Set DeleteMe = Union(DeleteMe, ws.Range("F" & i))
        End If
    End If
Next i

'Delete collection of cells here (if any exist)
If Not DeleteMe Is Nothing Then DeleteMe.EntireRow.Delete

End Sub

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

Sub CleanUp2()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("???")
Dim i As Long

For i = ws.Range("F" & ws.Rows.Count).End(xlUp).Row to 1 Step -1 '<===== Backwards!
    If ws.Range("F" & i) Like "2L*" Then ws.Rows(i).Delete
Next i

End Sub

Спасибо за очень обстоятельные ответы. Я смог извлечь из этого урок и применить его. очень признателен!

Don of the Dead 04.10.2018 13:56

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

Sub DeleteBlankRows()

    With Worksheets(1)
        On Error Resume Next
        Intersect(.Range("F:F"), .UsedRange).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        On Error GoTo 0
    End With

End Sub

Или воспользуйтесь автофильтром

Option Explicit
Public Sub CleanUp()
    Dim lastRow As Long, testRange As Range
    With ThisWorkbook.Worksheets("Sheet2")
        lastRow = .Cells(.Rows.Count, "F").End(xlUp).Row
        Set testRange = .Range("F1:F" & lastRow)
        If Application.WorksheetFunction.CountIf(testRange, "2L*") > 0 Then
            With testRange
                .AutoFilter
                .AutoFilter Field:=1, Criteria1: = "2L*", Operator:=xlFilterValues
                .SpecialCells(xlCellTypeVisible).EntireRow.Delete
            End With
        End If
    End With
End Sub

Другие вопросы по теме