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

입력폼에서 정규식을 사용하면 코드를 간결하게 만들수 있다. 고 하지만, 음 귀찮다. 간단한 것부터 해보자.
먼저 VBE 편집기의 도구 > 참조 > Microsoft VBScript Regular Expressions 를 활성화 시키자.

myimg



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

Set re1 = New RegExp



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

Pattern : 검색할 문자열의 패턴을 정해주는 필수항목
IgnoreCase : 검색할 문자열에서 대/소문자 구분 - true인 경우, 무시
Global : 패턴과 일치하는 전체항목을 찾을지, 첫번째 항목만 찾을지 결정 - true인 경우, 모든 항목 검색
MultiLine : True인 경우, 줄바꿈을 무시하고 전체 서치



패턴 구문

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

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


아씨… 귀찮아..

여기까지만 하자. 끝.