【问题标题】:Excel Remove Duplicates Cells with different Strings OrderExcel删除具有不同字符串顺序的重复单元格
【发布时间】:2022-01-25 12:34:25
【问题描述】:

如何删除具有不同数据顺序的重复单元格

A header
it is amazing day
it is amazing
amazing day
amazing day it is

预期结果

A header
it is amazing day
it is amazing
amazing day

请注意,我的 Cells 字符串最多可达 7 个

【问题讨论】:

  • 1.你试过什么? 2. 您已使用 Excel 公式对此进行了标记,但您删除单元格的目标建议使用 VBA 解决方案。您要删除单元格还是只过滤它们?
  • @bugdrown 1. 无法尝试,因为它需要一个我在 2 中没有经验的 VBA 模块。是的,删除它们 + 我编辑了标签
  • 您是否研究过网络上的任何 VBA 可能性?如果它们不能完全满足您的需求,您可以发布您的努力结果。您能否澄清您是否要删除列为重复的每一行?或者,如果您想保留其中一行并仅删除该行的重复项?
  • 我在 MrExcel 论坛上搜索没有发现任何类似的东西,或者我的英语不好是问题所在,保留第一个并删除其他重复项
  • 另一个标题列是如何填充的?公式是什么?

标签: excel vba


【解决方案1】:

将字符串拆分为单词,对它们进行排序以创建键并使用字典查找重复项。

Option Explicit

Sub RemoveDuplicates()

    Dim ws As Worksheet, ar, s As String
    Dim lastrow As Long, i As Long, n As Long
    
    Dim dict As Object, key As String, rng As Range
    Set dict = CreateObject("Scripting.Dictionary")
   
    Set ws = Sheet1
    With ws
       lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
       For i = 2 To lastrow
            
            ' split and sort words into key
            s = Application.Trim(.Cells(i, "A"))
            ar = bubblesort(Split(s, " "))
            key = Join(ar, " ")
            
            ' check dupicate
            If dict.exists(key) Then
                .Cells(i, "B") = "Duplicated"
                If n = 0 Then
                    Set rng = .Rows(i)
                Else
                    Set rng = Application.Union(rng, .Rows(i))
                End If
                n = n + 1
            Else
                .Cells(i, "B") = "Unique"
                dict.Add key, i
            End If
            
       Next
    End With
       
    ' delete duplicates
    If n > 0 Then
        If MsgBox(n & " duplicates found, do you want to delete them ?", vbYesNo) = vbYes Then
            rng.Delete
        End If
    Else
        MsgBox "No duplicates found", vbInformation
    End If
   
End Sub

Function bubblesort(ar)
    Dim a As Long, b As Long, tmp As String
    For a = 0 To UBound(ar)
         For b = a + 1 To UBound(ar)
             If CStr(ar(a)) > CStr(ar(b)) Then
                 tmp = ar(a)
                 ar(a) = ar(b)
                 ar(b) = tmp
             End If
         Next
     Next
     bubblesort = ar
End Function

【讨论】:

  • 我很抱歉,你认为有一列有重复的值和值,我编辑了帖子,只有一列
  • @shikez 这个答案应该仍然满足您的需求,因为它只假设文本在 A 列中。它用“重复”/“唯一”填充 B 列,但它从不使用该数据,所以你可以轻松删除这些作业。该代码将在运行时构建一个值字典(每个都对其单词进行排序):{"amazing day is it", "amazing is it", "amazing day"}。当它到达最后一个时,它会将单词排序到已经在字典中的"amazing day is it",以便将第 4 个数据行标记为删除。在代码的末尾,所有标记为删除的行都被删除。
  • 是的,它工作了谢谢aloooot,我的坏我虽然它从第二列中获取数据并在Sheet2中尝试了它所以它没有工作谢谢兄弟
猜你喜欢
  • 1970-01-01
  • 2017-12-04
  • 2016-06-25
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 2018-01-27
相关资源
最近更新 更多