이 페이지에서
ExtractLetter
Function셀 또는 문자열에서 숫자를 제외한 문자만 추출하는 VBA 사용자 지정 함수로, 추출 시작·종료 위치와 특수문자 제외 여부를 지정할 수 있습니다.
구문
= ExtractLetter ( 텍스트, [시작지점], [종료지점], [특수문자제외] )
인수구분
설명
텍스트
필수
문자만 추출할 값이 적힌 셀 또는 문자열입니다.
시작지점
선택
문자 추출을 시작할 시작위치입니다. 기본값은 1 입니다.
예를 들어 '5'를 입력할 경우 5번째 글자부터 문자를 추출합니다.
종료지점
선택
문자 추출을 종료할 지점입니다. 기본값은 셀 안의 최대 글자수인 32,767 입니다.
예를 들어 '10'을 입력할 경우 10번째 글자까지만 문자를 추출합니다.
특수문자제외
선택
추출할 문자열에서 특수문자 제외여부를 결정합니다. 기본값은 FALSE 입니다.
'TRUE'를 입력할 경우 특수문자를 제외한 문자열이 추출됩니다.
마스터 코드
복사한 코드는 VBA 편집기(Alt + F11) 새 모듈에 붙여넣어 사용하세요'###############################################################
'오빠두엑셀 VBA 사용자지정함수 ([https://www.oppadu.com](https://www.oppadu.com/))
'■ ExtractLetter 함수
'■ 텍스트에서 문자만 추출합니다. 추출 시작 및 종료위치를 지정할 수 있습니다.
'■ 인수 설명
'_____________Val : 문자를 추출할 텍스트 또는 셀입니다.
'__________iStart : 추출을 시작할 위치입니다. 기본값은 1 입니다.
'___________iEndl : 추출을 종료할 위치입니다. 기본값은 32767 입니다.
'__ExcludeSpecial : 특수문자 포함 여부입니다. TRUE일 경우 특수문자를 포함하여 문자를 추출합니다.
'###############################################################
Function ExtractLetter(Val, Optional iStart, Optional iEnd, Optional ExcludeSpecial) As String
Dim i As Long
Dim Str As String
Dim match As Variant
If IsMissing(iEnd) Then iEnd = 32767
If IsMissing(iStart) Then iStart = 0
If IsMissing(ExcludeSpecial) Then ExcludeSpecial = False
If iEnd <= 0 Or Not IsNumeric(iEnd) Then iEnd = 32767
If iStart <= 0 Or Not IsNumeric(iStart) Then iStart = 1
If Not IsNumeric(ExcludeSpecial) Then ExcludeSpecial = False Else ExcludeSpecial = cBool(xcludeSpecial)
If iStart > iEnd Then ExtractLetter = CVErr(errvalue)
If IsObject(Val) Then Str = Val.Value Else Str = Val
Str = Mid(Str, iStart, iEnd - iStart + 1)
With CreateObject("VBScript.RegExp")
If ExcludeSpecial = False Then
.Pattern = "\D"
Else
.Pattern = "[^\d!@#$%\^&*()-_+=~`';:""?<>,.]"
End If
.Global = True
Set match = .Execute(Str)
If match.Count > 0 Then
ExtractLetter = ""
For i = 0 To match.Count - 1
ExtractLetter = ExtractLetter & match(i)
Next i
End If
End With
End Function
활용 예제
기본 사용 — 숫자를 제외한 문자 추출
= ExtractLetter ( "서초1동-스타2 장인*대회" )
'// '서초동-스타 장인*대회'를 반환합니다.
= ExtractLetter ( "서초1동-스타2 장인*대회" , , , TRUE )
'// '서초동스타 장인대회'를 반환합니다.
추출 시작·종료 지점 지정
= ExtractLetter ( "서초1동-스타2 장인*대회" , 6 )
'// '스타 장인*대회'를 반환합니다.
= ExtractLetter ( "서초1동-스타2 장인*대회" , 6 , 10 )
'// '스타장인'을 반환합니다.
안내사항
시작지점이 종료지점보다 크거나 한 셀에 32,767개를 넘는 문자가 입력되면 #VALUE! 오류를 반환합니다.
시작지점·종료지점 값이 숫자가 아니거나 0보다 작으면 기본값(1·32,767)으로 대체됩니다.
특수문자제외 값이 TRUE·FALSE 가 아니면 기본값인 FALSE 로 대체됩니다.
2.5mL 을 ExtractLetter로 추출 시, ".mL"이 올바르게 반환됩니다. 다시 한번 확인해보시겠어요?
감사합니다.
2.5ml은 ml로 잘 나오는데 대소문자가 섞여 있으면 소문자만 출력이 안되서(2.5ml >> ml // 2.5mL >> m로 나옴)
알려주신 방법에서 아래처럼 조금 수정하니까 mL만 나와서 공유드려요ㅎㅎ 덕분에 해결됐습니다.
감사합니다.
Function ExtractLetter(Val, Optional iStart, Optional iEnd, Optional ExcludeSpecial) As String
Dim i As Long
Dim Str As String
Dim match As Variant
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "[a-zA-Z]"
regex.Global = True
If IsMissing(iEnd) Then iEnd = 32767
If IsMissing(iStart) Then iStart = 0
If IsMissing(ExcludeSpecial) Then ExcludeSpecial = False
If iEnd <= 0 Or Not IsNumeric(iEnd) Then iEnd = 32767
If iStart <= 0 Or Not IsNumeric(iStart) Then iStart = 1
If Not IsNumeric(ExcludeSpecial) Then ExcludeSpecial = False Else ExcludeSpecial = CBool(ExcludeSpecial)
If iStart > iEnd Then ExtractLetter = CVErr(errvalue)
If IsObject(Val) Then Str = Val.Value Else Str = Val
Str = Mid(Str, iStart, iEnd - iStart + 1)
With CreateObject("VBScript.RegExp")
If ExcludeSpecial = False Then
.Pattern = "\d"
Else
.Pattern = "[^\d.!@#$%&*()-_+=~`';:""?<>,]"
End If
.Global = True
Set match = regex.Execute(Str)
If match.Count > 0 Then
ExtractLetter = ""
For i = 0 To match.Count - 1
ExtractLetter = ExtractLetter & match(i)
Next i
End If
End With
End Function
유러피안유세트(S호) 1SET/백설 → 유러피안유세트S호
이렇게 나오게 하고싶은데 S가 없어지고 숫자가 있어도 숫자가 없어집니다...
패턴을 아래와 같이 사용해보세요