【问题标题】:Remove ALL duplicates from column A in Excel从 Excel 中的 A 列中删除所有重复项
【发布时间】:2016-05-22 01:50:04
【问题描述】:

我正在寻找一个可以从 A 列中删除所有重复项的宏。

输入:

John
Jimmy
Brenda
Brenda
Tom
Tom
Todd

输出:

John
Jimmy
Todd

我正在处理大量数据,而 Excel 不配合。似乎无法在线找到有效的解决方案。

谢谢!

【问题讨论】:

  • 您是否查看过数据选项卡上的删除重复项功能? Excel 已经有一个函数可以做到这一点。
  • @ScottCraner 我不会为此投票给她。 Excel 2003 及更早版本没有此删除重复项功能。所以这是一个有效的问题。我编辑了帖子以明确这一点。
  • @ib11 首先,我不是投反对票的人,在收到 OP 的消息之前,我不会这样做。其次,您从哪里得知 OP 正在使用 2003,我看到 YOU 在哪里假设了那么多,并且 YOU 把它放在了问题中。我在等待一个问题的答案。编辑将自己的解释放在其他人的问题上是不合适的,除非您有证据证明 OP 确实在使用 2003,否则您假设他们这样做了。这与假设他们只是不知道删除重复项一样糟糕。就个人而言,除非你有证据我会回滚编辑。
  • @ScottCraner 实际上,我突然意识到 OP 的输出不仅是删除重复的(重复的),而且还想删除重复的内容:both。不同的做法。而现在,that 不是 excel 函数,需要 VBA 宏。
  • @ib11 那么excel版本无关紧要。我已经删除了原版中没有的所有版本特定标签和措辞。

标签: vba excel


【解决方案1】:

当您想要去重复您的列表时,即确保每个列表只剩下一项,您可以这样做:

在 Excel 2007 及更高版本中,您可以在“数据”菜单中找到“删除重复项”。

在 Excel 2003 及更早版本中,您可以使用数据/过滤器菜单中的高级过滤器:

然后将结果复制粘贴到新工作表中。

你可以看到完整的过程here.

否则编写一个繁琐的宏(一个递归循环来检查该值是否存在于集合中)。可以,但你真的需要吗?

但如果你想真正删除所有相同的条目,那么使用@Eoins 的宏就可以完成这项工作,但稍作修改如下:

Option Explicit

Sub DeleteDuplicate()
    Dim x, Y As Long
    Dim LastRow As Long
    Dim myCell As String
    LastRow = Range("A1").SpecialCells(xlLastCell).Row
    For x = LastRow To 1 Step -1
        myCell = Range("A" & x).Text
        If Application.WorksheetFunction.CountIf(Range("A1:A" & x), myCell) > 1 Then
            For Y = x To 1 Step -1
                If Range("A" & Y).Text = myCell Then
                    Range("A" & Y).EntireRow.Delete
                End If
            Next Y
        End If
    Next x
End Sub

【讨论】:

  • 您仍然可以使用高级过滤器来消除所有重复项。只需使用公式标准来检查每个条目的 Count 是否恰好是 1
  • 非常感谢!宏工作得很好。我已经尝试了 Excel 上的所有选项,包括您对 Advanced Filter 的建议,但是花费的时间太长,并且 Excel 在我试图运行超过 500,000 行时不断崩溃。你太棒了!
  • @BrendaTonLinkous 非常欢迎您。这是一个聪明的问题。如您所见,它引发了相当多的活动。
  • @BrendaTonLinkous 我又修改了一点,就是它独立检测最后一行你有多少行(之前是任意设置,现在是绝对最后一行)。
【解决方案2】:

由于您的请求是宏,请尝试以下操作:

Excel 2007+

ActiveSheet.Range("A:A").RemoveDuplicates

这是 Excel 2003 的选项

Option Explicit

Sub DeletDuplicate()
    Dim x As Long
    Dim LastRow As Long
    LastRow = Range("A65536").End(xlUp).Row
    For x = LastRow To 1 Step -1
        If Application.WorksheetFunction.CountIf(Range("A1:A" & x), Range("A" & x).Text) > 1 Then
        Range("A" & x).EntireRow.Delete
      End If
  Next x
End Sub

【讨论】:

  • 请注意,这仅适用于 Excel 2007 及更高版本,请参阅问题下方的评论,因此请在您的回答中包含此内容。
  • 顺便说一句,您对向后循环的解决方案是一个聪明的方法,赞成。
  • 感谢您的反馈!
  • 感谢您发送此信息,此解决方案与删除重复项功能相同,这不是我想要的。它保留了我希望删除所有重复项的唯一值。
【解决方案3】:

这是一个递归循环,以防万一:)

