간단할 것 같았는데 해 보니 무척 복잡하네요 --+
|
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 |