2015-01-13 17 views
5

だから、いくつかの文字列に重複が含まれている文字列のリストがあります。例えばExcelのセルから重複を削除する

13ヘキサデセン酸; 13-メチル-4-ペンタデセン酸 ; 14-メチル-6-ペンタデセン酸; 15-ヘキサデカノリド; 3-ヘキサデセン 酸; 4-ヘキサデセン15-ヘキサデカノリド; 3-ヘキサデセン酸; 4-ヘキサデセン酸; 4-ヘキサデセン酸; 4-ヘキサデセン酸; 4-ヘキサデセン酸; 4-ヘキサデセン酸; 4-ヘキサデセン酸; 4-ヘキサデセン酸; 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」という単語の両方のコピーを削除します。したがって、基本的

Iを得るべきこと:

13ヘキサデセン酸; 13-メチル-4-ペンタデセン 酸; 14-メチル-6-ペンタデセン酸; 15-ヘキサデカノリド; 3-ヘキサデセン 酸; 4-ヘキサデセン酸; ; 13-メチル-4-ペンタデセン 酸; 14-メチル-6-ペンタデセン酸; 15-ヘキサデカノリド; 4-ヘキサデセン 酸

13ヘキサデセン酸:私は実際に何を得る

;

私のコードにこれが起こる原因はありますか?

+0

謝罪例ではおそらく目で最も簡単ではない – user2062207

+5

私は 'InStr'と何か関係があると推測しています - > _最初の文字列の開始位置を指定する整数を返します**別の文字列内の文字列** ._おそらく13-ヘキサデセン酸を '3-ヘキサデセン酸 'と重複して扱うようになります。したがって、最初の' 3-Hexadecenoic acid'を除去した後でも、13-ヘキサデセン酸を見つけて2番目を除去します。 – chancea

+0

ありがとう助けて! – user2062207

答えて

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。辞書は自動的にに追加されます。はその項目によって参照されるときに項目を追加または上書きします。したがって、これは一意性を実践する本当に簡単な方法です。他の状況(すなわち、、あなたは各キーの出現回数)に、あなたが例えば、キー/値のペアを上書きせずにvalueを変更するためにdict.Exists(key)を使用してテストしたいとしますため

'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 
+0

すばらしい!どうもありがとうございます! – user2062207

関連する問題