연구 과제를 하다 보면, 엑셀 수식만으로는 어느 순간부터 벽이 느껴집니다. 특히 같은 계산을 조건별로 여러 번 반복해야 할 때는 더 그렇죠.
저도 비슷한 순간에 이런 생각이 들었습니다. “아, 코드였으면 반복문으로 끝났는데…” 그리고 곧바로 이어진 생각이 “엑셀에서도 직접 함수 만들 수 있잖아?”였습니다.

엑셀은 VBA(Visual Basic for Applications)로 “내가 원하는 계산 로직”을 함수처럼 만들어 워크시트에서 그대로 호출할 수 있습니다. 수식으로는 지저분해지는 계산을 짧은 코드로 정리할 수 있다는 게 가장 큰 매력입니다.
엑셀에서 VBA 창 여는 방법
가장 빠른 방법: 단축키

엑셀을 켠 다음 Alt + F11을 누르면 VBA 편집기(Visual Basic Editor)가 바로 뜹니다.
화면을 분할해두면 엑셀 셀과 코드를 번갈아 보면서 작업하기 편합니다. (윈도우 화면 분할은 윈도우키 + 방향키)
개발 도구 탭에서 여는 방법
리본 메뉴에 개발 도구 탭이 보이면, 거기서 Visual Basic을 눌러도 동일하게 열립니다.
개발 도구 탭이 안 보이면 엑셀 옵션에서 리본 사용자 지정으로 표시할 수 있습니다.
모듈 추가하고 코딩 준비하기

