Tidbits

VBA 정규식 2탄

VBA 에서 정규식 쓰는 법 알아낸 김에 응용해서 한 건 또 해봤다.

서울 Seoul
인천 Incheon
전남 Jeollanam-do

강남구 Gangnam-gu
강동구 Gangdong-gu

과 같은 주소 정보를 가지고 아래와 같이 한글 주소명을 영문 주소명으로 치환하는 매크로

서울 강남구 도곡동 543 Seoul Gangnam-gu Dogok-dong 543

딴 부분은 짤 때 별 문제 없었는데 단어별 분리하기 위한 패턴 때문에 땀 좀 뺐다.
“\w+” 를 사용할 경우 영문은 잘 되는데 한글 단어는 전혀 먹지 않아서 씨름 좀 하다가 “\W[^ ]+” 로 해결하기는 했는데 그리 깔끔한 해결책은 아닌듯 싶다(java 였다면 그냥 StringTokenizer 사용했을텐데 VB 사용 안해본지 오래 되어 그냥 정규식을 이용해봤다)

그럭 의도한대로 돌긴 하는데 성능은 영 아니다. 좀 더 재미난 해법도 있을듯 한데 나중에 한 번 새로 짜면서 고민해보도록 하자

Sub getEngAddr()
    Dim c As Variant
    Dim d As Variant

    Dim i As Integer
    Dim lc As Variant
    Dim lc1 As Variant

    Dim kor_addr As String
    Dim eng_addr As String

    i = 0
    lc = Range("A1").End(xlDown).Address
    lc1 = Worksheets("Addr").Range("A1").End(xlDown).Address

    Dim re As New RegExp, m As Match

    For Each c In Range("B2:" & lc)
        kor_addr = c.Value

        re.Pattern = "W[^ ]+"
        re.Global = True

        For Each m In re.Execute(kor_addr)
            For Each d In Worksheets("Addr").Range("A1:" & lc1)
                If (Trim(m.Value) = d.Value) Then
                    eng_addr = eng_addr & " " & d.Cells(1, 2)
                    i = i + 1
                Exit For
                End If
            Next d

            If (i = 0) Then
            eng_addr = eng_addr & " " & m.Value
            End If
            i = 0
        Next

        c.Cells(1, 3) = Trim(eng_addr)
        eng_addr = ""
    Next c

End Sub
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s