删除包含值VBA的所有行

我一直在做这个比我想承认的更长的时间。 我正在比较两个工作表(A和B)。 我循环通过A列(“B”),并在该列中的每个值我检查它对B列(“C”)。 如果有匹配,我想删除整个行。

我已经做了很多不同的方法,但是我却无法实现。 这是原来的:

Option Explicit Sub Purge() Dim wipWS As Worksheet Dim invWS As Worksheet Dim C As Range Dim SourceLastRow As Long Dim DestLastRow As Long Dim LRow As Long Dim D As Range Set wipWS = Worksheets("Work in Process") Set invWS = Worksheets("Inventory Allocation") With wipWS ' find last row in Work in Process Column B SourceLastRow = .Cells(.Rows.count, "E").End(xlUp).Row ' find last row in Inventory Allocation Column C DestLastRow = invWS.Cells(invWS.Rows.count, "B").End(xlUp).Row ' define the searched range in "Inventory Allocation" sheet Set C = invWS.Range("B1:B" & DestLastRow) Set D = wipWS.Range("E1:E" & SourceLastRow) ' allways loop backwards when deleting rows or columns ' choose 1 of the 2 For loops below, according to where you want to delete ' the matching records ' --- according to PO request delete the row in Column B Sheet A ' and the row in Column C in "Inventory Allocation" worksheet ' I am looping until row 3 looking at the PO original code For LRow = SourceLastRow To 1 Step -1 ' found a match between Column B and Column C If Not IsError(Application.Match(.Cells(LRow, "E"), C, 0)) Then .Cells(LRow, 2).EntireRow.Delete Shift:=xlUp invWS.Cells(Application.Match(.Cells(LRow, "E"), C, 0), 2).EntireRow.Delete Shift:=xlUp End If Next LRow End With End Sub 

它的作品,除了留下1行(应该删除)。 我想我知道为什么会这样,除非我不知道如何去做。 我已经尝试了一个For循环,它的工作原理,除了我必须设置一个范围(例如,“A1:A200”),我希望它只能根据行数循环。

任何帮助将不胜感激!

除了运行2个循环之外,您还可以在工作表中运行1 For循环(“在工作中”),扫描B列,然后使用Matchfunction在整个C范围内search该值 – 设置为工作表(“库存分配”)在C列(直到有数据的最后一行)。

注意:删除行时,总是使用反向循环( For循环反向计数)。

 Option Explicit Sub Purge() Dim wipWS As Worksheet Dim invWS As Worksheet Dim C As Range Dim SourceLastRow As Long Dim DestLastRow As Long Dim LRow As Long Set wipWS = Worksheets("Work in Process") Set invWS = Worksheets("Inventory Allocation") With wipWS ' find last row in Sheet A Column B SourceLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row ' find last row in Sheet B Column C DestLastRow = invWS.Cells(invWS.Rows.Count, "C").End(xlUp).Row ' define the searched range in "Inventory Allocation" sheet Set C = invWS.Range("C1:C" & DestLastRow) ' allways loop backwards when deleting rows or columns ' choose 1 of the 2 For loops below, according to where you want to delete ' the matching records ' --- according to PO request delete the row in Column B Sheet A ' and the row in Column C in "Inventory Allocation" worksheet ' I am looping until row 3 looking at the PO original code For LRow = SourceLastRow To 3 Step -1 ' found a match between Column B and Column C If Not IsError(Application.Match(.Cells(LRow, "B"), C, 0)) Then .Cells(LRow, 2).EntireRow.Delete Shift:=xlUp invWS.Cells(Application.Match(.Cells(LRow, "B"), C, 0), 3).EntireRow.Delete Shift:=xlUp End If Next LRow End With End Sub 

您正在比较两个工作表(A和B)。 您要通过A列(“B”)循环,并为该列中的每个值,检查B列(“C”)。 所以你可以有一个计数器(即bRow)来跟踪你在工作表B中查看哪一行

 Dim cell as Range Dim bRow as Integer bRow = 1 With Worksheets("A") For Each cell in Range(.Range("B1"), .Range("B1").End(xlDown)) If (cell.Value = Worksheets("B").Range("C" & bRow).Value0 Then cell.EntireRow.Delete Shift:=xlUp Worksheets("B").Range("C" & bRow).EntireRow.Delete Shift:=xlUp Else bRow = bRow + 1 End If Next cell End WIth 

所以我终于明白了这一点。 这不是很好,我敢肯定有一个更优雅的方式做到这一点,但在这里。

 Option Explicit Public Sub purWIP() Dim wipWS As Worksheet Dim invWS As Worksheet Dim P As Range Dim i As Integer, x As Integer Set wipWS = Worksheets("Work in Process") Set invWS = Worksheets("Inventory Allocation") ' Start by checking conditions of a certain row For x = wipWS.UsedRange.Rows.count To 1 Step -1 With wipWS ' For each cell in wipWS I'm going to check whether a certain condition exists For Each P In wipWS.Range(.Cells(6, 5), .Cells(wipWS.Rows.count, 5).End(xlUp)) 'If it does, then I'm going to check the Inventory Allocation Worksheet to see if there's a match If (IsDate(P.Offset(0, 7))) Then invWS.Activate ' I do a for loop here and add 1 to i (this was the part that fixed it) For i = invWS.UsedRange.Rows.count + 1 To 3 Step -1 If invWS.Cells(i, "B") = P.Offset(0, 0) Then invWS.Rows(i).EntireRow.Delete Shift:=xlUp End If Next P.EntireRow.Delete Shift:=xlUp End If Next End With Next wipWS.Activate 

结束小组