【问题标题】:Delete rows from one sheet based on values from another sheet根据另一张工作表中的值从一张工作表中删除行
【发布时间】:2014-04-08 15:37:03
【问题描述】:

我在工作表 1 的 COL A 中有总电子邮件 ID,在工作表 2 的 COL A 中有退回的电子邮件 ID。我想根据工作表 2 上的值删除工作表 1 的值或整行。

我尝试了以下代码,但不起作用。

Public Sub delete_selected_rows()

'look at sheet2, A1 through A3 for search values
For Each search_value In Worksheets("Sheet2").Range("A1:A3")
'as long as there is something to delete...
  Do While Not Worksheets("Sheet1").Range("A1:A3"). _
    Find(search_value.Value, lookat:=xlWhole) Is Nothing
    '...delete that row
    Worksheets("Sheet1").Range("A1:A3").Find(search_value.Value, _
    lookat:=xlWhole).EntireRow.Delete
  Loop
Next

End Sub

有什么帮助吗?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    我会用这个:

    Public Sub delete_selected_rows()
        Dim rng1 As Range, rng2 As Range, rngToDel As Range, c As Range
        Dim lastRow as Long
    
        With Worksheets("Sheet1")
            lastRow = .Cells(.Rows.Count,"A").End(xlUp).Row  
            Set rng1 = .Range("A1:A" & lastRow)
        End With
    
        Set rng2 = Worksheets("Sheet2").Range("A:A")
    
        For Each c In rng1
            If Not IsError(Application.Match(c.Value, rng2, 0)) Then
                'if value from rng1 is found in rng2 then remember this cell for deleting
                If rngToDel Is Nothing Then
                    Set rngToDel = c
                Else
                    Set rngToDel = Union(rngToDel, c)
                End If
            End If
        Next c
    
        If Not rngToDel Is Nothing Then rngToDel.EntireRow.Delete
    End Sub
    

    【讨论】:

    • 仍然没有从工作表 1 中删除。
    • 您确定您的值确实相等吗?代码完美地为我工作..检查你的值是否有额外的前导/尾随空格
    • 没有前导或尾随空格。值完全匹配。但它仍然没有在工作表 1 中删除。
    • 啊,Simoco,我觉得rng1和rng2搞混了。它应该在 Sheet1 中搜索 Sheet2 中的值,因此 for each 应该在 rng2 上,而 .Match 在 rng1 上。最好的方法,否则 imo 应该运行得很快。 @Paramasivan imo 如果不提​​供更多信息,例如“它不工作”之类的评论并没有真正的帮助。在调试模式下单步执行代码并描述发生/未发生的事情。
    【解决方案2】:

    试试这个:

    Sub Macro1()
    
    Dim lrow As Long
    Dim ws1 As Worksheet, ws2 As Worksheet
    
    Set ws1 = ThisWorkbook.Sheets("Sheet1")
    Set ws2 = ThisWorkbook.Sheets("Sheet2")
    
    With ws1
        lrow = .Range("A" & .Rows.Count).End(xlUp).Row
        With .Range("B1:B" & lrow)
            .Formula = "=IFERROR(MATCH(A1," & ws2.Name & "!A:A,0),"""")"
            .Value = .Value
            .AutoFilter 1, "<>"
            .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
        End With
        .AutoFilterMode = False
    End With
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-16
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 2019-10-30
      • 2017-03-11
      相关资源
      最近更新 更多