从 excel 中的单元格中删除重复项
Removing duplicates from a cell in excel
所以我得到了一个字符串列表,其中一些字符串包含重复项。
例如:
13-Hexadecenoic acid;13-methyl-4-pentadecenoic
acid;14-Methyl-6-pentadecenoic acid;15-Hexadecanolide;3-Hexadecenoic
acid;4-hexadecenoic acid;13-Hexadecenoic
acid;13-methyl-4-pentadecenoic acid;14-Methyl-6-pentadecenoic
acid;15-Hexadecanolide;3-Hexadecenoic acid;4-hexadecenoic acid;
所以我在网上遇到了一个宏并对其进行了调整以解决我的问题,它是这样的:
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
对于我的一些字符串,这非常有效,但是对于上面的示例,它将 return 删除了重复项的字符串,但奇怪的是会删除其中一个单词的两个副本 '3-十六烯酸'。所以基本上
我应该得到什么:
13-Hexadecenoic acid;13-methyl-4-pentadecenoic
acid;14-Methyl-6-pentadecenoic acid;15-Hexadecanolide;3-Hexadecenoic
acid;4-hexadecenoic acid;
我实际得到的是:
13-Hexadecenoic acid;13-methyl-4-pentadecenoic
acid;14-Methyl-6-pentadecenoic acid;15-Hexadecanolide;4-hexadecenoic
acid;
我的代码中是否有什么东西导致了这种情况发生?
可能有几种方法可以做到这一点,但是 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
此函数也已修改为接受可变定界符参数,因此您将输入字符串 和 定界符:";"
传递给函数,它将return 逗号分隔的字符串。
字典注释:
字典存储 key/value 对。 键必须是唯一的。
在示例中,我对字典对象使用了一个简单的赋值:dict(key) = key
。字典会自动 添加或覆盖 一个项目,当它被它的键引用时,所以这是一个非常简单的强制唯一性的方法。
在其他情况下(即,你想计算每个键的出现次数),你会想使用dict.Exists(key)
进行测试,以便修改value
而不覆盖 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
所以我得到了一个字符串列表,其中一些字符串包含重复项。
例如:
13-Hexadecenoic acid;13-methyl-4-pentadecenoic acid;14-Methyl-6-pentadecenoic acid;15-Hexadecanolide;3-Hexadecenoic acid;4-hexadecenoic acid;13-Hexadecenoic acid;13-methyl-4-pentadecenoic acid;14-Methyl-6-pentadecenoic acid;15-Hexadecanolide;3-Hexadecenoic acid;4-hexadecenoic acid;
所以我在网上遇到了一个宏并对其进行了调整以解决我的问题,它是这样的:
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
对于我的一些字符串,这非常有效,但是对于上面的示例,它将 return 删除了重复项的字符串,但奇怪的是会删除其中一个单词的两个副本 '3-十六烯酸'。所以基本上
我应该得到什么:
13-Hexadecenoic acid;13-methyl-4-pentadecenoic acid;14-Methyl-6-pentadecenoic acid;15-Hexadecanolide;3-Hexadecenoic acid;4-hexadecenoic acid;
我实际得到的是:
13-Hexadecenoic acid;13-methyl-4-pentadecenoic acid;14-Methyl-6-pentadecenoic acid;15-Hexadecanolide;4-hexadecenoic acid;
我的代码中是否有什么东西导致了这种情况发生?
可能有几种方法可以做到这一点,但是 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
此函数也已修改为接受可变定界符参数,因此您将输入字符串 和 定界符:";"
传递给函数,它将return 逗号分隔的字符串。
字典注释:
字典存储 key/value 对。 键必须是唯一的。
在示例中,我对字典对象使用了一个简单的赋值:dict(key) = key
。字典会自动 添加或覆盖 一个项目,当它被它的键引用时,所以这是一个非常简单的强制唯一性的方法。
在其他情况下(即,你想计算每个键的出现次数),你会想使用dict.Exists(key)
进行测试,以便修改value
而不覆盖 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