EXCEL - VBA

주소를 법정동, 특지 구분, 본번, 부번으로 분리하기(1)

별동산 2024. 8. 13. 08:25
반응형

 

 

1. 수식 이용 하기

아래 글에서 수식을 이용해 주소에서

 

법정동을 분리해내고,

https://lsw3210.tistory.com/519

 

주소를 PNU로 만들기(1-3) : 주소를 법정동명과 지번으로 분리하기

4. 주소를 법정동과 지번으로 분리하기 가. 주소의 형태  아래와 같이 시도, 시군구, 읍면동, 리로 구성된 주소가 있을 때법정동과 지번을 구분해야 하는데한 칸 공백의 개수가 3개인 경우도 있

lsw3210.tistory.com

 

지번에서 특지구분과 본번, 부번을 분리했는데

https://lsw3210.tistory.com/521

 

주소를 PNU로 만들기(1-5) : 필지구분과 본번,부번 변환하기

산인 경우 하이픈이 있는 경우가 없어서,A8셀의 주소를 경기도 가평군 북면 화악리 산 339에서 경기도 가평군 북면 적목리 산 1-1로 수정했습니다.   6. 필지구분(산과 일반) 구하기일반이면 1이

lsw3210.tistory.com

 

이번에는 사용자 정의 함수를 이용해 간단하게 분리해보겠습니다.

 

2. 사용자 정의 함수 만들기

 

대상 파일은 아래로서,

PNU만들기(주소분리).xlsm
0.01MB

 

코드는 없지만 나중에 xlsm 확장자로 만들어야 하므로 파일명을 미리 xlsm으로 만들었습니다.

 

 

 

3. 논리

 

위와 같이 주소가 있을 경우

 

2행을 예로 들면 마지막 공백 이전까지가 법정동이고, 그 다음이 특지구분과 본번, 부번이 되는데,

2행의 경우는 '산'이 없으므로 특지구분이 '일반'이 되고, 9행과 같은 경우는 '산'이 됩니다.

 

또한 2행의 경우는 111-1에서 111이 본번, 1이 부번이며, 9행의 경우는 '산' 다음에 339만 있으므로 본번이 339이고, 부번은 없습니다.

 

또한 8행은 9행과 달리 '산' 다음에 공백이 있어서, 맨 마지막행 이전이 법정동이 아니라 마지막 공백에서 1을 뺀 공백의 이전이 법정동이고, 특지구분은 '산'이 되고, 그 다음 공백 이후가 본번과 부번입니다.

 

따라서, '산' 다음에 공백이 없는 경우와 공백이 있는 경우를 나눠서 다뤄보겠습니다.

 

4. 법정동 구하기

 

가. '산' 다음에 공백이 없는 경우

 

(1) InstrRev 함수

마지막 공백 이전이 법정동이므로 간단합니다.

 

마지막 공백안 InstrRev 함수라고 뒤에서 부터 원하는 문자를 함수를 사용하면 편합니다.

이에 비해 Instr 함수는 앞에서부터 원하는 문자를 찾습니다.

 

(2) 코드 붙여 넣기

개발도구 - Visual Basic을 눌러 VB 에디터로 들어간 다음 사용자 정의 폼 콤보 상자를 누르고 모듈을 클릭해서 모듈을 추가합니다. 그러면 오른쪽과 같이 빈 코드 창이 열리는데, 만약 열리지 않는다면 왼쪽 Module1을 더블 클릭하면 됩니다.

 

그리고, 아래 코드를 복사해서 붙여넣습니다.

Function 법정동(범위 As Range)
    '범위(주소)에서 법정동을 추출한다.
    
    Dim 마지막공백 As Integer
    
    마지막공백 = InStrRev(범위, " ")
    법정동 = Left(범위, 마지막공백 - 1)
End Function

 

 

(3) 코드 분석

사용자 정의 함수를 만들기 위해서는 Function으로 시작하고 End Function으로 끝나며 Function 다음에 함수명과 괄호안에 필요한 인수를 적습니다.

 

그리고,

법정동 = Left(범위, 마지막공백 - 1)

과 같이 반환값을 함수명으로 받습니다.

 

    Dim 마지막공백 As Integer

 

위 구문은 마지막공백을 정수 형식의 변수로 선언하는 것입니다.

 

    마지막공백 = InStrRev(범위, " ")

 

인수인 범위에서 마지막 공백의 위치를 구해서 마지막공백이란 변수에 저장합니다.

 

법정동 = Left(범위, 마지막공백 - 1)

 

범위의 맨 왼쪽부터 마지막공백에서 1을 뺀 위치까지의 문자열을 가져오는 것입니다.

 

파일에서 엑셀로 돌아가기 메뉴를 누르거나, 표준 도구 모음에서 엑셀 모양 아이콘을 눌러 엑셀로 돌아간 다음

B2셀에 =법정동(A2)라고 입력하면 

'강원특별자치도 춘천시 옥천동'라고 마지막 공백 이전까지의 법정동이 구해집니다.

 

 

나. '산' 다음에 공백이 있는 경우

B2셀의 채우기 핸들을 더블 클릭하면

다른 것은 문제가 없는데 '산' 다음에 공백이 있는 8행이 문제가 됩니다.

 

따라서, 마지막 공백의 위치에서 왼쪽 한 글자가 '산'인지에 따라 처리를 달리해야 합니다.

따라서, 아래와 같이 If문을 사용해서 처리합니다.

 

마지막 공백의 왼쪽 한글자가 "산"이면 마지막공백의 값을 마지막공백에서 1을 뺀 위치부터 거꾸로 첫번째 공백을 찾아서 그 위치를 마지막공백이란 변수에 대입하는 것입니다.

    If Mid(범위, 마지막공백 - 1, 1) = "산" Then
        마지막공백 = InStrRev(범위, " ", 마지막공백 - 1)
    End If

 

그러면 '산'다음에 공백이 있던 없던 문제없이 처리됩니다.

 

B2셀의 수식 입력줄을 클릭한 다음 엔터 키를 누르면 아래와 같이 법정동이 모두 맞게 구해졌습니다.

 

전체 코드는 아래와 같습니다.

Function 법정동(범위 As Range)
    '범위(주소)에서 법정동을 추출한다.
    
    Dim 마지막공백 As Integer
    
    마지막공백 = InStrRev(범위, " ")
    
    If Mid(범위, 마지막공백 - 1, 1) = "산" Then
        마지막공백 = InStrRev(범위, " ", 마지막공백 - 1)
    End If
    
    법정동 = Left(범위, 마지막공백 - 1)
End Function

 

PNU만들기(주소분리)(법정동).xlsm
0.02MB

반응형