Vba 如何通过在多个列中相互比较值来删除特定行?

Vba 如何通过在多个列中相互比较值来删除特定行?,vba,excel,Vba,Excel,正如您在下面看到的,我想删除重复执行的测试,但必须通过比较测试ID和datedone来保留一个结果。例如,如果您参加测试“AAA”,它已经做了三次,所以我想根据测试id和datedone删除其中两次。它分别使用了1,2,5个测试ID,所以我想保留最新的测试ID,即5,并删除1和2。但在某些情况下,测试ID也是相同的,所以我需要比较datedone。示例“CCC”测试分别测试了2,2,但完成日期分别为2011年10月24日和2015年12月31日。由于我希望始终保留最新版本,因此我需要取消2015

正如您在下面看到的,我想删除重复执行的测试,但必须通过比较测试ID和datedone来保留一个结果。例如,如果您参加测试“AAA”,它已经做了三次,所以我想根据测试id和datedone删除其中两次。它分别使用了1,2,5个测试ID,所以我想保留最新的测试ID,即5,并删除1和2。但在某些情况下,测试ID也是相同的,所以我需要比较datedone。示例“CCC”测试分别测试了2,2,但完成日期分别为2011年10月24日和2015年12月31日。由于我希望始终保留最新版本,因此我需要取消2015年10月24日的版本。我尝试了一个代码(下面的例子),但它不能正常工作。j的值,即使在删除一行之后,我也会不断更新,这使得每次删除某个内容时,sikp都会有两行。请帮帮我,我在这件事上坚持了很长时间-

Tests    Datedone    Test Id      Result

AAA     13.10.2011      1         passed

BBB     13.10.2011      1         passed

CCC     24.10.2011      2         passed

AAA     15.10.2011      2         passed

DDD     31.12.2014      3         passed

CCC     31.12.2015      2         passed

GGG     15.10.2013      5         passed

HHH     25.10.2014      6         passed

AAA     31.12.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
子格式test1consolidate()
“不行
Dim i,j,rangevale,尽可能长
暗电池,rng,As范围
工作表(“”)。激活
rangevale=range(“A”和rows.Count).End(xlUp).Row
设置rng=ActiveSheet.UsedRange
对于范围内的每个单元格(“A2:A”和rangevale)
对于i=1至rangevale
对于j=i+1至量程
如果单元格(i,1)=单元格(j,1)和单元格(i,3)=单元格(j,3)和单元格(i,2)=单元格(j,2),则
“什么也不做
ElseIf Cells(i,1)=Cells(j,1)和Cells(i,3)>Cells(j,3),然后rng.Item(j).EntireRow.Delete
ElseIf Cells(i,1)=Cells(j,1)和Cells(i,3)Cells(j,2),然后rng.Item(j).EntireRow.Delete
ElseIf Cells(i,1)=Cells(j,1)和Cells(i,3)=Cells(j,3)和Cells(i,2)
试试这个

Public Sub DeleteRepeats()
Const FORMULA_REPEATS As String = _
"=IF(COUNTIFS($A$2:$A$<lastrow>,A2,$C$2:$C$<lastrow>,C2)=1," & _
    "MAX(IF($A$2:$A$<lastrow>=A2,$C$2:$C$<lastrow>))=C2," & _
    "MAX(IF(($A$2:$A$<lastrow>=A2)*($C$2:$C$<lastrow>=C2),$B$2:$B$<lastrow>))=B2)"
Dim rng As Range
Dim lastrow As Long


    With ActiveSheet

        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
        .Columns("E").Insert
        .Range("E1").Value = "tmp"
        .Range("E2").FormulaArray = Replace(FORMULA_REPEATS, "<lastrow>", lastrow)
        .Range("E2").AutoFill .Range("E2").Resize(lastrow - 1)
        Set rng = .Range("A2").Resize(lastrow - 1)
        .Range("A1:E1").AutoFilter Field:=5, Criteria1:="FALSE"
        On Error Resume Next
        Set rng = rng.SpecialCells(xlCellTypeVisible)
        On Error GoTo 0
        If Not rng Is Nothing Then rng.EntireRow.Delete

        .Columns("E").Delete
    End With
End Sub
Public Sub DeleteRepeats()
常量公式_重复为字符串=_
“=IF(COUNTIFS($A$2:$A$,A2,$C$2:$C$,C2)=1,”_
“最大值(如果($A$2:$A$=A2,$C$2:$C$)=C2,”_
“最大值(如果($A$2:$A$=A2)*($C$2:$C$=C2),$B$2:$B$)=B2)”
变暗rng As范围
最后一排一样长
使用ActiveSheet
lastrow=.Cells(.Rows.Count,“A”).End(xlUp).Row
.第列(“E”)。插入
.Range(“E1”).Value=“tmp”
.Range(“E2”).FormulaArray=替换(公式重复,”,最后一行)
.Range(“E2”).AutoFill.Range(“E2”).Resize(最后一行-1)
设置rng=.Range(“A2”).Resize(lastrow-1)
.范围(“A1:E1”)。自动筛选字段:=5,标准1:=FALSE
出错时继续下一步
设置rng=rng.SpecialCells(xlCellTypeVisible)
错误转到0
如果Not rng为Nothing,则rng.EntireRow.Delete
.第(E)栏。删除
以
端接头

嘿,鲍勃,非常感谢你的努力。它工作得很好。你能给我推荐一个地方或一本书来学习我可以使用的新技术吗。我对VBA很陌生:)问题是学习VBA非常简单,它是一种简单的语言,需要学习的结构很少。但是语言本身是毫无意义的,它是你需要理解和编程的应用程序对象模型,这只能通过实践和经验来获得。我发现学习所有这些的最佳途径是加入论坛,查看那里的问题和答案,当然还有玩和练习应用程序。