VBA Удаление строк с помощью оператора Like - PullRequest
0 голосов
/ 04 октября 2018

Простая вещь не простая.Я пытаюсь удалить строки на основе определенного столбца с данными, которые начинаются с "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, в котором я пишу сценарий. Единственное, что у меня есть, это то, что я попытался отформатировать столбец и когда окно форматированияоткрывается, у них нет одного типа.Я попытался отформатировать столбец данных до того, как запустил код для текста, но, похоже, он не сработал.

Мысли?

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

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

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
0 голосов
/ 04 октября 2018

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

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
0 голосов
/ 04 октября 2018

Во-первых, некоторые хозяйственные помещения .....

  1. Добавить Option Explicit
  2. Добавить Option Explicit
  3. Квалифицировать все объекты (Range) с рабочим листом

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

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

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


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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...