2015-01-13 4 views
5

그래서 일부 문자열에 중복이 포함 된 문자열 목록이 있습니다. 예를 들어Excel에서 셀에서 중복 제거

:

13 헥사 산 13 메틸 -4- pentadecenoic 산 14 메틸 -6- pentadecenoic 산; 15 Hexadecanolide 3- 헥사 산 4- 헥사 15- 헥사 데카 놀 리드, 3- 헥사 데칸 산, 4- 헥사 데 센산, 1,6- 헥사 데칸 산, 1,6- 헥사 데칸 산, 1,6- 헥사 데칸 산, 1,6- 헥사 데칸 놀산;

그래서 나는 매크로 온라인을 가로 질러 와서 이렇게되면 내 문제에 대한 작업을 쥐게 :

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- pentadecenoic 산 14 메틸 -6- pentadecenoic 산; 15 Hexadecanolide 3- 헥사 산 4- 헥사 데 센산;

실제로 얻을 수있는 것들 :

13 헥사 산 13 메틸 -4- pentadecenoic 산 14 메틸 -6- pentadecenoic 산; 15 Hexadecanolide 4- 헥사 산 ;

내 코드에 이러한 문제가 발생합니까?

+0

사과를 예를 들어 아마도 눈이 가장 쉽지 않을 것입니다. – user2062207

+5

'InStr'과 관련이있는 것 같아요 -> _ 다른 문자열의 첫 번째 문자열의 시작 위치를 지정하는 정수 ** ._ 그래서 아마 13-Hexadecenoic acid'를'3-Hexadecenoic acid'의 복제물로 취급 할 예정입니다. 따라서 첫 번째'3-Hexadecenoic acid '를 제거한 후에도 여전히'13-Hexadecenoic acid'를 찾아서 두 번째를 제거합니다. – 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