VBA 편집기 좌측의 프로젝트 탐색기에는 보통 파일(통합문서) / Sheet 같은 구조가 보입니다.
코드를 깔끔하게 관리하려면 워크시트가 아니라 모듈에 작성하는 편이 좋습니다.
모듈 삽입
- 프로젝트 탐색기에서 통합문서를 펼칩니다.
- 좌측에서 원하는 위치를 클릭한 뒤 우클릭 → 삽입 → 모듈
- 오른쪽에 새 코드 창이 뜨고, 좌측 트리에도 Module이 추가된 것을 확인할 수 있습니다.
여기까지 해두면 이제 “실행용 Sub”도 만들 수 있고, “시트에서 호출하는 함수(Function)”도 만들 수 있습니다.
엑셀에서 실행되는 Sub와, 셀에서 쓰는 Function 차이
Sub: 버튼처럼 실행
Sub는 매크로처럼 직접 실행합니다. 코드 안에서 셀 값을 쓰거나, 표를 만들거나, 서식을 바꾸는 작업에 자주 씁니다. 실행은 상단의 녹색 실행 버튼 또는 F5로 합니다.
Sub 연습()
End Sub
Function: 엑셀 함수처럼 사용
Function은 워크시트에서 =내함수(A1)처럼 호출할 수 있는 사용자 정의 함수(UDF)입니다. 매개변수를 받고 계산한 뒤 “값”을 돌려줍니다.
VBA에서 값을 돌려주는 방식은 return 키워드가 아니라 함수이름 = 값 형태를 씁니다.
Function 함수이름(매개변수)
함수이름 = 값
End Function
VBA 기본 문법: 자주 쓰는 것만 빠르게
변수 선언
VBA는 선언을 생략해도 돌아가긴 하지만, 실수가 잦아집니다. 특히 연구/업무 계산은 값이 틀리면 치명적이라 명시적으로 선언하는 습관이 훨씬 안전합니다.
Dim 변수이름
Dim 변수이름 As String
조건문
If 논리식 Then
ElseIf 논리식 Then
Else
End If
반복문
For 변수 = 초기화값 To 반복 마지막 값
Next 변수
Do While 조건식
Loop
Range와 Cells
Range는 “A1”, “A1:B2”, “$A$1:$N$3” 같은 범위를 다룰 때 편합니다.
Range.Row, Range.Column로 시작 행/열도 알 수 있습니다. 문자열 형태로도 많이 쓰다 보니 InStr, Mid 같은 문자열 함수로 가공하는 경우도 많습니다.
Cells(행, 열)는 특정 셀을 콕 집어서 다루기 좋습니다. 값 읽기/쓰기 모두 가능합니다.
Cells(행, 열)
Cells(Range.Row + 4, Range.Column + 2).Value
셀에 값 넣어보기: 가장 먼저 감 잡는 연습
예를 들어 아래처럼 쓰면 A1 셀에 숫자 123이 들어갑니다. VBA에서 Cells(1,1)은 1행 1열, 즉 A1입니다.
Cells(1,1)=123
문자는 큰따옴표로 감싸면 됩니다.
Cells(1,2)="엑셀"
변수는 이름만 쓰면 됩니다. 다만 변수에 값을 넣지 않으면 빈 값처럼 보일 수 있습니다.
Dim n
Cells(3,1)=n
먼저 값을 넣고 쓰면 기대한 결과가 나옵니다.
Dim n
n=1234
Cells(3,1)=n
연산: 사칙연산부터 삼각함수까지
사칙연산
- 더하기: +
- 빼기: -
- 나누기: /
- 곱하기: *
- 거듭제곱: ^
자주 쓰는 수학 함수
- 제곱근: Sqr() 또는 ^(1/2)
- 절댓값: Abs()
- 자연로그: Log()
- 상용로그: Log(3)/Log(10)
삼각함수
VBA의 Sin, Cos, Tan은 각도를 라디안으로 받습니다. 30도를 그대로 30으로 넣으면 각도 30°가 아니라 “라디안 30”으로 계산돼서 낯선 값이 나옵니다.
파이 값은 엑셀 내장함수로 가져올 수 있습니다.
WorksheetFunction.Pi()
매번 길게 쓰기 싫다면 변수에 넣어두고 쓰면 됩니다.
Dim pi
pi = WorksheetFunction.Pi()
그다음부터는 pi/6 같은 표현으로 30도를 만들 수 있습니다.
역삼각함수
Asin(), Acos(), Atan()을 쓸 수 있고, 결과도 라디안으로 나옵니다. 도(degree)로 보고 싶으면 180 / pi를 곱해주면 됩니다.
자연상수 e
자연상수 e는 Exp(1)로 얻습니다. Exp(x)는 e^x입니다.
반올림/올림/내림
반올림은 Round(수, 자리)로 끝나고, 올림/내림은 WorksheetFunction으로 가져다 쓰는 형태가 편합니다.
Round(수, 자리)
WorksheetFunction.RoundDown(수, 자리)
WorksheetFunction.RoundUp(수, 자리)
몫과 나머지
실무나 연구에서 “배수 판별, 인덱스 순환, 주기 처리”에 정말 자주 나옵니다.
- 몫: \
- 나머지: Mod
27/5
27\5
27 Mod 5
엑셀에서 “직접 만든 함수”를 제대로 쓰려면 꼭 챙길 것
매크로 파일 형식(.xlsm)으로 저장
VBA가 들어간 통합문서는 일반 .xlsx로 저장하면 코드가 날아갑니다. 작업을 시작할 때부터 .xlsm으로 저장해두는 게 마음 편합니다.
보안 설정 때문에 실행이 막히는 경우
회사/학교 PC는 매크로가 차단되어 있는 경우가 많습니다. 이때는 코드가 문제가 아니라 “환경”이 원인인 경우가 대부분이라, 파일을 신뢰 위치에 두거나 보안 정책을 확인해야 합니다.
계산이 무거워질 때 체감 차이
수식이 길어질수록 시트가 느려지고, 여기저기 붙어 있는 참조 때문에 수정도 어렵습니다. 반대로 엑셀 VBA 함수로 묶어두면 수식은 깔끔해지고, 계산 로직은 코드 한 곳에서 관리할 수 있어 유지보수성이 훨씬 좋아집니다.
실전 예제 범위를 받아 반복 계산 후 값 돌려주는 함수
아래 예제는 Range를 받아서 내부에서 반복 계산을 돌린 뒤, 최종 값을 반환하는 형태입니다. “수식으로는 너무 길어지는 계산”을 UDF로 옮길 때 자주 쓰는 패턴입니다.
Function 함수이름(매개변수) .. End Function
함수이름 = 값
구조만 익혀두면, 매개변수(숫자/문자/범위)를 바꿔가며 원하는 형태로 확장하기 쉽습니다. 특히 Range를 받으면 행/열 번호를 기반으로 다양한 계산을 만들 수 있습니다.
Range로 받은 범위의 위치 정보
Range.Column, Range.Row
Cells로 특정 셀 접근
Cells(행, 렬)
Cells(Range.Row + 4, Range.Column + 2).Value
자주 묻는 질문(FAQ)
Q. 엑셀에서 만든 VBA 함수는 셀에서 바로 쓸 수 있나요?
A. 네. Function으로 만든 사용자 정의 함수는 워크시트에서 =함수이름(A1)처럼 호출할 수 있습니다. 단, 통합문서는 .xlsm으로 저장되어 있어야 합니다.
Q. 변수 선언을 안 해도 되던데, 왜 Dim을 쓰나요?
A. 선언을 생략하면 오타나 타입 혼동이 생겼을 때 잡기가 어렵습니다. 계산 결과가 중요한 작업일수록 Dim으로 명확히 해두는 편이 안전합니다.
Q. Sin(30)을 넣었는데 원하는 값이 안 나옵니다.
A. VBA의 Sin/Cos/Tan은 각도를 라디안으로 받습니다. 30도를 넣으려면 pi/6 형태로 바꿔서 넣어야 합니다.
Q. Range를 매개변수로 받으면 뭐가 좋은가요?
A. 범위를 받아오면 단일 값이 아니라 표(다중 셀)를 대상으로 계산할 수 있어 활용 폭이 넓습니다. Range.Row/Range.Column로 위치를 얻어서 Cells로 옮겨 다니며 값을 읽고 쓸 수도 있습니다.
Q. VBA가 실행이 안 되고 막히는 경우가 많아요.
A. 코드 자체보다 보안 설정(매크로 차단)이 원인인 경우가 흔합니다. 특히 회사 PC는 정책으로 막아둔 경우가 많아서, 파일 저장 형식(.xlsm)과 보안 정책을 먼저 확인하는 편이 빠릅니다.
Q. 나머지(Mod)는 어디에 쓰나요?
A. 배수 판별, 반복 인덱스, 주기 계산에 많이 씁니다. 엑셀 수식에서도 자주 쓰지만, VBA로 옮기면 조건이 복잡해져도 코드가 깔끔하게 유지됩니다.
관련 글
'MS 오피스 설치 > 엑셀 Excel' 카테고리의 다른 글
| 워드·엑셀 네모 체크박스(V) 넣는 법: ✓ ✔ ☑ ☐ 특수문자부터 실제 체크박스까지 (0) | 2026.01.13 |
|---|---|
| 엑셀 키보드 입력 안됨 해결 한글 영어 타이핑 안될때 셀입력 막힘 VBA 오류까지 정리 (0) | 2025.12.18 |
| 셀 시트보호와 선택영역 잠금설정 안전하게 문서 관리하기 (0) | 2025.12.09 |