vba excel에서 여러 구분 기호로 문자열을 분할하는 방법은 무엇입니까?
Excel VBA를 사용하여 여러 구분 기호로 문자열을 분할합니다.문자열 중 하나는 다음과 같습니다.
d1-d2 d3 d4
대시와 공백을 두 개의 구분 기호로 사용합니다.해봤습니다.split
기능은 하나의 구분 기호로만 수행됩니다.
당신은 먼저 할 수 있습니다.Replace
먼저 문자열을 입력한 다음 분할을 수행합니다.
newString = Replace(origString, "-", " ")
newArray = Split(newString, " ")
여러 개의 다른 구분 기호로 분할하려면 배열에 구분 기호를 나열하고 for 루프로 바꾼 다음 분할합니다.
' New delimiter
tDelimNew = "myDelimiter"
' Replace each possible delimiter
For Each tDelimOld In Array(";", " ", ".", "<==", ":", vbCr)
tString = Replace(tString, tDelimOld, tDelimNew)
Next tDelimOld
' Remove duplicate delimiters
tString = Replace(tString, tDelimNew & tDelimNew, tDelimNew)
' Split ;)
tResult = Split(tString , tDelimNew)
앞의 대답은 좋지만 문자열에 "안녕하세요, 선생님!"을 나누는 것과 같은 연속된 문자가 있는 경우 문제가 발생합니다.오늘 어떻게 지내세요?" 모든 구두점과 공백에.이 경우 Hello와 Sir 사이에 빈 문자열이 표시됩니다.
이 시나리오를 처리하기 위해 Chip Pearson은 다음과 같은 훌륭한 VBA 기능을 제공합니다. http://www.cpearson.com/excel/splitondelimiters.aspx
코멘트는 허용되지 않지만(아직) 이중 공간을 제거하기 위해 TRIM을 사용하는 것에 대한 제안은 완전히 명확하지 않습니다.VBA의 TRIM 기능은 선행 및 후행 공간만 삭제합니다.문자열 내부의 이중 공백은 건드리지 않습니다.그러면 워크시트 함수를 사용해야 합니다.
Chip Pearson의 답변을 잠깐 보고 성능 면에서 조금 개선될 수 있다고 생각하여 약 40% 더 빨라진 것으로 보이는 답변을 작성했습니다(스스로 테스트해 보십시오).더 빠릅니다.1.0E-5
대1.7E-5
값을 비교하기 위해 실제 문자가 아닌 바이트 배열을 사용하기 때문에 seconds per cycle).다음은 칩 피어슨과 같은 문자열 배열을 반환하는 함수입니다.
Function SplitMultiDelims2(Text As String, DelimChars As String) As String()
'''
'Function to split a string at multiple charachters
'Use like SplitMultiDelims2("This:is-a,test string", ":-,")
'Returns an array, in that example SplitMultiDelims2("This:is-a,test string", ":-,")(4) would be "test string"
'''
Dim bytes() As Byte
Dim delims() As Byte
Dim i As Long, aub As Long, ub As Long
Dim stack As String
Dim t() As String
Dim tLen As Long
tLen = Len(Text)
If tLen = 0 Then
Exit Function
End If
ReDim t(1 To tLen) 'oversize array to avoid Redim Preserve too often
bytes = StrConv(Text, vbFromUnicode)
delims = StrConv(DelimChars, vbFromUnicode)
ub = UBound(bytes)
For i = 0 To ub
If Contains(delims, bytes(i)) Then
aub = aub + 1
t(aub) = stack
stack = ""
Else
stack = stack & Chr(bytes(i))
End If
Next i
t(aub + 1) = stack
ReDim Preserve t(1 To aub + 1) 'Works marginally faster if you delete this line,
'however it returns an oversized array (which is a problem if you use UBOUND of the result,
'but fine if you are just looking up an indexed value like the 5th string)
SplitMultiDelims2 = t
End Function
'and a 2nd function called by the first one
Function Contains(arr, v As Byte) As Boolean 'checks if Byte v is contained in Byte array arr
Dim rv As Boolean, lb As Long, ub As Long, i As Long
lb = LBound(arr)
ub = UBound(arr)
For i = lb To ub
If arr(i) = v Then
rv = True
Exit For
End If
Next i
Contains = rv
End Function
여기 테스트 로그가 있습니다(그는 스플릿 멀티델림이고, 내 것은 스플릿 멀티델림2).
> SplitMultiDelims: 1.76105267188204E-05s per cycle 'this is the important figure
> i = 568064 iterations in 10.00390625 seconds
>Test completed: 08/06/2017 10:23:22
> SplitMultiDelims2: 1.05756701906142E-05s per cycle
>i = 947044 iterations in 10.015625 seconds
>Test completed: 08/06/2017 10:23:32
> SplitMultiDelims2: 1.04176859354441E-05s per cycle
>i = 960656 iterations in 10.0078125 seconds
>Test completed: 08/06/2017 10:23:54
> SplitMultiDelims: 1.76228941673255E-05s per cycle
>i = 567887 iterations in 10.0078125 seconds
>Test completed: 08/06/2017 10:24:04
메모리 쓰기 핸디캡을 피하기 위해 양방향으로 실행
아래 테스트 코드 사용Timer
그래서 지나치게 정밀하지는 않지만, 차이를 입증할 만큼 충분히 좋습니다.
Sub testSplit()
Dim t As Double, dt As Double
Dim s As String
Dim i As Long
t = Timer: i = 0: dt = 0: s = ""
Do Until dt > 10 'loop for 10 seconds
s = SplitMultiDelims("This:is-a,test string", ":-,")(1)
dt = Timer - t
i = i + 1
Loop
Debug.Print "SplitMultiDelims: " & dt / i & "s per cycle" & vbCrLf & "i = " & i; " iterations in " & dt; " seconds" & vbCrLf & "Test completed: " & Now
t = Timer: i = 0: dt = 0: s = ""
Do Until dt > 10 'loop for 10 seconds
s = SplitMultiDelims2("This:is-a,test string", ":-,")(1)
dt = Timer - t
i = i + 1
Loop
Debug.Print "SplitMultiDelims2: " & dt / i & "s per cycle" & vbCrLf & "i = " & i; " iterations in " & dt; " seconds" & vbCrLf & "Test completed: " & Now
End Sub
그런 경우에 당신은 할 수 있습니다.
newString = Replace(origString, "-", " ")
newString2 = replace(newstring, " " , " ")
newArray = SPlit(newString, " ")
언급URL : https://stackoverflow.com/questions/7680490/how-to-split-a-string-with-multiple-delimiters-in-vba-excel
'programing' 카테고리의 다른 글
'git log'가 특정 경로에 대한 변경 사항을 무시하도록 설정 (0) | 2023.07.03 |
---|---|
numpy에서 배열에 단일 요소 추가 (0) | 2023.07.03 |
전 세계적으로 노출된 타사 모듈 확장 (0) | 2023.07.03 |
문서의 다른 필드 값으로 필드 업데이트 (0) | 2023.07.03 |
mongodb-10gen 설치가 apt-get과 함께 실패했습니다. (0) | 2023.07.03 |