【问题标题】:Deleting duplicates and replacing entries in a row – Excel VBA删除重复项并连续替换条目 – Excel VBA
【发布时间】:2019-07-05 06:04:57
【问题描述】:

在这个项目中,我希望通过保留最新条目来根据 ID 号删除重复项。此外,我想保留 D 列中的每个单元格,并从以前的条目开始。这最终意味着最新条目将被替换为先前条目的行。请参阅下表以获得更清晰的信息:

基于上面给出的示例,我正在寻找的结果是:

  • 根据 ID 从 A 到 C 列删除重复项并保留最新条目
  • 保留之前条目中的 D 到 H 列
  • 用之前条目行中的最新条目替换之前的条目。

换句话说:在不修改 D 列到 H 的情况下更新 A 列到 C 列

所以,我的初始代码如下。它只保留以前的条目并保留 D 到 H 列:

Sub Delete_Duplicates()
Sheet5.Range("$A$1:$H$29999").RemoveDuplicates Columns:=Array(1) _
    , Header:=xlYes
End Sub

下表显示了我将获得的结果:

我做的下一个代码是保留最新的条目,但这会删除我在 D 到 H 列中的条目:

Sub Delete_Duplicates_2()
Dim Rng As Range, Dn As Range, n As Long
Dim Lst As Long, nRng As Range
Set Rng = Sheet5.Range("$A$2:$H$29999")
Lst = Range("A" & Rows.Count).End(xlUp).Row
    With CreateObject("scripting.dictionary")
        .CompareMode = vbTextCompare
For n = Lst To 1 Step -1
     If Not .Exists(Range("A" & n).Value) Then
        .Add Range("A" & n).Value, Nothing
    Else
        If nRng Is Nothing Then
            Set nRng = Range("A" & n)
        Else
            Set nRng = Union(nRng, Range("A" & n))
        End If
End If
Next n
If Not nRng Is Nothing Then 
nRng.EntireRow.Delete
End With
End Sub

下表显示了我将获得的结果:

我愿意接受任何建议,感谢您的帮助!

【问题讨论】:

  • 我需要澄清一下 - 您是否希望将 cmets 保留在 D 列中?第一个表格示例是您的预期结果吗?
  • 是否可以在不同的行上有多个与相同 ID 关联的 D 列条目?如果是这样,你想如何处理?
  • @dwirony:是的,我想将 D 列中的所有 cmets 保留到 H 列。是的,第一个表示例结果是预期的结果。
  • @both:需要注意的是,只有每个 ID 的第一个条目才会有 cmets。所有其他人都不会(该示例反映了这一点)。希望这足够清楚

标签: excel vba duplicates


【解决方案1】:

试试这个解决方案 - 因为您实际上是在使用日期列中的字符串,所以我们必须拆分数字并测试它是否大于或小于另一周的数字:

Option Explicit
Sub Delete_Duplicates()

    Dim i As Long, j As Long
    Dim id As String, weeknum As Long

    For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
        id = Cells(i, 1).Value
        weeknum = Split(Cells(i, 3).Value, " ")(1)

        For j = i - 1 To 2 Step -1
            If Cells(j, 1).Value = id Then
                If Split(Cells(j, 3).Value, " ")(1) < weeknum Then
                    Rows(j).Delete
                    i = i - 1
                Else
                    Rows(i).Delete
                    Exit For
                End If
            End If
        Next j
    Next i

End Sub

【讨论】:

  • 嗨 Dwirony,我要查找的不是最新日期,而是最后一个条目(在我给出的示例中,对于 ID 458,它将是第 4 周,这是我的最后一个代码成功给了我)。我也在寻找来自 ID 的第一个条目的 cmets。希望这些澄清对您有所帮助,并感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
相关资源
最近更新 更多