VBA-有条件地通过不同列中的值之间的复杂比较来删除行吗?

时间:2015-11-19 16:31:29

标签: vba excel-vba excel

如下所示,请仔细阅读。

使用测试ID对某个特定对象进行某些测试,并在下表中生成结果,并且必须根据以下说明的任务来考虑结果

1-Task 1

如果使用不同的测试ID进行相同的测试,例如这里“AAA”已完成三次,那么我应该采用具有最高testid的行。在这里1,2,5分别为“AAA”,我应该只有5行,其余两个我应该删除。

2-任务2

如果多次对相同的测试ID进行相同的测试,我应该考虑结果&在一个列中,它有部分请在这里阅读

- 第1部分:如果结果中的任何一个失败则测试失败,例如这里测试“CCC”,'test id'是2,2&结果通过,分别失败。然后作为testid是相同的,我应该考虑结果,并始终我应该考虑失败的结果,我应该删除已经传递的行。

- 第2部分:如果两个测试结果都通过或失败,那么我应该考虑一个过时的列并考虑最新的一个并删除旧的一个。例如,这里“HHH”测试用testid 6进行两次,并且两次都通过。但它已经在不同的日期15.10.2013& 25.10.2014,所以我必须考虑25.10.2014并删除15.10.2013行。

3.Type3 如果每个值从测试到结果是相同的,那么我需要删除它们中的任何一个。例如这里测试“BBB”。

Tests    Datedone    Test Id      Result        
AAA     13.10.2011      1         failed        

BBB     13.10.2011      1         passed         

CCC     24.10.2011      2         passed           

AAA     15.10.2011      2         passed        

BBB     13.10.2011      1         passed         

CCC     31.12.2015      2         failed         

HHH     15.10.2013      6         passed         

HHH     25.10.2014      6         passed       

AAA     31.10.2015      5         passed       

第1,2,3栏是TEST,Datedone& Testid分别代码。这个代码我只在我必须考虑最新结果但不能正常工作时才做了

Sub formattest1consolidate()
 'not working
 Dim i, j, rangevale,  As Long
 Dim cell, rng,  As range
 Sheets("").Activate
 rangevale = range("A" & rows.Count).End(xlUp).Row
 Set rng = ActiveSheet.UsedRange
 For Each cell In range("A2:A" & rangevale)
  For i = 1 To rangevale
   For j = i + 1 To rangevale
      If Cells(i, 1) = Cells(j, 1) And _
         Cells(i, 3) = Cells(j, 3) And _
         Cells(i, 2) = Cells(j, 2) Then

        'do nothing

      ElseIf Cells(i, 1) = Cells(j, 1) And _
             Cells(i, 3) > Cells(j, 3) Then

        rng.Item(j).EntireRow.Delete

      ElseIf Cells(i, 1) = Cells(j, 1) And _
             Cells(i, 3) < Cells(j, 3) Then

         rng.Item(i).EntireRow.Delete

      ElseIf Cells(i, 1) = Cells(j, 1) And _
             Cells(i, 3) = Cells(j, 3) And _
             Cells(i, 2) > Cells(j, 2) Then

         rng.Item(j).EntireRow.Delete

      ElseIf Cells(i, 1) = Cells(j, 1) And _
             Cells(i, 3) = Cells(j, 3) And _
             Cells(i, 2) < Cells(j, 2) Then

         rng.Item(i).EntireRow.Delete

      End If
    Next j
  Next i
Next cell

End Sub

输出看起来像这样

 Tests    Datedone    Test Id      Result        

 BBB     13.10.2011      1         passed         

 CCC     31.12.2015      2         failed         

 HHH     25.10.2014      6         passed

 AAA     31.10.2015      5         passed    

1 个答案:

答案 0 :(得分:1)

您可以在没有VBA的情况下执行此操作。

在表格中设置数据,如下面的屏幕截图所示,然后应用如图所示的排序。排序遵循您的逻辑步骤。

enter image description here

然后排序完成后,删除重复项,如下所示。

enter image description here

您的搜索结果将如下:

enter image description here

如果您希望代码执行此操作,请使用相同的命令,如下所示:

Sub RemoveLines()

Dim wb As Workbook
Set wb = ThisWorkbook

Dim ws As Worksheet
Set ws = wb.Sheets("Sheet1")

With ws

    With .Range("A1:D10")

        With .Sort

            With .SortFields
                .Clear
                .Add Key:=Range("A2:A10"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .Add Key:=Range("C2:C10"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
                .Add Key:=Range("D2:D10"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .Add Key:=Range("B2:B10"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            End With

            .SetRange Range("A1:D10")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply

        End With

        .RemoveDuplicates Columns:=1, Header:=xlYes

    End With

End With

End Sub