【问题标题】:Delete an entire row if the term in the first and second column are duplicated below but leave one如果第一列和第二列中的术语在下面重复但保留一个,则删除整行
【发布时间】:2021-02-12 20:04:55
【问题描述】:

我目前遇到了一个我认为我无法解决的问题。 我有一个 Excel 表格,其中包含多个标题,例如“Promoter”、“Account”、“#order”、“Date”和“City”,其中包含数千行。 我只想知道是否有 VBA 代码可以删除具有重复值的特定行,如果这些行出现在 2 列(A 和 B)中 比如如果“Account”和“Promoter”在许多其他行中是相同的,我只是想删除重复的并留下一个用于会计目的。

例子:

数据

0987:Raymond:ORD-27:NY

1256:Hannah :ORD-99:MI

1345:André  :ORD-45:WI

1866:Darryl :ORD-02:WA

6419:John.  :ORD-22:CA

0987:Raymond:ORD-87:MN

0987:Raymond:ORD-24:CO

Result:

1256:Hannah :ORD-99:MI

1345:André  :ORD-45:WI

1866:Darryl :ORD-02:WA

6419:John.  :ORD-22:CA

0987:Raymond:ORD-87:MN

由于“帐户”(09087)和“发起人”(Raymond)在下面的行中重复,即使顺序和状态不同,我只想删除属于该类别的重复项(相同帐户)和促销员)并保留一个,因为订单属于同一帐户。有几个“发起人”需要考虑,这就是为什么我不知道如何进行。

非常感谢您的帮助,我将不胜感激。

【问题讨论】:

  • 你为什么要保留0987:Raymond:ORD-87:MN,它既不是第一个也不是最后一个?它只是随机的还是背后有原因?
  • 计算一个“推广者”向一个特定“账户”出售了多少次任何产品拒绝使用同一账户的其他迭代。假设 Raymond 销售了 87 盒 x 产品,但在这 87 次销售中,有 20 件属于同一个帐户。所以 Raymond 只向 68 个不同的账户下订单(68 个而不是 67 个,因为我只将 20 个销售计为单笔交易,因为它属于同一个账户,因此 67+1)
  • 您可以使用Remove Duplicates 方法,尽管这将保留AccountPromoter 列中任何匹配项的第一个实例。如果您有标准来决定要保留哪些行,请编辑您的问题以显示您如何根据您显示的数据来确定。

标签: excel vba


【解决方案1】:

保持唯一(两列)

  • 调整常量部分中的值。

守则

Option Explicit

Sub keepUniqueTwoColumns()
    
    Const wsName As String = "Sheet1"
    Const First As Long = 2
    Const ColLR As String = "A"
    Const Col1 As String = "A"
    Const Col2 As String = "B"
    Const Delimiter As String = "|"
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    Dim ws As Worksheet: Set ws = wb.Worksheets(wsName)
    
    Dim Last As Long: Last = ws.Cells(ws.Rows.Count, ColLR).End(xlUp).Row
    Dim rg1 As Range: Set rg1 = ws.Cells(First, Col1).Resize(Last - First + 1)
    Dim rg2 As Range: Set rg2 = ws.Cells(First, Col2).Resize(Last - First + 1)
    
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    
    Dim drg As Range
    Dim cel As Range
    Dim Key As Variant
    Dim i As Long
    
    For Each cel In rg1.Cells
        i = i + 1
        Key = rg1.Cells(i) & Delimiter & rg2.Cells(i)
        If dict.Exists(Key) Then
            If drg Is Nothing Then
                Set drg = rg1.Cells(i)
            Else
                Set drg = Union(drg, rg1.Cells(i))
            End If
        Else
            dict.Add Key, Empty
        End If
    Next cel
    Set dict = Nothing
    
    If drg Is Nothing Then
        MsgBox "Nothing deleted.", vbExclamation, "Fail"
    Else
        Dim dCount As Long: dCount = drg.Cells.Count
        drg.EntireRow.Delete
        MsgBox "Deleted rows: " & dCount, vbInformation, "Success"
    End If
    
End Sub

【讨论】:

  • 非常感谢您的回答,它对我帮助很大。你太棒了!
猜你喜欢
  • 2012-04-30
  • 2016-10-28
  • 2020-09-17
  • 1970-01-01
  • 2013-08-09
  • 2016-02-14
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多