【问题标题】:Excel VBA: Loop to delete rows if cell value is found within another rangeExcel VBA:如果在另一个范围内找到单元格值,则循环删除行
【发布时间】:2020-11-01 03:55:01
【问题描述】:

我对 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

【问题讨论】:

  • 最好使用Union 并在最后删除一次,而不是循环删除。方法见this answer

标签: excel vba


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我推荐一种不同的方法,首先映射要删除的行,然后在循环完成后删除行的联合(下面的示例)另一种方法是使用反向循环,因此从底部开始工作您到达第一个记录的方式,如果您没有找到您要查找的内容,请删除该行。这样您就不需要考虑由于删除而偏移的行。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      相关资源
      最近更新 更多