【发布时间】:2019-07-12 01:46:17
【问题描述】:
简单地说,对于这个项目,我想删除重复项,保留重复项的最新条目,并在第一个条目行中替换这些最新条目。请按照下面给出的示例更好地理解:
我希望通过保留从 A 列到 C 列的最新条目来删除基于 ID 号的重复项。此外,我希望保留 D 列和 E 列中的每个单元格从第一个条目中。这最终意味着最新的条目将被替换在第一个条目的 A、B 和 C 列中。
重要提示:D & E 栏将只填写每个 ID 的第一个条目。具有相同 ID 的所有其他行将始终在 D 和 E 列中包含空单元格。
根据上面给出的例子,这意味着:
根据 ID 从 A 到 C 列删除重复项并保留每个 ID 的最新条目(从 A 列到 C 列:删除第 1、2、3、5 和 6 行中的内容 + 保留每个 ID 的最新条目在这种情况下是第 4 行和第 7 行)
保留每个 ID 的第一个条目中的 D 和 E 列(请注意,只有每个 ID 的第一个条目将是非空单元格。在此示例中,有两个 ID,123 和 458,并且只有D & E 列的第 1 行和第 2 行将是非空的)
将之前的条目替换为从 A 列到 C 列的先前条目行中的最新条目(从 A 列到 C 列,分别将第 1 行和第 2 行替换为第 4 行和第 7 行)
换句话说:在不修改 D 列到 E 的情况下更新 A 列到 C 列
我尝试了两种不同的代码,但都没有给出我想要的最终结果。
所以,我的初始代码如下。它只保留以前的条目,并保持 A 到 E 列的初始状态:
Sub Delete_Duplicates()
Sheet5.Range("$A$1:$E$29999").RemoveDuplicates Columns:=Array(1) _
, Header:=xlYes
End Sub
最终结果不准确,因为它保留了 A 到 C 列中的第一个条目:
上面代码中的问题是它没有将名称和日期更改为最新条目(分别是 Bob,第 6 周和 Peter,第 4 周)
我做的下一个代码是保留最新的条目,但不幸的是,这会删除我在 D 到 E 列中的条目:
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:$E$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
上面的代码可以完美地用最新的条目替换我的第一个条目,但它会删除 D 和 E 列(评论和附加 com)中的所有内容。我想知道是否可以通过仅替换特定列中的重复项而不是删除整行来修改我的代码(这显然是此代码中的问题)。
我希望你的解释足够清楚,可以帮助我解决这个问题。请记住,我有数千行,而针对我给出的示例量身定制的解决方案并不是我想要的。我愿意接受任何建议,感谢您的帮助!
【问题讨论】:
-
这需要在VBA中完成吗,使用数组公式很简单?
-
嗨@Nathan_Sav,是的,因为我想在宏上运行它。
标签: excel vba duplicates