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 — 조기 반환. Sub의 Exit 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. 디버깅
- VBA 편집기에서
Function안에 중단점(F9) - 시트에서
=회사마진(...)입력 후 F5가 아닌 셀 재계산 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에 함수 설명 한 줄.
참고: 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에 기준을 한 줄로 박아 두세요.