Excel & IT Info

아이엑셀러 닷컴, 엑셀러TV

VBA

[VBA 입문] 15강. 사용자 정의 함수 만들기

권현욱(엑셀러) 2023. 10. 9. 08:00
반응형

들어가며

지금까지 만든 프로시저는 대부분 서브(Sub) 프로시저였습니다. 프로시저에는 이것 말고 다른 것도 있습니다. 이번 시간에는 프로시저의 종류와, '사용자 정의 함수'라고도 불리는 Function 프로시저에 대해 알아봅니다. 이걸 배우면 어떤 일들을 할 수 있는지 기대되시죠? 출발합시다.

이 콘텐츠는 <엑셀 VBA 파워 코딩의 정석>(권현욱 저, 디지털북스 출간)에서 편집, 인용한 것입니다.

프로시저의 종류

우리가 Visual Basic Editor에서 작성하는 코드는 '프로시저(Procedure)'라고도 합니다. 프로시저에는 3가지 종류가 있습니다.

종류 역할
Sub 프로시저 특정한 동작을 실행한다.
Function 프로시저 특정한 계산을 수행하고 결과값을 돌려준다. '사용자 정의 함수'라고도 한다.
Property 프로시저 개체의 속성을 새로 정의한다.

 프로퍼티 프로시저는 실무에서 거의 사용되지 않습니다. 일반적으로 프로시저라고 하면 Sub와 Function 프로시저를 말합니다. Sub 프로시저와 Function 프로시저의 가장 큰 차이점은, 특정한 작업을 하고 나서 결과값을 돌려주느냐 그렇지 않으냐 차이입니다.


사용자 정의 함수 만드는 법

Function 프로시저는 다른 말로 '사용자 정의 함수(UDF: user-defined function)라고 부릅니다. 함수는 함수인데 사용자가 만든 함수라는 뜻입니다.

Function 프로시저는 Function으로 시작해서 End Function으로 끝납니다. Function 프로시저의 기본적인 작성 형식은 이렇습니다. 마지막 부분에서 결과값을 담을 변수는 함수명과 반드시 같아야 함을 기억해 두시기 바랍니다.

Function 함수명(인수1, 인수2,...)
    명령문
    명령문
    함수명 = 결과값
End Function

Sub 프로시저와의 차이가 명확히 드러납니다. 인수를 전달받아서 명령을 수행하고, 그 결과값을 되돌려줍니다. 사용자 정의 함수도 함수이므로 워크시트에서 함수를 사용할 때와 동일한 방식입니다. n제곱근을 구해주는 사용자 정의 함수를 만들어보죠.

Function 제곱근(number, n)
    Dim sngX As Single
    sngX = number ^ (1 / n)
    제곱근 = sngX
End Function

두 개의 인수를 전달받습니다. number는 제곱근을 구하고자 하는 값, n은 몇 제곱근을 할 것인지를 지정하는 인수입니다. 이 코드를 모듈 시트에 작성한 다음, 워크시트로 가서 '=제곱근(2,2)'라고 입력하면 2의 2 제곱근이 구해집니다.

(이미지: 아이엑셀러 닷컴)

사용자 정의 함수는 여러 개의 인수를 가질 수도 있고(Vlookup 함수처럼) 하나도 갖지 않을 수도 있습니다. 사용자 정의 함수는 워크시트에서 일반 함수처럼 사용할 수도 있고, 다른 프로시저(Sub나 Function)에서 호출하는 형태로 사용할 수도 있습니다.


인센티브를 계산해 주는 사용자 정의 함수

실무에서 사용되는 사용자 정의 함수를 하나 만들어보죠. 직종코드와 연봉을 인수로 전달받아서 직종별 인센티브를 자동으로 구해주는 사용자 정의 함수입니다.

(이미지: 아이엑셀러 닷컴)

잠시 화면을 덮고, 어떻게 구현할 수 있을지 3분만 생각하신 후 다음 코드를 보시기 바랍니다.

Function 인센티브(직종코드, 연봉)
    Dim curIncentive As Currency
    
    Select Case 직종코드
        Case 1
            curIncentive = 연봉 * 0.1
        Case 2, 3
            curIncentive = 연봉 * 0.08
        Case 4 To 7
            curIncentive = 1000000
        Case Is > 7
            curIncentive = 800000
    End Select
    
    인센티브 = curIncentive
End Function

경우의 수가 많기 때문에 If 문보다는 Select ~ Case 문이 좋겠죠? Case 조건을 지정하는 다양한 방식을 눈여겨보세요. 돈과 관련이 있으므로 변수도 Currency(통화형) 타입으로 선언했습니다.

사용자 정의 함수는 작업을 수행하고 그 결과까지 리턴해 주므로 Sub 프로시저보다 더 똑똑하다고 할 수 있습니다. 하지만 함수이기 때문에 글자 크기를 바꾸거나 셀 배경색을 지정하는 등 서식을 변경할 수는 없습니다.


나가며

이제 여러분은 Sub 프로시저와 Function 프로시저를 구분하고, 업무 특성에 맞는 사용자 정의 함수를 만들 수 있게 되었습니다. 축하합니다.