当前位置: 首页 > 知识库问答 >
问题:

删除重复的行,但保留某个单元格中具有最高值的整行

林礼骞
2023-03-14

我有一个包含17列(A列到S列)的excel工作表。A列包含ID号,C列是日期列,F列包含时间格式的值(hh: mm)。对于同一个日期/天,一些ID号在F列中包含两个值-通常是一个高数字(多小时和分钟)和一个低数字(几分钟)。如果有这样的重复,我希望从工作表中删除包含F列中低值的整行。

我尝试了Excel的“板载”删除重复项功能,但没有成功。然后我遇到了这段VBA代码,它删除了包含最高值的整个重复行:

Option Explicit

Sub RemoveDuplicatesKeepMin()
    Dim r As Integer, r2 As Integer, i As Integer
    Dim rng As Range
    Dim NextVal As Double

    r = Range("A" & Rows.Count).End(xlUp).Row
    Set rng = Range("A2:C" & r)
    rng.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2") _
        , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
        False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
        :=xlSortNormal

    r2 = 2
    For i = 2 To r
        If Not NextVal = Range("A" & i) Then
            Range(Cells(i, 1), Cells(i, 2)).Copy Destination:=Range("D" & r2)
        r2 = r2 + 1
        NextVal = Range("A" & i + 1)
    End If
Next
rng.Delete Shift:=xlShiftToLeft
Set rng = Nothing
End Sub

我不完全确定我是否理解这背后的逻辑,但我猜这可以作为一个起点(颠倒逻辑并添加新的限制(如果在同一天)。如果我将顺序从升序更改为降序,则需要取最高值。但我不确定如何设置额外的限制(日限制)。

谢谢!

共有1个答案

常波
2023-03-14

这里,我对您的问题的方法:

Public Sub deleteDuplicate()

    Dim row As Integer

    'Set the start row
    row = 2

    With Sheets("sheetname")

        'Loop until ID cell is blank
        Do While .Range("A" & row) <> ""

            innerRow = 1

            'Re-loop until ID cell is blank for checking
            Do While .Range("A" & innerRow) <> ""

                'If ID and date are equal
                If row <> innerRow And .Range("A" & row) = .Range("A" & innerRow) And .Range("C" & row) = .Range("C" & innerRow) Then

                    If .Range("F" & row) < .Range("F" & innerRow) Then

                        .Rows(row).Delete

                        row = row - 1

                        Exit Do

                    Else

                        .Rows(innerRow).Delete

                    End If

                End If

                'Increase inner looping row
                innerRow = innerRow + 1

            Loop

            'Increase row
            row = row + 1

        Loop

    End With

End Sub
 类似资料:
  • 我有一个数据帧,在a列中有重复值。我想删除重复值,保留b列中值最高的行。 所以这个: 应该变成这个: 我猜可能有一种简单的方法可以做到这一点——可能就像在删除重复项之前对数据帧进行排序一样简单——但我对groupby的内部逻辑了解不够,无法搞清楚。有什么建议吗?

  • 我有一个简单的数据库表 我想删除所有按fv和sv分组的重复行。这已经是一个相当流行的问题,有很好的答案。但我需要改变这种情况。当rel\u id为NULL时,我想保留该行。在任何其他情况下,任何事情都会发生。 所以通过使用以下值 任何一个 或 将是有效的结果。其中为 不会。因为第一个条目有作为,它在之上担任主席。 我目前有这个(这是关于基本重复问题的答案)作为删除重复项的查询,但我不确定如何继续修

  • 问题内容: 我必须清理具有重复行的表: 一个可能具有多个值: 我想对整个表执行一个查询,并删除和重复的所有行。在上面的示例中,删除后,我只想剩下1、2、4和5。 问题答案: ;WITH x AS ( SELECT id, gid, url, rn = ROW_NUMBER() OVER (PARTITION BY gid, url ORDER BY id) FROM dbo.table ) SEL

  • 但是它并不像预期的那样工作,因为它将删除所有重复的行。 我想这样做的原因是与另一个数据集联接,而不是在同一个键组有多个名称时从该数据集添加信息

  • 假设我有以下数据帧: 我想删除基于列A、B和C的重复项,保留列E最高的行。如果E列中的值相同,则保留D列最高的行。 所以上面的数据帧会变成: 我在那里看到了答案的开头:python熊猫:按列A删除重复项,保留列B中值最高的行,但不幸的是,我无法找到如何处理如果列E中的值相同,则保留列D中的最高值:/ (我正在一个相当大的数据集上运行此代码) 任何帮助赞赏!

  • 如何删除重复行,但保留所有行的最大值。例如,我有一个包含4行的数据帧: 从这个数据帧中,我想有一个这样的数据帧(3行,按'a'分组,保留所有在'c'中有最大值的行):