所以我有一个字符串列表,其中一些字符串包含重复项。
例如:
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-Hexadecenoic acid&#的两个副本39 ;.所以基本上
我应该得到什么:
13-十六碳烯酸; 13-甲基-4-十五碳烯酸 酸; 14-甲基-6-十五碳烯酸; 15-十六内酯; 3-十六碳烯酸 酸; 4-十六碳烯酸;
我真正得到的是:
13-十六碳烯酸; 13-甲基-4-十五碳烯酸 酸; 14-甲基-6-十五碳烯酸; 15-十六内酯; 4-十六碳烯酸 酸;
我的代码中是否存在导致此情况发生的事情?
答案 0 :(得分:9)
可能有几种方法可以做到这一点,但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