논리/엑셀 프로그래밍

주소 정렬 (번지순)

섬그늘 2008. 11. 13. 16:12

별로 실전적이진 않지만...함수로 한번에 되긴 됩니다. 프로그램에 관심 있다시면 참고해 보세요.

 

B

C

D

E

F

2

가좌동 846-87

 

가좌동 89-11

 

3

3

가좌동 846-88

 

가좌동 89-13

 

8

4

가좌동 846-89

 

가좌동 89-16

 

846

5

가좌동 846-90

 

가좌동 91-6

 

846

6

가좌동 856-3

 

가좌동 846-87

 

87

7

가좌동 860-2

 

가좌동 846-88

 

846.9

8

가좌동 89-11

 

가좌동 846-89

 

 

9

가좌동 89-13

 

가좌동 846-90

 

 

10

가좌동 89-16

 

가좌동 856-3

 

 

11

가좌동 91-6

 

가좌동 860-2

 

 

12

가좌동 947-1

 

가좌동 947-1

 

 

13

가좌동 970-1

 

가좌동 970-1

 

 

D2 =INDIRECT("B"&MAX(IF(MID(B$2:B$13,FIND("동 ",B$2:B$13,1)+2,IF(ISERROR(FIND("-",B$2:B$13,1)),LEN(B$2:B$13)+1,FIND("-",B$2:B$13,1))-FIND("동 ",B$2:B$13,1)-2)+IF(ISERROR(FIND("-",B$2:B$13,1)),0,MID(B$2:B$13,FIND("-",B$2:B$13,1)+1,LEN(B$2:B$13)-FIND("-",B$2:B$13,1)+1))/10^LEN(IF(ISERROR(FIND("-",B$2:B$13,1)),0,MID(B$2:B$13,FIND("-",B$2:B$13,1)+1,LEN(B$2:B$13)-FIND("-",B$2:B$13,1)+1)))=SMALL(MID(B$2:B$13,FIND("동 ",B$2:B$13,1)+2,IF(ISERROR(FIND("-",B$2:B$13,1)),LEN(B$2:B$13)+1,FIND("-",B$2:B$13,1))-FIND("동 ",B$2:B$13,1)-2)+IF(ISERROR(FIND("-",B$2:B$13,1)),0,MID(B$2:B$13,FIND("-",B$2:B$13,1)+1,LEN(B$2:B$13)-FIND("-",B$2:B$13,1)+1))/10^LEN(IF(ISERROR(FIND("-",B$2:B$13,1)),0,MID(B$2:B$13,FIND("-",B$2:B$13,1)+1,LEN(B$2:B$13)-FIND("-",B$2:B$13,1)+1))),ROW()-ROW(D$2)+1),ROW(B$2:B$13),0)))  ; 수식 입력 후 CTRL+SHIFT+ENTER (배열 수식) D2 잡아 데이타 행 만큼 아래로 복사하면 작업 끝.

 

D2의 수식 설명

F2 =FIND("동 ",B2,1)

F3 =IF(ISERROR(FIND("-",B2,1)),LEN(B2)+1,FIND("-",B2,1))

F4 =MID(B2,F2+2,F3-F2-2)

F5 =MID(B2,FIND("동 ",B2,1)+2,IF(ISERROR(FIND("-",B2,1)),LEN(B2)+1,FIND("-",B2,1))-FIND("동 ",B2,1)-2)

F6 =IF(ISERROR(FIND("-",B2,1)),0,MID(B2,FIND("-",B2,1)+1,LEN(B2)-FIND("-",B2,1)+1))

F7 =F5+F6/10^LEN(F6)

 

F2에서 주소 시작 위치 계산, F3에서는 하이픈(-)위치 계산, 하이픈이 없을 경우(예: 가좌동 235)도 있을 터이니 하이픈이 없으면 마지막+1을 하이픈 위치로 둠. F4에서 하이픈 왼쪽 문자열을 MID로 가져옴. 이걸 중간정리, 한 셀에 구겨 넣으면 F5가 됨. F6에서는 하이픈 오른쪽 문자열을 가져옴 (하이픈이 없으면 0). F7에서는 (비교를 위해) 왼쪽.오른쪽으로 숫자를 만듬.

 

D2는 INDIRECT("B"&MAX(IF(F5=SMALL(F5,1),ROW(범위),0))의 구조임. 즉, 배열수식으로 범위를 F5자리에 넣어 위에서 만든 숫자의 전체순위가 당행에 맞는 행을 구해 INDIRECT로 문자열을 가져 옴. 이걸 원용해 동 이름이 다를 때 비교도 이론상 가능하지만 "수식이 너무 깁니다"가 뜰 것임. 보조셀 경유하여 죽죽 미는 것이 훨씬 실전적임.