EXCEL - VBA

주소 결합 시 '산' 다음에 선택적으로 공백 추가하기(사용자 지정 함수)

별동산 2025. 4. 15. 08:54
반응형

2024.05.15 - [EXCEL - VBA] - 소재지, 특지구분, 본번, 부번 합치기(2) - VBA


위 글에서 매크로로 소재지, 특지 구분, 본번, 부번을 결합하는 것을 해봤는데,

이번에는 사용자 지정 함수를 만들어 보겠습니다.

(영어로 User-Defined Function이므로 '사용자 정의 함수'라고 하는 것이 맞을 듯한데, 엑셀에서는 사용자 지정 함수라는 용어를 사용하네요)

Microsoft 사용자 지정 함수 도움말

 

1. 로직

로직은 매크로나 같습니다.

특지 구분에 '산'이 있으면 소재지 다음에 공백 한 칸과 '산'을 결합하고, 없으면 빈칸으로 처리하고,

부번이 있으면 본번과 부번을 하이픈(-)으로 연결하고 없으면 본번만 표시하는 것입니다.
 
그런데 사용자 지정 함수에서는 이에 더해 옵션을 줘서 '산' 다음에 공백 한 칸을 둘 것인지를 지정할 수 있도록 하겠습니다.
 

2. 코드

사용자 지정 함수의 코드는 아래와 같습니다.

Function To_Addr(rngA As Range, Optional spYN As Boolean = False)
    '소재지, 특지, 본번, 부번이 연속된 범위 4개를 지정해서 주소로 합치고,
    'spYn를 옵션으로 둬서 True이면 '산'다음에 공백 한 칸을 추가함
    
    If Trim(Trim(rngA(1, 2))) = "산" Then
        If spYN = True Then
            To_Addr = Trim(rngA(1, 1)) & " " & Trim(rngA(1, 2)) & " "
        Else
            To_Addr = Trim(rngA(1, 1)) & " " & Trim(rngA(1, 2))
        End If
    Else
        To_Addr = Trim(rngA(1, 1)) & " "
    End If
    
    If Val(rngA(1, 4)) Then
        To_Addr = To_Addr & Trim(rngA(1, 3)) & "-" & Trim(rngA(1, 4))
    Else
        To_Addr = To_Addr & Trim(rngA(1, 3))
    End If
End Function

 
파일은 아래와 같습니다.

지번주소 결합 사용자 지정 함수.xlsm
0.02MB

 
 
그러나, 엑셀 추가 기능(*.xlam) 형식을 선택한 후

Excel 추가 기능(*.xlam) 파일 형식

 
 
저장하고(자동으로 AddIns 폴더에 저장됨),
※ 파일명이 너무 길므로 짧게 영어로 지정하는 것이 좋음

 

지번주소 결합 사용자 지정 함수.xlam
0.02MB


 
개발 도구 - Excel 추가 기능을 누른 후 목록 중에서 '지번 주소 결합 사용자 정의 함수'에 체크하고 확인 버튼을 누르는 것이 좋습니다. 

엑셀 추가 기능 설정
기존에 Cton과 Eval 이란 사용자 지정 함수가 있습니다.

 
 
그러면 어떤 엑셀 파일을 열던지 to_addr 사용자 지정 함수를 사용할 수 있습니다.

 

3. 코드 간단한 설명

가. Function으로 시작해서 End Function으로 끝남

 

나. Function 다음에 사용자 지정 함수 명을 적고, 괄호 안에 인수를 지정하는데 형식을 같이 지정

Function To_Addr(rngA As Range, Optional spYN As Boolean = False)

여기서 사용자 지정 함수명은 To_Addr이고,
인수는 rngA와 spYN 2개이며,
형식은 Range(범위)와 Boolean(참 또는 거짓)입니다.

다. 옵션은 인수의 마지막 위치에 기입하고 기본 값 지정 가능

Optional spYN As Boolean = False

spYN의 기본값이 False, 거짓이므로 '산' 다음에 공백을 추가하지 않습니다.

라. 주석은 '(작은따옴표) 다음에 기입함

    '소재지, 특지, 본번, 부번이 연속된 범위 4개를 지정해서 주소로 합치고,
    'spYn를 옵션으로 둬서 True이면 '산'다음에 공백 한 칸을 추가함

 위 내용은 함수에 대한 간단한 설명입니다.

