【发布时间】:2020-01-15 11:55:36
【问题描述】:
我正在尝试查找包含以下值“# Results”的每个单元格,如果右侧的单元格 == 0,则删除整行以及下面的行。
但是,由于我正在删除行,因此 .Range.Find 方法会出现错误,并且在第一次删除后无法找到下一个出现。我怎样才能使这段代码工作?
代码如下:
sub KillEmptyResults()
Dim sRows As Range
Dim X As Range
Set X = Nothing
SearchStr = Chr(35) & " Results"
With ActiveSheet.UsedRange
Set X = .Cells.Find(What:=SearchStr, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlRows, SearchDirection:=xlPrevious, MatchCase:=False)
If Not X Is Nothing Then
sFirstAddress = X.address
Do
'Transform anchor row to entire range to delete
If X.Offset(0, 1).Value = "0" Then
Set sRow = Rows(X.Row).EntireRow
Set sRows = sRow.Resize(sRow.Rows.Count + 1, sRow.Columns.Count)
sRows.Delete
End If
Set X = .FindNext(X)
Loop While Not X Is Nothing And X.address <> sFirstAddress
End If
End With
End Sub
谢谢
【问题讨论】:
-
Union找到单元格,然后在Loop之后立即删除 -
我认为你应该从
Set X = .Cells.Find(What:=SearchStr, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlRows, SearchDirection:=xlPrevious, MatchCase:=False)循环直到X什么都没有,如果它返回到第一个重合,则添加一个断点。 -
顺便说一句,另一种方法是简单地
AutoFilter你的UsedRange。您可能会发现这不那么令人困惑?您似乎对包含您的条件和偏移值的相同列感兴趣 -
@JvdV - 你如何用 AF 删除下面的行?
-
@SJR,我会使用
SpecialCells(12)设置Range对象,然后使用简单的Resize循环通过Areas/Cells。如果它更容易理解,它只是 OP 的一个选项。无论如何,我仍然会选择我的第一条评论 =)