Простая вещь не простая. Я пытаюсь удалить строки на основе определенного столбца, в котором данные начинаются с «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, но, похоже, это не помогло.
Мысли?
Или вам нужно добавить строки, которые нужно удалить, в объединение. Это позволяет нет возвращаться назад


Во-первых, домашнее хозяйство ...
Option ExplicitOption ExplicitRange) с помощью рабочего листаВам следует избегать удаления строк во время цикла по нескольким причинам. Основная причина в том, что это может быть очень неэффективно. Скажем, например, что у вас есть 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
Спасибо за очень обстоятельные ответы. Я смог извлечь из этого урок и применить его. очень признателен!
Я здесь одолжить у 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
Вам нужно выполнить цикл назад, если вы удаляете строки.