VBA 사용자 정의 함수 (UDF) — 회사 고유 계산을 =내함수(A1)로 만드는 법

매달 “우리 회사 마진율은 왜 엑셀 기본 함수로 안 되죠?” — 수수료·할인 단계가 회사마다 달라서 그래요. 저는 =회사마진(B2,C2) 같은 UDF(사용자 정의 함수) 를 표준 모듈에 넣고, 팀 시트 수식을 한 줄로 줄였습니다.

UDF는 Function으로 만든 셀에서 쓰는 VBA 함수입니다. Sub가 작업 실행이면, Function값을 돌려줍니다. VBA 배열을 반환하는 고급 패턴도 있지만, 오늘은 실무에서 가장 많은 단일 값 UDF부터 갑니다.

이 글을 따라 하면 얻는 것
– Function 기본·인수·반환
– Optional·IsMissing
– Application.Volatile
– UDF 디버깅·한계

1. 첫 UDF — 부가세 포함가

표준 모듈에 삽입 (삽입 → 모듈):

Function 부가세포함(공급가 As Double) As Double
    부가세포함 = 공급가 * 1.1
End Function

셀: =부가세포함(A2) — A2가 10000이면 11000.

저장: .xlsm 또는 .xlam(추가 기능). 일반 .xlsx에는 매크로가 저장되지 않습니다.

2. 여러 인수·조건

Function 회사마진(매출 As Double, 원가 As Double) As Double
    If 매출 = 0 Then
        회사마진 = 0
        Exit Function
    End If
    회사마진 = Round((매출 - 원가) / 매출, 4)
End Function

Exit Function — 조기 반환. SubExit Sub와 같습니다.

3. Optional — 기본값

Function 할인가(정가 As Double, Optional 할인율 As Double = 0.1) As Double
    할인가 = 정가 * (1 - 할인율)
End Function

=할인가(A2) → 10% 할인. =할인가(A2,0.2) → 20%.

IsMissing으로 Optional 생략 여부 분기:

Function 구간요금(수량 As Long, Optional 단가 As Variant) As Double
    If IsMissing(단가) Then
        구간요금 = 수량 * 1000
    Else
        구간요금 = 수량 * CDbl(단가)
    End If
End Function

4. 텍스트 UDF

Function 사업자번호형식(s As String) As String
    Dim d As String
    d = Replace(Replace(s, "-", ""), " ", "")
    If Len(d) <> 10 Then
        사업자번호형식 = s
        Exit Function
    End If
    사업자번호형식 = Left(d, 3) & "-" & Mid(d, 4, 2) & "-" & Right(d, 5)
End Function

CLEAN·TRIM 선행과 짝이 됩니다.

5. Volatile — 언제 재계산?

기본 UDF는 인수 셀이 바뀔 때만 재계산. Now()처럼 시간에 따라 바뀌어야 하면:

Function 영업일수오늘기준(시작일 As Date) As Long
    Application.Volatile
    영업일수오늘기준 = NetworkDays(시작일, Date)
End Function

Volatile 남용은 시트 전체를 느리게 — 꼭 필요할 때만.

6. UDF vs 워크시트 함수

항목 UDF SUMIFS 등
속도 느림 (행마다 VBA) 빠름
배포 xlsm/xlam xlsx OK
디버깅 중단점 가능 수식 감사
용도 회사 고유 규칙 일반 집계

10만 행 전체에 UDF를 깔면 저장이 버벅입니다 — 열 전체 대신 Power Query나 보조열 일부에만.

7. 디버깅

  1. VBA 편집기에서 Function 안에 중단점(F9)
  2. 시트에서 =회사마진(...) 입력 후 F5가 아닌 셀 재계산
  3. Debug.Print → Ctrl+G 즉시 창

오류 시 셀 #VALUE!On Error를 Function 안에 넣을 때는 값 반환으로 처리:

Function 안전나눗셈(a As Double, b As Double) As Variant
    On Error GoTo 실패
    안전나눗셈 = a / b
    Exit Function
실패:
    안전나눗셈 = CVErr(xlErrDiv0)
End Function

8. FAQ

Q. 다른 통합 문서에서 쓰려면?
.xlam 추가 기능으로 저장 → 참조 추가 또는 =통합문서.xlsm!회사마진(A1).

Q. 한글 함수명?
가능. 팀 영문 표준 권장 — 국제 협업 시 혼란 감소.

Q. AI가 만든 UDF?
ChatGPT VBA 결과는 Option Explicit·타입·오류 처리 꼭 검토.

9. 연습

1) =부가세포함 2) Optional 할인율 3) 0 나눗셈 CVErr 4) 팀 README에 함수 설명 한 줄.

다음: 피벗 자동 생성 · On Error.

참고: Function 문 · SUMIFS.

실무 메모 1

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 2

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 3

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 4

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 5

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 6

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 7

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 8

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 9

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 10

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 11

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 12

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 13

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 14

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 15

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 16

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 17

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 18

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 19

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 20

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 21

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 22

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 23

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 24

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 25

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 26

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 27

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 28

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 29

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 30

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 31

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 32

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 33

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 34

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 35

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 36

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 37

xlsm/xlam 저장 필수. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 38

Volatile 남용 금지. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

실무 메모 39

0 나눗셈 CVErr 처리. 분기말 보고서를 열면 같은 실수가 반복됩니다. 김대리 파일에서도 범위를 명시적으로 잡으니 응답이 빨라졌어요. 팀 README에 기준을 한 줄로 박아 두세요.

작성자 소개