【问题标题】:Removing Duplicates while keeping last row between 2 columns删除重复项,同时将最后一行保留在 2 列之间
【发布时间】:2017-10-20 18:34:35
【问题描述】:

我有一个宏,它根据另一个电子表格中的原始数据填充电子表格。

每行的主要排序方法是按车道(起点到终点)。每个泳道的结果按周进一步排序。我需要删除每个车道的重复周数,同时保留最后一个结果。

设置类似这样:(抱歉格式化)

  A         B
LANE A  WEEK 38
LANE A  WEEK 39
LANE A  WEEK 40
LANE A  WEEK 41
LANE A  WEEK 42
LANE A  WEEK 39
LANE A  WEEK 40
LANE A  WEEK 41
LANE A  WEEK 42
LANE A  WEEK 39
LANE B  WEEK 38
LANE B  WEEK 39
LANE B  WEEK 40

我发现以下代码非常适合单车道

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

但由于它仅删除基于周或 B 列的重复项,因此将删除所有车道 B。

编辑:

最终结果应该是这样的

 A         B
LANE A  WEEK 38
LANE A  WEEK 39
LANE A  WEEK 40
LANE A  WEEK 41
LANE A  WEEK 42


LANE B  WEEK 38
LANE B  WEEK 39
LANE B  WEEK 40

这是一组示例数据的屏幕截图

https://imgur.com/a/MU6vB

在第 5 行,有 ATL6 车道的重复数据。随后是CMH1。我需要删除同一车道内的重复周,保留车道的最后更新。就我目前的代码而言,它只关注星期。所以所有的ATL6数据都被删除了,只剩下CMH1了。

对于 ATL6 通道,我需要保留第 6-9 行,并将第 2-5 行作为重复项删除。这需要适用于所有情况,而不仅仅是专门针对这些行。

【问题讨论】:

  • 要清楚。什么是最终结果? (请更新原始问题)。例如,在您的示例日期中,车道 A 将有两行:第 38 周和第 39 周,还是只有第 39 周?
  • 更新,重申更新。电子表格的每次更新(每天更新一次)将为每个车道添加 4 个条目。这些遵循一年中的几周,以 4 周的价差进行。因此,当前表格中的每条车道都有第 39-42 周(大约 15 周左右)。因此,预期的结果是车道 a 为 4 周,车道 b 为 4 周,依此类推。这将无限期地每天更新,因此周数会随着时间的推移而增加
  • 为什么不直接使用“数据”选项卡下的排序功能,然后按 B 列删除重复项?用宏记录这样做
  • 我需要保留最新的数据,所以最后一行重复数据应该是保留的,这就是我发布的代码 sn -p 完成的。但是,我需要考虑 A 列中的内容。我在原始帖子中发布了一个屏幕截图,可以更好地说明我需要什么
  • 然后将以前的数据存储在单独的工作表中并将当前数据保留在主工作表中?不幸的是,除非您将合并的数据(删除重复项后)存储在不同的工作表上,否则您要完成的任务听起来几乎是不可能的编辑:我不应该说不可能,而是一项不必要的任务

标签: excel vba


【解决方案1】:

注意

我刚刚意识到这只有在恰好有两个的情况下才有效 重复集。如果还有更多,请告诉我,我 将删除

我将以下代码用于此示例数据(基于您的示例数据结构)并且它有效。它利用了 Excel 的内置功能,但如果您的数据集巨大,性能可能会受到影响。

之前

Option Explicit

Sub RemoveEarliestDupes()

    Dim ws1 As Worksheet
    Set ws1 = Worksheets("Sheet1")

    With ws1

        Dim LastRow As Long
        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row

        .Range("D" & LastRow).FormulaArray = "=IF(ISNUMBER(MATCH(A" & LastRow & "&B" & LastRow & ",$A$1:A" & LastRow - 1 & "&$B$1:$B$" & LastRow - 1 & ",0)),"""",""Remove"")"
        .Range("D" & LastRow).Copy

        With .Range(.Range("D2"), .Range("D" & LastRow - 1))
            .PasteSpecial xlPasteFormulas
            .Calculate
        End With

        With .Range(.Range("D2"), .Range("D" & LastRow))
            .Copy
            .PasteSpecial xlPasteValues
            .AutoFilter 1, "Remove"
            .SpecialCells(xlCellTypeVisible).EntireRow.Delete
            .ClearContents
        End With

        .AutoFilterMode = False

    End With

End Sub

之后

【讨论】:

  • 感谢 Scott,但是确实存在相对大量重复的可能性,但性能并不是什么大问题。我确实尝试运行该代码,将重复项减少到 2 个,但在 .ClearContents 上出现对象错误,并且工作表的内容被完全删除
  • 您可以删除该行。没必要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 2016-07-26
  • 2017-06-09
  • 2010-11-29
  • 2023-01-30
相关资源
最近更新 更多