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之前,我确实尝试格式化数据列,但它似乎没有做到这一点.
思考?
首先,一些mandetory house keep .....
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
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)