VBA-查找重复项并比较其中哪一项最高

VBA-查找重复项并比较其中哪一项最高,vba,excel,Vba,Excel,嘿,我正在尝试筛选/匹配工作表中的重复项,我有两个标准: 如果在(E列)找到的重复项所在的行中有重复项设置为“适用”,请在(B列)中的任何位置查找重复项 (B列)中重复项中在(C列)(数字介于0-10之间)中具有最高数字的一项在(E列)中仍应具有“适用性”,但最低数字应在(E列)中被“删除”。我想让我看起来像这样: Sub FindDUB() Dim lastRow As Long'声明lastRow变量 Dim MatchReqprodID As Long“存储给定值的匹配索引值 Dim M

嘿,我正在尝试筛选/匹配工作表中的重复项,我有两个标准:

  • 如果在
    (E列)
    找到的重复项所在的行中有重复项设置为“适用”,请在
    (B列)
    中的任何位置查找重复项
  • (B列)
    中重复项中在
    (C列)
    (数字介于0-10之间)中具有最高数字的一项在
    (E列)
    中仍应具有“适用性”,但最低数字应在
    (E列)
    中被“删除”。我想让我看起来像这样:
  • Sub FindDUB()
    Dim lastRow As Long'声明lastRow变量
    Dim MatchReqprodID As Long“存储给定值的匹配索引值
    Dim MatchRevision As Double“存储给定值的匹配索引值
    尺寸修正ColumnCompare作为整型在工作表中的列号
    表中Dim REQPRODIDCLUMNCOMPRESS As Integer列号比较
    Dim CompareReqprodID As Long“Compare将使用For循环遍历列中的所有记录
    Dim CompareVision As Long“Compare”将使用For循环遍历列中的所有记录
    修正柱比较=3'C
    ReqprodIDColumnCompare=2'B
    '查找Reqprod ID中的最后一行
    lastRow=范围(“B”和Rows.Count).End(xlUp).Row
    '循环通过Reqprod ID列
    对于CompareRqProdId=1到lastRow
    如果单元格(CompareReqprodID,ReqProdId ColumnCompare)“”为空,则“跳过”。
    '正在获取单元格值的匹配索引号
    MatchReqprodID=WorksheetFunction.Match(单元格(CompareReqprodID,ReqProdId ColumnComper),范围(“B1:B”和lastRow),0)
    'MatchRevision=Application.WorksheetFunction.Large(RevisionColumnCompare,1)
    '如果匹配索引不等于当前行号,则它是重复值
    如果CompareReqprodID与ReqProdId匹配,则
    '如果比较视觉匹配修订,则
    '单元格(CompareReqprodID,ApplicatableColumn)=“已删除”
    '单元格(MatchReqprodID,ApplicatableColumn)=“适用”
    ”“否则呢
    单元格(CompareReqprodID,ApplicatableColumn)=“适用”
    单元格(MatchReqprodID,ApplicatableColumn)=“已删除”
    "完"
    如果结束
    如果结束
    下一个
    端接头
    
    此代码不稳定,现在不工作,如果
    MatchRevision
    如果CompareVision MatchRevision则删除功能,则以前工作过。然后我可以找到副本,但不能指出哪一个版本的版本最高


    因此,我的问题是,我如何过滤我的工作表,找到副本,并查看其中哪个副本的“修订”值最高,并在“状态”中将最高值设置为“适用”,将最低值设置为“删除”。谢谢

    如果您想使用公式进行此操作,则可以执行以下操作,但请注意,这在本质上是非常手动的

    首先,我创建了一些示例数据,如下所示:

    A    B          C           D
         ReqProdId  Revision    Owner
         12         2           sis
         34         4           sis
         38         1           hbv
         12         3           sis
         12         4           sis
         34         9           sis
         37         4           hbv
    
    所以A列没有任何内容,B列是产品Id,C列是修订号,D列是所有者。实际数据从第2行开始

    然后我为E=Status、F=Max和G=Min添加了列标题

    在单元格F2中键入的F列公式是
    =MAX(如果(B:B=B2,C:C))
    ,但必须按Ctrl-Shift-Enter键才能添加此公式

    在单元格G2中键入的G列公式是
    =MIN(如果(B:B=B2,C:C))
    ,但同样需要使用Ctrl-Shift-Enter键输入该公式,以使其正常工作

    将F列和G列的公式向下拖动到数据的末尾,它们应填充每组的最低/最高修订号

    由此,我们最终可以添加公式来填充Status列,该列进入单元格E2作为
    =IF(F2=G2,”,IF(C2=G2,“已删除”,IF(C2=F2,“适用”,“已删除”)
    。通过简单的输入,可以正常输入此公式。然后,它还需要复制到数据表的末尾

    因此,逻辑(如果还不清楚)如下所示:

    A    B          C           D
         ReqProdId  Revision    Owner
         12         2           sis
         34         4           sis
         38         1           hbv
         12         3           sis
         12         4           sis
         34         9           sis
         37         4           hbv
    
    • 确定每组的最小修订编号
    • 确定每组的最大修订号
    • 如果最小值和最大值相同,则没有重复项,因此将状态设置为空白
    • 如果当前版本号与最小版本号匹配,则这是集合中的最低版本号,因此将状态设置为“已删除”
    • 如果当前版本号与最大版本号匹配,则该版本号为集合中的最高版本号,因此将状态设置为“适用”
    • 在所有其他情况下,该值介于组的最大值和最小值之间,因此将状态设置为空白
    我这样做是为了测试,效果很好,但手动复制公式并不理想


    忘记添加我的结果:

    A    B          C           D        E           F      G
         ReqProdId  Revision    Owner    Status      Max    Min
         12         2           sis      Removed     4      2
         34         4           sis      Removed     9      4
         38         1           hbv                  1      1
         12         3           sis                  4      2
         12         4           sis      Applicable  4      2
         34         9           sis      Applicable  9      4
         37         4           hbv                  4      4
    

    如果你想用一个公式来做这件事,那么你可以做以下的事情,但是请注意,这本质上是非常手工的

    首先,我创建了一些示例数据,如下所示:

    A    B          C           D
         ReqProdId  Revision    Owner
         12         2           sis
         34         4           sis
         38         1           hbv
         12         3           sis
         12         4           sis
         34         9           sis
         37         4           hbv
    
    所以A列没有任何内容,B列是产品Id,C列是修订号,D列是所有者。实际数据从第2行开始

    然后我为E=Status、F=Max和G=Min添加了列标题

    在单元格F2中键入的F列公式是
    =MAX(如果(B:B=B2,C:C))
    ,但必须按Ctrl-Shift-Enter键才能添加此公式

    在单元格G2中键入的G列公式是
    =MIN(如果(B:B=B2,C:C))
    ,但同样需要使用Ctrl-Shift-Enter键输入该公式,以使其正常工作

    将F列和G列的公式向下拖动到数据的末尾,它们应填充每组的最低/最高修订号

    由此,我们最终可以添加
    Sub FindDUB()
    
        Dim lastRow As Long
        Dim currentRow As Long
        Dim innerRow As Long
        Dim frequency As Integer
        Dim currentID As Long
        Dim currentValue As Long
        Dim firstValue As Long
    
        lastRow = ThisWorkbook.Worksheets("Tabelle1").Range("B" & Rows.Count).End(xlUp).Row
    
        For currentRow = 1 To lastRow
            frequency = Application.WorksheetFunction.CountIf(Range("B:B"), Range("B" & currentRow).Value)
            If frequency > 1 Then
                Range("E" & currentRow).Value = "Removed"
            Else
            End If
        Next currentRow
    
        For currentRow = 1 To lastRow
            If Range("E" & currentRow).Value = "Removed" Or Range("E" & currentRow).Value = "Applicable" Then
    
                currentID = CLng(Range("B" & currentRow).Value)
                firstValue = CLng(Range("C" & currentRow).Value)
    
                For innerRow = currentRow To lastRow
                    If CLng(Range("B" & innerRow).Value) = currentID Then
                        If CLng(Range("C" & innerRow).Value) < firstValue Then
                            Range("E" & currentRow).Value = "Applicable"
                            Range("E" & innerRow).Value = "Removed"
                        ElseIf CLng(Range("C" & innerRow).Value) > firstValue Then
                            Range("E" & currentRow).Value = "Removed"
                            Range("E" & innerRow).Value = "Applicable"
                        Else
                        End If
                    Else
                    End If
                Next innerRow
    
            Else
            End If
    
        Next currentRow
    
    
    End Sub
    
    =IF(COUNTIF($B$2:$B$7,B2)>1,IF(C2=MAX(IF($B$2:$B$7=B2,$C$2:$C$7)),"Applicable","Removed"),"")