VBA删除带有"喜欢"运算符的行



简单的事情并不简单。我正在尝试根据具有以" 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。 我唯一的线索是我确实尝试格式化列,当格式窗口打开时,它们没有单一类型。在将代码运行为文本之前,我确实尝试格式化数据列,但它似乎没有解决问题。

思潮?

首先,一些曼德托里家政.....

  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

或者使用自动过滤

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

我将在这里借用 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

最新更新