Skills/Excel VBA

VBA 주소 정렬 (3-11 > 3-2)

섬그늘 2008. 11. 13. 14:41

http://kin.naver.com/detail/detail.php?d1id=1&dir_id=1050202&eid=FoR8fAi5rWgyt6BTlOqsmQAptbWObuXK

 

 

A

1

중구 필동 1번지

2

중구 필동 1-11

3

중구 필동 1-2

4

중구 필동 1 희망APT 1001-203

5

중구 필동 1 희망APT 101-204

6

중구 충무로2가 3-5

7

중구 충무로2가 31 A빌딩 5층

8

중구 충무로2가 31 A빌딩 502호

9

중구 충무로2가 산30번지

10

중구 충무로2가 산301-2

 

위와 같이 정렬하고자 하는 원본 주소데이타를 A열에 복사, 아무 데이타나 클릭 후 아래 매크로를 실행하면,

 

-------------------------------------

Sub 주소정렬()

 

    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim l As Long
    Dim m As Long
    Dim f(1) As Integer
    Dim a() As Variant
    Dim MyRow As Long                               '시작 행번호
    Dim MyTop As Long
    Dim MyEnd As Long                               '끝 행번호
    Dim MyStr As String                             '주소 문자열
    Dim ExStr As String                             '주소의 문자 1개
   
    ActiveCell.CurrentRegion.Select                 '기초데이타 수집
    MyRow = Selection.Rows(1).Row
    MyEnd = Selection.Rows.Count
        
    Do While MyRow <= MyEnd                         '데이타 나누기 시작
       
        i = 0: j = 1: k = 3: f(0) = 1: f(1) = 1
        MyStr = Cells(MyRow, 1)
        l = Len(MyStr)
문자추출:
        Do While f(0) = f(1) And i < l              '같은 타입이면 계속 카운터 증가
            i = i + 1
            ExStr = Mid(MyStr, i, 1)
            f(1) = (ExStr < "0" Or ExStr > "9") * (0 = 0)
        Loop
       
        If f(0) <> f(1) Then                        '다른 타입이 나오면
            Cells(MyRow, k) = Mid(MyStr, j, i - j)  '그 때 까지 블록을 출력
            If i < l Then
                k = k + 1
                j = i
                f(0) = f(1)
                GoTo 문자추출:
            Else
                Cells(MyRow, k + 1) = ExStr
            End If
        Else
            Cells(MyRow, k) = Mid(MyStr, j, i - j + 1)
        End If
        MyRow = MyRow + 1
    Loop
   
    Cells(MyRow - 1, 3).CurrentRegion.Select        '정렬 준비
    MyRow = Selection.Rows(1).Row
    MyTop = MyRow
    k = Selection.Columns.Count - 1
    ReDim a(k)
   
    Do While MyRow <= MyEnd
        For i = 0 To k: a(i) = Cells(MyRow, i + 3): Next i
        l = 0
        For i = MyTop To MyEnd
            m = 0
            For j = 0 To k                          '해당 행 보다 작은 행 수 계산
                m = m + ((a(j) > Cells(i, j + 3)) * (1 = 1) - _
                (a(j) < Cells(i, j + 3)) * (1 = 1)) * 2 ^ (k - j)
            Next j
            l = l + (m > 0) * (1 = 1)
        Next i
        Cells(MyRow, 2) = l
        MyRow = MyRow + 1
    Loop
            
End Sub

-------------------------------------

<표 1>

 

A

B

C

D

E

F

G

H

I

1

중구 필동 1번지

9

중구 필동 

1

번지

 

 

 

 

2

중구 필동 1-11

8

중구 필동 

1

-

11

 

 

 

3

중구 필동 1-2

7

중구 필동 

1

-

2

 

 

 

4

중구 필동 1 희망APT 1001-203

6

중구 필동 

1

 희망APT 

1001

-

203

 

5

중구 필동 1 희망APT 101-204

5

중구 필동 

1

 희망APT 

101

-

204

 

6

중구 충무로2가 3-5

0

중구 충무로

2

 

3

-

5

 

7

중구 충무로2가 31 A빌딩 5층

1

중구 충무로

2

 

31

 A빌딩 

5

8

중구 충무로2가 31 A빌딩 502호

2

중구 충무로

2

 

31

 A빌딩 

502

9

중구 충무로2가 산30번지

3

중구 충무로

2

가 산

30

번지

 

 

10

중구 충무로2가 산301-2

4

중구 충무로

2

가 산

301

-

2

 

 

<표 2>

 

A

B

C

D

E

F

G

H

I

1

중구 충무로2가 3-5

0

중구 충무로

2

 

3

-

5

 

2

중구 충무로2가 31 A빌딩 5층

1

중구 충무로

2

 

31

 A빌딩 

5

3

중구 충무로2가 31 A빌딩 502호

2

중구 충무로

2

 

31

 A빌딩 

502

4

중구 충무로2가 산30번지

3

중구 충무로

2

가 산

30

번지

 

 

5

중구 충무로2가 산301-2

4

중구 충무로

2

가 산

301

-

2

 

6

중구 필동 1 희망APT 101-204

5

중구 필동 

1

 희망APT 

101

-

204

 

7

중구 필동 1 희망APT 1001-203

6

중구 필동 

1

 희망APT 

1001

-

203

 

8

중구 필동 1-2

7

중구 필동 

1

-

2

 

 

 

9

중구 필동 1-11

8

중구 필동 

1

-

11

 

 

 

10

중구 필동 1번지

9

중구 필동 

1

번지

 

 

 

 


<표 1>과 같이 출력되는데, B열의 2행, 3행을 보면 1-2가 1-11보다 작게 나타납니다 (4행,5행도 마찬가지). 이제 전체 잡아 B열 기준으로 데이타정렬하면 <표 2>와 같이 대충 원하는 순서대로 아래와 같이 나열됩니다. 대충이란? 예시에서 보이다시피 주소 중 "산", "번지"류는 사전에 삭제하여 위 작업을 해야 할 것으로 판단되네요. (9행과 10행은 "번지" 때문에 제대로 정렬되지 않음. "번지"를 붙이려면 모두 붙이든지 빼려면 모두 빼는 것이 바람직, "산"도 비슷한 에러를 내지 싶습니다.) (2008.04.10)