- 최초 작성일: 2025-01-24
- 최종 수정일: 2026-09-27
- 조회수: 22 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: VBA 파워 코딩 246회 - Optional 인수 함수
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
지구상에서 가장 달리기를 잘하는 부족
멕시코 중서부 시에라 협곡에 사는 타라후마라 족은 지구상에서 달리기를 가장 잘하는 부족으로 명성이 높습니다. 이들의 달리기 실력은 사슴을 쫓아가서 잡을 정도라고 합니다. 그 비결은 무엇일까요?
타라후마라 부족 출신의 22세 여성이 샌들만 신고 50km 코스를 완주, 12개국 500여 명이 참석한 울트라 마라톤 대회 여자부를 평정했다.
(2017년 5월 23일, 서울신문)
이들은 어떤 사슴을 점찍으면 줄기차게 그 놈만 추격합니다. 사흘 동안 계속 쫓을 때도 있다죠. 타라후마라 족은 매일 수십 킬로미터씩 달리며, 한 번에 700 킬로미터를 달린 적도 있다고 합니다. 사슴이 지쳐 쓰러질 때까지 쫓아가는 겁니다.
"인간이 가장 잘 달릴 수 있는 나이는 60대이다."
타라후마라 부족은 이렇게 믿고 있다고 합니다.
어느 인디언 부족의 '성공률 100% 기우제' 비결이 '비가 올 때까지 기우제를 지내는 것'이듯, '목표 100% 달성'의 비결은 '성공할 때까지 중단 없는 노력'인 지도 모릅니다.
인수의 갯수가 수시로 변하는 사용자 정의 함수 만들기
핵심 요약: Optional 인수로 상위 N개의 평균 구하기
Function 상위평균(rngX, Optional n = 5)는 n을 생략하면 5로 간주하고, 범위에서 큰 값부터 n개를 Application.WorksheetFunction.Large로 더해 평균을 돌려줍니다.
- 문제: Large 함수를 여러 번 더하는 수식은 N이 커질수록 곤란
- Optional 키워드: 인수를 생략하면 기본값을 갖도록 설정
- 워크시트 함수 호출: Application.WorksheetFunction 또는 WorksheetFunction을 함수 이름 앞에 붙임
- 주의: Rand처럼 같은 기능의 VBA 함수(Rnd)가 있으면 VBA 함수를 사용
상위 N개의 평균을 구하려면?
어떤 범위 내에서 상위 5개의 평균을 구해야 한다면 어떻게 해야 할까요? 엑셀에는 그런 기능을 수행하는 함수가 별도로 없기 때문에 이런 수식을 사용하면 되기는 합니다.
=(Large(범위, 1) + Large(범위, 2) + ... + Large(범위, 5)) / 5
이 수식은 오류 없이 작동합니다만 그다지 좋은 방법은 아닙니다. 왜냐고요? 만약 상위 10개의 평균을 구해야 한다면 수식을 이렇게 바꿔주어야 합니다.
=(Large(범위, 1) + Large(범위, 2) + Large(범위, 3) + ... + Large(범위, 10)) / 10
이 정도라면 그런대로 사용할 만합니다. 그러면 상위 100개의 평균을 구해야 한다면 어떤가요. 곤란하겠지요? 이런 경우 오늘 소개할 사용자 정의 함수를 이용하면 간단히 해결할 수 있습니다.
'상위평균' 사용자 정의 함수
'상위평균'이라는 사용자 정의 함수는 다음과 같습니다.
Function 상위평균(rngX, Optional n = 5) ' 작업 대상 범위와 몇 개의 평균을 구할지 인수로 받음
Dim dblSum As Double ' 결과를 저장할 변수
Dim i As Integer ' 반복 횟수를 지정할 변수
For i = 1 To n ' 지정한 수만큼 For ~ Next 문 반복
dblSum = dblSum + Application.WorksheetFunction.Large(rngX, i)
' 반복할 때마다 해당 값을 dblSum 변수에 저장함
Next i
상위평균 = dblSum / n ' dblSum 값을 n으로 나누어 평균값을 구하여 반환
End Function
눈여겨볼 점 1: Optional 키워드
이 함수에서는 두 가지 점을 눈여겨 보세요. 먼저, Optional 키워드입니다. 우리가 잘 아는 문자열 함수의 하나인 Left는 이런 형태로 사용합니다.
=Left(텍스트, 추출할 문자열 수)
만약 '추출할 문자열 수' 인수를 생략하면 엑셀이 알아서 '1'로 간주합니다. 즉, 다음 두 수식은 같은 결과값을 돌려줍니다.
=Left(텍스트, 1)
=Left(텍스트)
사용자 정의 함수에서 "특정한 인수를 생략하면 기본적으로 어떤 값을 갖도록 설정"할 때 사용하는 것이 "Optional" 키워드입니다. 따라서 다음 두 수식의 결과값은 같습니다. '상위평균' 함수에서 "Optional n = 5"로 지정해주었기 때문이지요.
=상위평균(범위, 5)
=상위평균(범위)
눈여겨볼 점 2: VBA에서 워크시트 함수 사용하기
또 한 가지 유의할 점은, VBA에서도 엑셀의 워크시트 함수(내장함수)를 불러와서 사용할 수 있다는 점입니다. 워크시트 함수 앞에 Application.WorksheetFunction 또는 WorksheetFunction을 함수 이름 앞에 붙여주면 됩니다. 위 함수에서는 이 부분입니다.
dblSum = dblSum + Application.WorksheetFunction.Large(rngX, i)
[참고] 워크시트 함수를 VBA에서 사용할 때 유의할 점
워크시트 함수와 같은 기능을 수행하는 VBA 함수가 있는 경우, 워크시트 함수를 VBA 코드에서 불러오면 에러가 발생합니다. 무슨 말이냐 하면... 0 ~ 1 사이에 있는 임의의 난수를 생성해주는 워크시트 함수로 Rand라는 것이 있습니다. 동일한 기능을 수행하는 Rnd라는 VBA 함수가 있습니다.
따라서 VBA에서는 Rand를 사용할 수 없고 Rnd 함수를 사용해야 합니다.
MsgBox Application.WorksheetFunction.Rand ' 오류 발생 (워크시트 함수 Rand는 사용할 수 없음)
MsgBox Rnd ' 정상 동작 (같은 기능의 VBA 함수)
참고: 원문 수식과 코드 재구성
원문에서 아래 세 곳은 수식이 모두 앞의 =(Large(범위, 1) + ... + Large(범위, 5)) / 5로 똑같이 복사되어 있었습니다. 앞뒤 설명에 맞추어 다음과 같이 다시 작성했으니 원본과 다를 수 있습니다.
① "Left 함수의 두 수식" → =Left(텍스트, 1), =Left(텍스트)
② "상위평균 함수의 두 수식" → =상위평균(범위, 5), =상위평균(범위)
③ Rand와 Rnd 예시 → 위의 짧은 예시 코드 (원문의 코드를 알 수 없어 새로 작성)
또한 원문에는 같은 상위평균 함수 코드가 두 번 실려 있었는데, 두 번째는 워크시트 함수 호출 부분을 강조하려는 것으로 보고 핵심 한 줄만 남겼습니다.
참고: 이미지에 대하여
이 글은 원래 네이버 포스트에 게재되었던 글로, 네이버 포스트 서비스 종료로 네이버 블로그로 옮기는 과정에서 원본 이미지가 소실되었습니다. 위 이미지는 본문 설명을 바탕으로 당시 화면 구성을 재구성한 예시 이미지이며, 실제 엑셀 화면과 세부 디자인(버전별 UI)은 다를 수 있습니다. 이미지 속 점수는 예시이며 결과값은 그 점수로 실제 계산한 값입니다. 첫머리의 신문 기사 이미지는 싣지 않고 기사 문구와 출처만 텍스트로 옮겼습니다.
정리 — 인수의 개수가 변하는 사용자 정의 함수
| 핵심 | 내용 |
|---|---|
| 문제 | 상위 N개의 평균을 Large 함수의 합으로 구하면 N이 커질수록 수식이 길어짐 |
| 해결 | 사용자 정의 함수 상위평균(rngX, Optional n = 5) |
| Optional 키워드 | 인수를 생략하면 지정한 기본값(여기서는 5)을 사용 |
| 워크시트 함수 호출 | Application.WorksheetFunction.함수명 (단, Rand처럼 VBA 함수 Rnd가 있으면 VBA 함수 사용) |
자주 묻는 질문 (FAQ)
Q1. 상위 N개의 평균을 구하는 엑셀 함수가 있나요?
그런 기능을 수행하는 함수가 별도로 없어서 Large 함수를 여러 번 더하는 수식을 써야 합니다. 개수가 많아지면 불편하므로 사용자 정의 함수(상위평균)를 만들어 사용하면 간단합니다.
Q2. 사용자 정의 함수에서 인수를 생략하면 기본값을 갖게 하려면 어떻게 하나요?
Optional 키워드를 사용합니다. 예제의 Function 상위평균(rngX, Optional n = 5)처럼 지정하면 n을 생략했을 때 5로 간주합니다.
Q3. VBA에서 워크시트 함수를 사용하려면 어떻게 하나요?
함수 이름 앞에 Application.WorksheetFunction 또는 WorksheetFunction을 붙입니다. 단, Rand처럼 같은 기능의 VBA 함수(Rnd)가 있는 경우에는 워크시트 함수를 불러올 수 없고 VBA 함수를 사용해야 합니다.
마치며
Optional 키워드 하나로 인수를 생략해도 알아서 동작하는 똑똑한 함수를 만들 수 있습니다. 여러분도 자주 쓰는 계산을 함수로 만들어 보세요!
VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 사이트 정문 왼쪽에 있는 'VBA 강좌 - VBA 입문강좌'를 읽어보시면 이해가 빠릅니다.