마. 특지 구분 처리 부분

    If Trim(Trim(rngA(1, 2))) = "산" Then
        If spYN = True Then
            To_Addr = Trim(rngA(1, 1)) & " " & Trim(rngA(1, 2)) & " "
        Else
            To_Addr = Trim(rngA(1, 1)) & " " & Trim(rngA(1, 2))
        End If
    Else
        To_Addr = Trim(rngA(1, 1)) & " "
    End If

 

 
If Trim(Trim(rngA(1, 2))) = "산" Then
        If spYN = True Then
  => 지정된 범위의 두 번째 셀이 '산'이고, spYN이 True이면 
 
To_Addr = Trim(rngA(1, 1)) & " " & Trim(rngA(1, 2)) & " "
  => To_Addr란 반환 값에 rngA 범위에서 첫 번째 셀 값인 '소재지'의 좌우 공백을 제거한 후, 한 칸 공백을 추가하고, '산'을 추가한 후 다시 공백 한 칸을 추가함.

       이렇게 엑셀 VBA에서는 사용자 지정 함수의 반환 값을 지정할 때 사용자 지정 함수명을 사용합니다.
 
        Else
            To_Addr = Trim(rngA(1, 1)) & " " & Trim(rngA(1, 2))
        End If
 => '산'인데 spYN이 False이면 소재지에 공백 한 칸을 추가한 다음 '산'을 결합하고, '산' 다음에 공백을 추가하지 않습니다.
 
    Else
        To_Addr = Trim(rngA(1, 1)) & " "
    End If
 
  => '산'이 아닌 경우는 소재지에 공백 한 칸만 추가합니다.
 

바. 본번과 부번 처리 부분

    If Val(rngA(1, 4)) Then
        To_Addr = To_Addr & Trim(rngA(1, 3)) & "-" & Trim(rngA(1, 4))
    Else
        To_Addr = To_Addr & Trim(rngA(1, 3))
    End If

 
네 번째 셀인 부번의 값이 0보다 큰 경우(0이 False이며, 양수는 모두 True 이므로 Val(rngA(1, 4)) 다음에 "> 0" 입력 불필요)는

위에서 구한  소재지와 특지 구분 결합 값에
세 번째 값인 본번과 네 번째 값인 부번을 하이픈으로 연결한 값을 추가하고,
 
0인 경우, 다시 말해 부번이 없는 경우는 위에서 구한  소재지와 특지 구분 결합 값에
본번만 추가해서 반환합니다.

 

4. 한 파일에 여러 개 사용자 지정 함수 추가

엑셀 추가 기능 파일(*.xlam)에 사용자 지정 함수를 만들어 계속 추가할 수 있습니다.

 

아래는 To_Addr 함수 아래에 eval 사용자 지정 함수를 추가한 예입니다.

 

Function To_Addr(rngA As Range, Optional spYN As Boolean = False)

   (처리 구문1)

End Function

 

Function eval(aRange As Range)

   (처리 구문2)

End Function

 

Function To_Addr(rngA As Range, Optional spYN As Boolean = False)
    '소재지, 특지, 본번, 부번이 연속된 범위 4개를 지정해서 주소로 합치고,
    'spYn를 옵션으로 둬서 True이면 '산'다음에 공백 한 칸을 추가함
    
    If Trim(Trim(rngA(1, 2))) = "산" Then
        If spYN = True Then
            To_Addr = Trim(rngA(1, 1)) & " " & Trim(rngA(1, 2)) & " "
        Else
            To_Addr = Trim(rngA(1, 1)) & " " & Trim(rngA(1, 2))
        End If
    Else
        To_Addr = Trim(rngA(1, 1)) & " "
    End If
    
    If Val(rngA(1, 4)) Then
        To_Addr = To_Addr & Trim(rngA(1, 3)) & "-" & Trim(rngA(1, 4))
    Else
        To_Addr = To_Addr & Trim(rngA(1, 3))
    End If
End Function

Function eval(aRange As Range)
    eval = Evaluate(aRange.Value)
End Function
반응형