我有一些代码可以删除不包含密钥字符串的每一行(在本例中为" 2550")。问题是,如果我错误地运行了两次脚本,它将删除工作表中的顶行。
请参阅以下代码:
Dim ws As Worksheet
Dim rng As Range
Dim lastRow As Long
Set ws = ActiveWorkbook.Sheets(1)
lastRow = ws.Range("L" & ws.Rows.Count).End(xlUp).Row
Set rng = ws.Range("L1:L" & lastRow)
With rng
.AutoFilter Field:=1, Criteria1:="<>*2550*"
.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
End With
ws.AutoFilterMode = False
我认为如果没有该行的行,AutoFilter将不会显示任何内容,因此不应删除任何内容,但似乎并非如此。任何人都可以解释为什么会这样吗?
答案 0 :(得分:1)
进行测试..
lastRow = ws.Range("L" & ws.Rows.Count).End(xlUp).Row
If lastRow = 1 Then
Set rng = ws.Range("L1:L" & lastRow)
With rng
.AutoFilter Field:=1, Criteria1:="<>*2550*"
.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
End With
ws.AutoFilterMode = False
End If
如果lastRow返回顶行,则不会完成其余的操作。
答案 1 :(得分:1)
另一种解决方案是在上一行声明中使用Max函数。类似的东西:
lastRow = Application.Max(2,ws.Range("L" & ws.Rows.Count).End(xlUp).Row)
允许您跳过一些嵌套和IF语句。