본문 바로가기

WeekdayLife

[엑셀VBA] 엑셀VBA에서 정규식 사용하기 연습

입력폼에서 정규식을 사용하면 코드를 간결하게 만들수 있다. 고 하지만, 음 귀찮다. 간단한 것부터 해보자.

먼저 VBE 편집기의 도구 > 참조 > Microsoft VBScript Regular Expressions 를 활성화 시키자.

 

 

 

 

정규식 object를 생성해야한다. 여기서는 re1이라는 이름으로 정규식 object를 생성했다.

 

Set re1 = New RegExp

 

 

생성된 re1 object 안에 pattern과 옵션을 설정한다.

Pattern : 검색할 문자열의 패턴을 정해주는 필수항목

IgnoreCase : 검색할 문자열에서 대/소문자 구분 - true인 경우, 무시

Global : 패턴과 일치하는 전체항목을 찾을지, 첫번째 항목만 찾을지 결정 - true인 경우, 모든 항목 검색

MultiLine : True인 경우, 줄바꿈을 무시하고 전체 서치

 

 

패턴 구문

구분 구문 내용
문자열 .   .이 표시된 만큼의 모든 문자를 일치처리, 줄바꿈 제외
문자열 [characters]   대괄호에 포함된 문자 중 하나라도 포함되어 있으면 일치
문자열 [^characters]   대괄호에 포함되지 않은 문자 중 하나라도 포함되어 있으면 일치
문자열 [start-end]   대괄호 안에 있는 범위에 해당하면 일치
문자열 \w   영문자, 숫자, 밑줄 중 한가지 포함시 일치 / 공백 미일치
문자열 \W   영문자, 숫자, 밑줄이 아닌 모든 문자 일치
문자열 \s   공백(띄어쓰기, 탭) 일치
문자열 \S   공백을 제외한 모든 문자 일치
문자열 \d   숫자(0~10) 일치
문자열 \D   숫자를 제외한 모든 문자 일치
문자열 \   검색 조건으로 특수문자 입력
문자열 \t   탭 공백 일치
문자열 \r   vbCr 일치
문자열 \n   vbNewLine 일치
수량 *   0개 이상 항목 일치 (0개를 포함)
수량 +   1개 이상 항목 일치 (0개를 제외)
수량 ?   1개 이하 항목 일치 (0개를 포함)
수량 {n}   해당 패턴이 n번 나오면 일치
수량 {n,}   해당 패턴에 n번 이상 나오면 일치
수량 {n,m}   해당 패턴에 n~m 사이에서 나오면 일치
그룹 (expression)   패턴을 그룹화하여 일부 추출

 

 

아래와 같이 설정한 경우, 공백 전체를 검색하게 된다.

 

With re1
    .Pattern = "\s"
    .Global = True
end with

 

 

test 

아래 코드로 공백 여부를 확인해 본다.

re1을 정규식 Object로 만들면,  아래 메쏘드 중 하나를 실행할 수 있다.

Execute : 패턴을 실행하며 결과값을 객체에 담는다. 하나씩 값을 꺼낼 수 있다.

Replace : 패턴에 일치하는 값을 검색해서 인수로 입력한 값으로 대체한다.

Test : 패턴을 찾아서 일치하는 것이 있는지 결과값을 리턴 한다.

 

이를 대상 텍스트에 적용해보면, 아래와 같이 공백 포함 여부를 확인할 수 있다.

 

Private Sub regTest1()

' 테스트 대상 텍스트
Dim string1 As String
string1 = "my name is Hello World"
   
Set re1 = New RegExp

' re1 : 공백이 있는지 확인
With re1
    .Pattern = "\s"
    .Global = True
end with

're1 - test method 사용 예시
If re1.Test(string1) Then
    Debug.Print string1 & " - 공백확인 : yes"
Else
    Debug.Print string1 & " - 공백확인 : no"
End If

End Sub

' Log>> my name is Hello World - 공백확인 : yes

 

 

replace

replace 메쏘드를 통해 패턴과 일치하는 내용을 일괄 변경할 수 있다.

아래 코드는 특정 텍스트를 replace 하는 예시이다.

 

Private Sub rg2()

Dim originalText As String
Dim replaceText As String

Dim re2 As Object
Set re2 = New RegExp

With re2
    .Pattern = "the number is "
    .Global = False
End With

originalText = "the number is 010-0000-0000"
replaceText = "my phone number is "

Debug.Print re2.Replace(originalText, replaceText)

End Sub

'''''''
' log>> my phone number is 010-0000-0000
'''''''

 

 

execute

execute를 통해 새로운 객체에 결과값을 받아서 호출할 수 있다.

아래 코드는 숫자를 골라낸 예시이며, String 타입으로 받아오게된다.

 

Private Sub rg3()

Dim originalText As String
originalText = "the number is 010-1234-4567"

Dim re3 As Object
Set re3 = New RegExp

With re3
    .Pattern = "[^\D]+"
    .Global = True
End With

Set re3Result = re3.Execute(originalText)

For i = 0 To re3Result.Count - 1
    Debug.Print re3Result(i)
Next i
   
End Sub

'''''''
' log>> 010
' log>> 1234
' log>> 5678
'''''''

 

 

 

이하 작성 중...

 

아씨... 귀찮아..