【问题标题】:Removing duplicates from a cell in excel从excel中的单元格中删除重复项
【发布时间】:2015-03-11 14:27:09
【问题描述】:

所以我有一个字符串列表,其中一些字符串包含重复项。

例如:

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-十六碳烯酸 酸;

我的代码中是否存在导致这种情况发生的原因?

【问题讨论】:

  • 为这个例子道歉,可能不是最容易看到的
  • 我猜它与InStr有关 -> 返回一个整数,指定一个字符串在另一个字符串中第一次出现的起始位置。 所以它可能会将13-Hexadecenoic acid 视为3-Hexadecenoic acid 的副本因此即使在删除第一个3-Hexadecenoic acid 之后它仍然会找到13-Hexadecenoic acid 并删除第二个
  • 感谢您的帮助!

标签: string vba excel duplicates


【解决方案1】:

可能有几种方法可以做到这一点,但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

【讨论】:

  • 太棒了!非常感谢!
猜你喜欢
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2020-11-07
  • 1970-01-01
  • 2014-03-02
  • 2017-12-04
相关资源
最近更新 更多