2016-11-24 62 views
0

我一直在努力工作的时间超过了我想承认的范围。我正在比较两个工作表(A & B)。我正在循环访问A列(“B”),并且对于该列中的每个值,我都会根据B列(“C”)进行检查。如果有匹配,我想删除整行。删除所有包含值为VBA的行

我已经做了许多不同的方法,我只是无法让它工作。这是原件:

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”),我希望它只根据行数循环。

任何帮助将不胜感激!

+0

对于初学者来说,你首先对于每一个不通过B列循环看一看由@cullan答案,这似乎是在做列循环,你想要的。 – dev1998

+0

基本上你想要比较表A中的B列和B表中的C列,并且你有一个2个循环。问题:你在Sheet A Column B中独特的价值吗?如果他们是你可以只有1'For'循环并且使用'Match'函数或'VLookup',它会加快你的代码运行速度 –

+0

@Twigs看看我的答案,使用'Match'函数 –

回答

1

,而不是运行2个循环的哪一行,你可以运行在YOUT工作表1个For环路(“工作),扫描B列,然后仅使用Match函数在整个C范围内搜索该值 - 在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 
+0

OP的问题实际上并不是最清晰的问题,但我想说他/她想要删除_destination_表中的“匹配”行(即'invWS' aka“库存分配”) – user3598756

+0

@ user3598756谢谢:)包含两个选项我的回答 –

+0

好的。在后一种情况下,它只会删除_destination_表中的_first_“匹配”行,而不是_all_匹配的行,因为它可能看起来是OP的请求。但我实际上暂停了我的答案,直到小枝给出一些反馈! – user3598756

1

您正在比较两个工作表(A & B)。你想通过A列(“B”)循环,并且对于该列中的每个值,检查B列(“C”)。 所以,你可以有一个计数器(即眉头)来跟踪你在工作表中乙看着

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 
0

所以,我终于想通了这一点。这不是很好,我确信有一个更优雅的方式来做到这一点,但在这里。

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 

末次

相关问题