논리/엑셀 프로그래밍

주소의 동만 표시하기

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

간단할 것 같았는데 해 보니 무척 복잡하네요 --+ 

 

 

A

B

C

D

1

주소

12

"동 "의 시작위치

2

부산시 서구 동대신1동 000-02

동대신1동

 동대신1

왼쪽 다섯 글자

3

경기도 안양시 동안구 호계동 000-00

호계동

1

첫째 빈 칸 위치

4

서울시 중구 필동 000-00

필동

1

첫째칸 빈 칸 여부

5

인천시 남구 동동 000-00

동동

0

넷째 칸 빈 칸 여부

6

서울시 노원구 창1동 000-00

창1동

1

동 이름 왼쪽 빈 칸

7

울산시 동구 방어진동 000-00

방어진동

8

동 이름 시작 위치

8

충청북도 음성군 꽃동네1동 000-00

꽃동네1동

5

동 이름의 길이

9

서울시 동대문구 동답십리12동 000-01

동답십리12동

동대신1동

동 이름

 

C1 =FIND("동 ",A2,1)

C2 =MID(A2,C1-5,5)

C3 =FIND(" ",C2,1)

C4 =N(MID(C2,1,1)=" ")

C5 =N(MID(C2,4,1)=" ")*4

C6 =IF(AND(C4=0,C5=0),IF(ISERROR(C3),-1,C3),N(NOT(C5=4))*(N(C4=1)-N(NOT(C4=1)))+N(C5=4)*4)

 

C7 =C1-5+C6

C8 =C1-C7+1

C9 =MID(A2,C7,C8)

 

이걸 한 셀에 모으는 단순 작업을 하면,

B2 =MID(A2,FIND("동 ",A2,1)-5+IF(AND(N(MID(MID(A2,FIND("동 ",A2,1)-5,5),1,1)=" ")=0,N(MID(MID(A2,FIND("동 ",A2,1)-5,5),4,1)=" ")*4=0),IF(ISERROR(FIND(" ",MID(A2,FIND("동 ",A2,1)-5,5),1)),-1,FIND(" ",MID(A2,FIND("동 ",A2,1)-5,5),1)),N(N(MID(MID(A2,FIND("동 ",A2,1)-5,5),1,1)=" ")=1)*N(NOT(N(MID(MID(A2,FIND("동 ",A2,1)-5,5),4,1)=" ")*4=4))+N(MID(MID(A2,FIND("동 ",A2,1)-5,5),4,1)=" ")*4-N(NOT(N(MID(MID(A2,FIND("동 ",A2,1)-5,5),1,1)=" ")=1))*N(NOT(N(MID(MID(A2,FIND("동 ",A2,1)-5,5),4,1)=" ")*4=4))),6-IF(AND(N(MID(MID(A2,FIND("동 ",A2,1)-5,5),1,1)=" ")=0,N(MID(MID(A2,FIND("동 ",A2,1)-5,5),4,1)=" ")*4=0),IF(ISERROR(FIND(" ",MID(A2,FIND("동 ",A2,1)-5,5),1)),-1,FIND(" ",MID(A2,FIND("동 ",A2,1)-5,5),1)),N(N(MID(MID(A2,FIND("동 ",A2,1)-5,5),1,1)=" ")=1)*N(NOT(N(MID(MID(A2,FIND("동 ",A2,1)-5,5),4,1)=" ")*4=4))+N(MID(MID(A2,FIND("동 ",A2,1)-5,5),4,1)=" ")*4-N(NOT(N(MID(MID(A2,FIND("동 ",A2,1)-5,5),1,1)=" ")=1))*N(NOT(N(MID(MID(A2,FIND("동 ",A2,1)-5,5),4,1)=" ")*4=4))))

 

B2를 잡아 (수식이 길어 잡기도 어려움. 화면 하단 스크롤 바를 만져야 셀이 보임) 아래로 원하는 만큼 복사하면 동 이름이 바라는 대로 출력됩니다.

 

이하는 감상문입니다. 시작하자마자, 텍스트인 주소에서 "동 " 문자열의 위치를 찾고 (동 이름이 끝나는 위치),

거기서 왼쪽으로 다섯 글자(대충 동 이름 다섯 자 넘는 거 없으니까)를 가져 와서 " "(빈 칸)의 위치(동 이름의 왼쪽 위치)를 탐색하면 동이 시작하는 문자 위치를 비교적 쉽게 찾아낼 수 있겠다고 생각했습니다. 근데 세상 일 생각대로 되질 않는군요. 즉,

 

'동답십리12동', 이거 동 이름만 여섯 자입니다. 왼쪽 다섯 글자 가져오면 빈 칸이 없지요.

'중구 필동', 이건 동 이름만 달랑 한 자입니다. 왼쪽 다섯 글자 가져오면 빈 칸이 두 개 생깁니다.

 

이 사태를 해결하기 위해, 일단 "동 " 왼쪽에서 다섯 글자를 가져 오고

그 다섯 글자의 1번, 4번이 " "(빈 칸)인지를 검사했습니다.

('중구 필동'이 강적. 다섯 글자 가져 오면 " 중구 필"이 되어 1, 4번에 빈 칸)

 

그래서 1, 4번 빈 칸이 없으면 전체에 빈 칸이 있는 위치를 조사해서 FIND로 빈 칸이 발견되지 않으면 시작 위치는 -1, 빈 칸이 발견되면 보통 주소('동구 잠실동'의 경우, 1,4 위치 빈 칸 둘 다 없고 빈 칸은 3 위치)처리, 그리고 마지막으로 1, 4번 빈 칸 위치에 따라

 

1번 있음    4번 있음    시작 위치

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

       0                 0                 -1

       0                 1                  4

       1                 0                  1

       1                 1                  4

 

이걸 만족하는 수식은 a * ^b + b - ^a^b = ^b*(a-^a) + b 를 써서 (-1은 먼저 다뤘으니 필요없지만 어쨋든) 해결. 각 경우에 따른 동 이름 시작 위치를 구할 수 있습니다. 이후는 동 이름 길이 계산 ("동 " 위치를 아니까), MID함수로 동 이름을 채집하면 됩니다. (위 설명에 복잡한 수식은 a * ^b + b - ^a^b, C6 셀은 ^b*(a-^a) + b를 사용함) 더 간단히 해결할 수 있는 길이 있는지는 모르겠네요. 여하튼 동 이름 여섯 자 까지는 이 수식으로 찾아낼 수 있습니다.

'논리 > 엑셀 프로그래밍' 카테고리의 다른 글

m~n 중 3개 고르는 조합   (0) 2008.11.13
같은 양식 여러 개 데이타 추출  (0) 2008.11.13
중복 VLOOKUP  (0) 2008.11.13
표에 없는 숫자 표시  (0) 2008.11.13
HLOOKUP  (0) 2008.11.13