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

时间:2020-07-11 14:51:14

标签: 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

2 个答案:

答案 0 :(得分:0)

我也碰到过这一点,您在其中删除了一行,这使您的工作量减少了,实际上跳过了一行,因为例如第100行现在变成了第99行。

我认为,如果在if参数中删除行,只需在对iRow = iRow-1执行此操作之后写一行,那么它将返回刚刚删除的行并从那里继续。

>

答案 1 :(得分:0)

我建议使用另一种方法,首先映射要删除的行,然后在循环结束后删除行的并集(下面的示例),另一种方法是使用反向循环,因此从底部开始工作如果您找不到要查找的内容,请先删除该行。这样,您就无需考虑由于删除而偏移的行。

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