Excel VBA:如果在另一个范围内找到单元格值,则循环删除行



我是VBA的新手。我有一个大约500个名字的专栏。在另一张表格中,我有一列较短的名字,都在较长的一列中找到。

我试图循环浏览较长的列,并删除在较短的列中找不到单元格值的所有行。我的代码可以工作,但只会以增量删除行,并且需要运行大约10次才能完成任务。

我知道涉及删除的循环可能很棘手。任何帮助都将不胜感激!

Sub FindMatches()
Application.ScreenUpdating = False


Dim var As Variant, iSheet As Integer, iRow As Long, iRowL As Long, bln As Boolean


iRowL = Cells(Rows.Count, 1).End(xlUp).Row

For iRow = 1 To iRowL

If Not IsEmpty(Cells(iRow, 1)) Then
For iSheet = ActiveSheet.Index + 1 To Worksheets.Count
bln = False
var = Application.Match(Cells(iRow, 1).Value, Worksheets(iSheet).Columns(1), 0)

If Not IsError(var) Then
bln = True
Exit For
End If
Next iSheet
End If


If bln = False Then

Cells(iRow, 1).EntireRow.Delete
Else
Cells(iRow, 1).Font.Bold = True
End If

Next iRow
Application.ScreenUpdating = True
End Sub

我也遇到过这种情况,你删除了一行,它会抛出你的计数,实际上是跳过了一行。例如,第100行现在变成了第99行。

我认为,如果在你删除一行的if参数中,在你为iRow=iRow-1删除一行之后写一行,那么它会回到你刚刚删除的一行,然后继续。

我推荐一种不同的方法,首先映射要删除的行,在循环完成后删除行的并集(下面的例子(,另一种方法是使用反向循环,从底部开始,一直到第一条记录,如果找不到要删除的内容,就删除行。这样,您就不需要考虑由于删除而偏移的行。

Sub DeleteBlankRows()
Dim delRange As Range
Dim lrow As Long, i As Long
Dim WS As Worksheet
Set WS = ActiveSheet
With WS
lrow = .Range("A" & .Rows.Count).End(xlUp).Row
'--> Delete All rows where Cell A and Cell B are empty
For i = 6 To lrow

If Len(Trim(.Range("A" & i).value)) = 0 Or Len(Trim(.Range("B" & i).value)) = 0 Then
If delRange Is Nothing Then
Set delRange = .Rows(i)
Else
Set delRange = Union(delRange, .Rows(i))
End If
End If
Next i
If Not delRange Is Nothing Then delRange.Delete

Set delRange = Nothing
End With
End Sub

最新更新