从Excel单元格中删除重复项

5

我有一个字符串列表,其中一些字符串包含重复的内容。

例如:

13-十六烯酸; 13-甲基-4-十五烯酸; 14-甲基-6-十五烯酸; 15-十六烷羧酸内酯; 3-十六烯酸; 4-十六烯酸; 13-十六烯酸; 13-甲基-4-十五烯酸; 14-甲基-6-十五烯酸; 15-十六烷羧酸内酯; 3-十六烯酸; 4-十六烯酸;

我在网上找到了一个宏,并进行了修改以解决我的问题,代码如下:

Function stringOfUniques(inputString As String) As String
    Dim inArray() As String
    Dim xVal As Variant
    inArray = Split(inputString, ";")
    For Each xVal In inArray
        If InStr(stringOfUniques, Trim(xVal)) = 0 Then _
        stringOfUniques = stringOfUniques & Trim(xVal) & ","
    Next xVal

End Function

对于我的一些字符串,这个方法效果很好。然而对于上面的例子,它会返回已去重的字符串,但奇怪的是会移除“3-十六碳烯酸”这个词的两个副本。所以基本上我应该得到:
13-十六烯酸;13-甲基-4-十五烯酸;14-甲基-6-十五烯酸;15-十六醇内酯;3-十六碳烯酸;4-十六碳烯酸;
实际上我得到了:
13-十六烯酸;13-甲基-4-十五烯酸;14-甲基-6-十五烯酸;15-十六醇内酯;4-十六碳烯酸;
我的代码有什么问题吗?

抱歉,这个例子可能不太容易看懂。 - user2062207
5
我猜测这与 InStr 有关 -> 返回一个整数,指定一个字符串在另一个字符串中第一次出现的起始位置. 所以它可能会将 13-十六烯酸 视为 3-十六烯酸 的重复项。因此,即使删除了第一个 3-十六烯酸,它仍然会找到 13-十六烯酸 并删除第二个。 - chancea
谢谢你的帮助! - user2062207
1个回答

10

可能有多种方法可以实现这一点,但是Dictionary对象非常适合确保唯一性。

Function stringOfUniques(inputString As String, delimiter as String)
Dim xVal As Variant
Dim dict as Object
Set dict = CreateObject("Scripting.Dictionary")

For Each xVal In Split(inputString, delimiter)
    dict(xVal) = xVal
Next xVal

stringOfUniques = Join(dict.Keys(),",")
End Function

这个函数也已经被修改以接受一个可变的分隔符参数,所以你需要将输入字符串和分隔符 ";" 一起传递给函数,它将返回一个用逗号分隔的字符串。

关于字典的注释:

字典存储键值对。 必须是唯一的。

在这个示例中,我使用了对字典对象的简单赋值: dict(key) = key。当引用其键时,字典将自动添加或覆写一项,因此这是强制唯一性的一种非常简单的方法。

在其他情况下(即您想要计算每个键的出现次数),您需要使用 dict.Exists(key) 进行测试以便修改value而不覆盖键/值对,例如:

'Assigns a "count" value to the dictionary for each unique Key
For Each xVal In Split(inputString, delimiter)
    If dict.Exists(xVal) Then
        dict(xVal) = dict(xVal) + 1
    Else
        dict(xVal) = 1
    End If
Next xVal

'Read the "count" from each key:
For Each xVal in dict.Keys()
    MsgBox xVal & " appears " & dict(xVal) & " times"
Next

太棒了!非常感谢你! - user2062207

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接