实际上是两个过程,第一个对列表进行排序,第二个删除重复项

'----------------------------------------------------------------------
'--SORT A 1D ARRAY NUMERICALLY-ALPHABETICALLY(TAKEN FROM StackOverflow)
'----------------------------------------------------------------------
    Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)

        Dim pivot   As Variant
        Dim tmpSwap As Variant
        Dim tmpLow  As Long
        Dim tmpHi   As Long

        tmpLow = inLow
        tmpHi = inHi

        pivot = vArray((inLow + inHi) \ 2)

        While (tmpLow <= tmpHi)

            While (vArray(tmpLow) < pivot And tmpLow < inHi)
                tmpLow = tmpLow + 1
            Wend

            While (pivot < vArray(tmpHi) And tmpHi > inLow)
                tmpHi = tmpHi - 1
            Wend

            If (tmpLow <= tmpHi) Then
                tmpSwap = vArray(tmpLow)
                vArray(tmpLow) = vArray(tmpHi)
                vArray(tmpHi) = tmpSwap
                tmpLow = tmpLow + 1
                tmpHi = tmpHi - 1
            End If

        Wend

        If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
        If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi

    End Sub


'---------------------------------------
'--REMOVE DUPLICATES AND BLANKS FROM SORTED 1D ARRAY
'---------------------------------------
Public Function RemoveDuplicatesBlanks_1DSorted(Arr As Variant) As Variant

    Dim i As Long, iMin As Long, iMax As Long, Cnt As Long
    Dim TArr As Variant, TArr2() As Variant

    TArr = Arr
    iMin = LBound(TArr)
    iMax = UBound(TArr)

    i = iMin

    Do While i <= iMax
        If TArr(i) = vbNullString Then
            Cnt = Cnt + 1
        ElseIf i < iMax Then
            If TArr(i) = TArr(i + 1) Then
                TArr(i) = Empty
                Cnt = Cnt + 1
            End If
        End If
        i = i + 1
    Loop

    ReDim TArr2(iMin To (iMax - Cnt))

    Cnt = iMin

    For i = iMin To iMax
        If Not TArr(i) = vbNullString Then
            TArr2(Cnt) = TArr(i)
            Cnt = Cnt + 1
        End If
    Next i

    RemoveDuplicatesBlanks_1DSorted = TArr2
End Function

这些设置的方式你会像这样使用它们.....

QuickSort MyArray, LBound(MyArray), UBOUND(MyArray)

MyArray = RemoveDuplicatesBlanks_1DSorted(MyArray)

这些只适用于一维数组,如果你需要的话,我也有它们用于二维数组。

我已经用过很多次了,它们的速度非常快,比大多数方法都快很多,所以如果您的列表很大,那么值得使用这些方法。

----附加信息----

ExtractArrayColumn 函数在这段代码下面....这段代码是你如何使用所有这些过程的方法

Private sub RemoveDuplicate()
    Dim MyRangeArray As Variant, MyArray As Variant
    MyRangeArray = Range("A1:A100").Value

    MyArray = ExtractArrayColumn(MyRAngeArray,1)

    QuickSort MyArray, LBound(MyArray), UBOUND(MyArray)

    MyArray = RemoveDuplicatesBlanks_1DSorted(MyArray)

    Range("A1:A100").Value = MyArray
End Sub







Public Function ExtractArrayColumn(Array_Obj As Variant, Column_Index As Long) As Variant
    Dim TArr() As Variant
    Dim L1 As Long, H1 As Long
    Dim i As Long

    L1 = LBound(Array_Obj, 1)
    H1 = UBound(Array_Obj, 1)

    ReDim TArr(L1 To H1)

    For i = L1 To H1
        TArr(i) = Array_Obj(i, Column_Index)
    Next i

    ExtractArrayColumn = TArr
End Function

【讨论】:

  • 您的代码对数组很有用,但请使其可用于 OP 的问题,即如何从 Excel 工作表中删除重复项,特别是 A 列。另请注意,您不一定要对列进行排序!我的意思是,请更正您的答案,以便它回答问题。
  • 打破列表的顺序意味着顺序并不重要......这种重复删除算法需要排序,如果 OP 在其他方面需要进一步帮助,那么他们只需要要做的就是问..我会更新答案以包含所有必要的代码来完成这项工作.....
  • :),它可能有点矫枉过正,但至少它应该完成这项工作。
  • 很好。但是你知道吗,在第五次阅读她的帖子后,我终于明白了她的意思。请参阅我对 OP 的评论以及我在答案中发布的代码。
  • 哈,我也错过了,如果不是,可能只是一个错误,然后每个人都没有帮助哈哈。
猜你喜欢
  • 2016-10-25
  • 2016-04-24
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多