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)
'Skills > Excel VBA' 카테고리의 다른 글
vba 다른 파일에 있는 데이터를 검색하여 가져오기 (0) | 2008.12.09 |
---|---|
휴무명령 자동생성 (월 회, 일 간격 확보, 주말 1회 우선순위...) (0) | 2008.11.23 |
DB의 임의 행을 중복 없이 지정 수 만큼 계속 나열 (5*3) (0) | 2008.11.13 |
VBA 문자열 변동 또는 합계에 따라 행 삽입/일련 번호 (0) | 2008.11.13 |
VBA 문자열 변동 또는 합계에 따라 행 삽입/일련 번호 (0) | 2008.11.13 |