- 최초 작성일: 2005-09-14
- 최종 수정일: 2026-09-30
- 조회수: 7 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 조건이 있는 n열마다 합계 구하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
질문 하나
안녕하세요.
제목대로 2열 걸러 한 열씩의 합을 구하는건데요. 그 앞 열의 조건에 따라 틀려집니다. 예제를 올렸으니 도와주시면 감사하겠습니다.
조건이 있는 n열마다 합계 구하기
핵심 요약: 조건부 n열 합계 사용자 정의 함수
일정한 간격으로 반복되는 열에서 조건에 맞는 값만 더해야 할 때, 내장 함수로 복잡하게 풀기보다 사용자 정의 함수를 만들면 훨씬 간단하고 효율적입니다.
- 1단계: 조건 셀(rngX)과 검색 범위(rngXXX)를 인수로 받는 Function을 만듭니다.
- 2단계: 범위의 각 셀이 조건 셀과 같으면 바로 오른쪽 셀 값을 더합니다.
- 3단계: 합계를 함수 이름에 대입해 결과로 돌려줍니다.
Step 1: 어떤 질문이었을까요?
먼 소린지 말로는 상황 파악이 안되시지요? 그러실줄 알고 준비했습니다. 다음 버튼을 누르세요!
잘 보고 오셨나요? 이제 질문하신 분이 무엇을 하고 싶다는 것인지 이해가 되시리라 믿습니다.
Stage 시트에는 A형, B형 등의 종류를 나타내는 머리글이 B1, C1 셀에 있고, 오른쪽 D2:U2 영역에 '날짜, 종류, 개수' 세 칸이 한 묶음으로 반복해서 입력되어 있습니다. 예를 들어 종류가 A형인 개수를 모두 더하면 12, B형은 21이 되어야 합니다.
단순히 일정 열마다 합계를 구하는 경우라면 그냥 배열 수식을 사용하면 되겠습니다만, 이와 같이 n열마다 합계를 구하되 조건이 추가적으로 부과되는 경우라면 머리가 아파옵니다.
여러 가지 함수를 사용하여 갖은 기교를 다 부리면 어떻게 될 법도 합니다만, 그것보다는 이런 경우, 사용자 정의 함수를 만들어 사용하면 훨~씬 효율적입니다.
Stage 시트의 B2 셀에는 다음과 같은 수식이 입력되어 있습니다.
=mysum(B1,D2:U2)
'어라? 그냥 Sum도 아니고 앞에 my가 붙은 걸 보니… 나만을 위한 Sum 함수라는 뜻인가?'
하시겠지요. 맞습니다! 그런 의미로 이름붙인 사용자 정의 함수입니다.
Step 2: 코드 살펴보기
함수의 내용을 살펴보면 다음과 같습니다. 허탈할 정도로 간단하군요.
Function MySum(rngX As Range, rngXXX As Range) As Long
Dim rngCell As Range
Dim lngSum As Long
For Each rngCell In rngXXX
If rngCell = rngX Then
lngSum = lngSum + rngCell.Offset(0, 1)
End If
Next rngCell
MySum = lngSum
End Function
rngX는 B1 셀, rngXXX는 각 날짜별 종류(A, B, C)와 개수 데이터가 들어있는 영역을 지정한 다음, rngXXX의 각 셀을 순차적으로 돌면서 rngX, 즉 B1 셀에 입력된 값이 같은지를 비교하여, 같은 경우에만 그 옆셀(rngCell.Offset(0,1) 셀에 입력된 값을 계속 더한 다음 MySum 함수의 결과값으로 되돌려주는 사용자 정의 함수입니다.
오늘 설명드린 내용은 VBA에 입문하신 분들을 위한 것이라 할 수 있겠습니다. 문제에 대한 접근 방법 및 사용자 정의 함수의 기본적인 사용 패턴(위 코드 상자 안에 들어있는 내용)을 완전히 내 것으로 만드시기 바랍니다.
오늘은 짧게 여기까지…
정리 — MySum 함수 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 함수 선언 | Function MySum(rngX, rngXXX) | 조건 셀과 검색 범위를 인수로 받음 |
| 범위 순환 | For Each rngCell In rngXXX | 검색 범위의 모든 셀 확인 |
| 조건 비교 | If rngCell = rngX | 종류가 같은 셀만 선택 |
| 합계 누적 | lngSum + rngCell.Offset(0, 1) | 바로 옆의 개수를 더함 |
| 결과 반환 | MySum = lngSum | 합계를 함수 결과로 돌려줌 |
자주 묻는 질문 (FAQ)
Q1. 단순히 n열마다 합계를 구하는 경우에는 어떻게 하나요?
조건이 없이 일정한 열마다 합계만 구한다면 배열 수식으로 해결할 수 있습니다. 이번 강좌처럼 조건이 추가되면 수식이 복잡해지므로 사용자 정의 함수가 더 편리합니다.
Q2. 사용자 정의 함수는 어디에 만들어야 하나요?
VB Editor에서 일반 모듈을 삽입하고 Function 프로시저로 작성합니다. 그러면 워크시트에서 =MySum(B1,D2:U2)처럼 내장 함수와 똑같이 사용할 수 있습니다.
Q3. 함수 이름 앞에 My를 붙인 이유는 무엇인가요?
엑셀의 내장 함수 Sum과 구분하기 위해 '나만을 위한 Sum 함수'라는 뜻으로 붙인 이름입니다. 사용자 정의 함수 이름은 내장 함수와 겹치지 않게 짓는 것이 좋습니다.
마치며
문제에 대한 접근 방법과 사용자 정의 함수의 기본 패턴을 완전히 내 것으로 만들어 두면 다양한 상황에 응용할 수 있습니다.