Excel 从水平行或字符串中删除重复值

Excel 从水平行或字符串中删除重复值,excel,vba,duplicates,Excel,Vba,Duplicates,我有一个由大约50000行组成的数据集,每行(或单元格)的值用逗号分隔 item 1, item 2, item 1, item 1, item3, item 2, item 4, item3 目标输出很简单 item 1, item 2, item3, item 4 我可以使用excel、OpenOfficeCalc、notepad++或任何其他免费提供的程序(我找到了一个javascript解决方案,但它只针对一个字符串,尝试运行50000次要么不起作用,要么需要比我更长的时间,我不知道

我有一个由大约50000行组成的数据集,每行(或单元格)的值用逗号分隔

item 1, item 2, item 1, item 1, item3, item 2, item 4, item3
目标输出很简单

item 1, item 2, item3, item 4
我可以使用excel、OpenOfficeCalc、notepad++或任何其他免费提供的程序(我找到了一个javascript解决方案,但它只针对一个字符串,尝试运行50000次要么不起作用,要么需要比我更长的时间,我不知道有足够的JS来调整它)

有什么建议吗


应该让你开始。关闭屏幕更新和计算以获得更好的性能

Sub Tester()

    Dim dict As Object
    Dim arrItems, c As Range, y As Long
    Dim val

    Set dict = CreateObject("scripting.dictionary")

    For Each c In ActiveSheet.Range("A1:A100").Cells

        arrItems = Split(c.Value, ",")
        dict.RemoveAll
        For y = LBound(arrItems) To UBound(arrItems)
            val = Trim(arrItems(y))
            If Not dict.exists(val) Then dict.Add val, 1
        Next y

        c.Offset(0, 1).Value = Join(ArraySort(dict.keys), ",")

    Next c

End Sub
要对键进行排序,请执行以下操作:

Function ArraySort(MyArray As Variant)

    Dim First           As Integer
    Dim Last            As Integer
    Dim i               As Integer
    Dim j               As Integer
    Dim Temp

    First = LBound(MyArray)
    Last = UBound(MyArray)
    For i = First To Last - 1
        For j = i + 1 To Last
            If MyArray(i) > MyArray(j) Then
                Temp = MyArray(j)
                MyArray(j) = MyArray(i)
                MyArray(i) = Temp
            End If
        Next j
    Next i
    ArraySort = MyArray

End Function

但是,这不会发生;我已经编辑了原始语句来调整这个事实(当我添加空格时,我有一次遗漏了item2),脚本完全可以假设它们是独立的值;因为该示例将不存在于数据集中。(关于删除的关于第1项和第1项是否重复的评论)忘记注意;我有一个VBA脚本,但是在我的工作电脑上,我会在17小时内发布它,如果没有其他人能尽快回复的话;非常感谢!我尝试过一些方法,但在处理这么大的数据集时,它们都会锁定,因为许多字符串都有50-100个值,大约有50k行;有没有一个好方法可以让输出也按字母顺序排序?不幸的是,我不知道任何VB(我知道要修改范围,和“,”,但实际上要编写一个新函数;我不知道)运行它会生成错误“用户定义类型未验证”或用户定义类型未定义”-谷歌快速搜索说它是引用,应该引用什么才能使它正常工作(分拣?)我刚刚重新测试了我的答案中的代码,它工作正常,所以我不知道您为什么会看到这个错误。该工作簿中是否有其他代码可能导致此问题?如果您无法修复,我可以向您发送一个带有工作代码的工作簿。让我尝试在完全独立的工作簿中运行它,并将数据快速迁移到该工作簿中?wil我很快编辑此回复以发布结果从另一个子系统调用ArraySort-它不是一个工作表函数。它只是对测试器中消除重复的输出进行排序。