VBA使用Like运算符删除行

Don*_*ead 0 excel vba for-loop

简单的事情并不简单.我试图删除基于具有以"2L"开头的数据的特定列的行.所以我写了这段代码(LastRow被理解):

Sub Cleanup()

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

问题是它确实删除了行.我不知道删除行的标准是什么,但我知道它并没有得到每一行都有一个以"2L"开头的单元格.我从1100行开始,它下降到677.

我没有创建我正在编写脚本的excel.唯一的线索是我确实尝试格式化列,当格式窗口打开时,它们没有单一类型.在我将代码运行为Text之前,我确实尝试格式化数据列,但它似乎没有做到这一点.

思考?

urd*_*boy 5

首先,一些mandetory house keep .....

  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
Run Code Online (Sandbox Code Playgroud)

出于学习目的,这就是你向后循环的方式.它比上述方法具有更少的线,但效率较低.如果您决定采用这条路线,请务必关闭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
Run Code Online (Sandbox Code Playgroud)