- 최초 작성일: 2026-01-11
- 최종 수정일: 2026-01-11
- 조회수: 681 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 엑셀 SCAN 함수로 누적합계, 누적평균, 월별 누계 완벽 정리
들어가기 전에
데이터 분석의 기본 중 하나인 '누적 합계(Running Total)', 이제 더이상 단순한 SUM 수식에만 의존할 이유가 없습니다.
엑셀의 강력한 SCAN 함수를 사용하면 동적으로 누적 합계와 누적 평균을 구하고, 월이 바뀔 때마다 자동으로 초기화되도록 할 수 있습니다. 최신 버전이 없는 분들을 위해 사용자 지정 함수(UDF)로 동일한 기능을 구현하는 방법까지 정리했습니다(멤버십 회원용 VBA 코드).
엑셀 SCAN 함수로 누적합계, 누적평균, 월별 누계 완벽 정리
1. 누적이익 구하기
기존에 C열의 누적매출을 구하기 위해 일반 엑셀 범위에서는 IF와 ISNUMBER 함수를 중첩하여 아래와 같은 수식을 사용했습니다.
C4: =IF(ISNUMBER(C4),SUM($C$4:C4),"")
참고 영상:
최신 동적 배열 함수인 SCAN 함수를 사용해서 해결할 수 있습니다. F열에 '누적이익' 금액을 구해보겠습니다.
F4: =SCAN(0,E4:E33,LAMBDA(a,b,a+b))
SCAN 함수는 initial_value, array, function 이렇게 3개의 인수를 갖습니다.
- initial_value (초기값): 누적 합계의 시작점을 지정합니다. 0부터 시작하므로
0을 입력합니다. - array (배열): 누적 합계를 계산할 때 스캔할 범위를 지정합니다(
E4:E33). - function (함수): 배열을 스캔하기 위해 사용하는 '사용자 정의 함수(LAMBDA)'를 지정합니다.
LAMBDA(a,b,a+b) 수식의 의미는 다음과 같습니다.
a: 현재까지의 총합계 (accumulator)b: 현재 행의 수익 열 값a+b: 기존의a값에b를 계속 누적해서 더하라는 계산식입니다.
SCAN 함수를 사용하면 기존 데이터 구조가 변경되더라도(예: 중간에 행을 삽입하여 데이터를 추가하더라도) 기존 수식을 변경할 필요 없이 자동으로 업데이트된다는 강력한 장점이 있습니다.
2. 누적평균 구하기
단순한 누적 합계라면 기존 수식을 사용해도 큰 차이가 없을 수 있습니다. 이번에는 '누적평균'을 구해보겠습니다. 예를 들어 12/2일의 누적 평균은 1일과 2일 실적을 더해 2로 나누고, 12/3일은 1~3일 실적을 더해 3으로 나누는 방식입니다.
기존 방식 (SUM, ROW 활용)
H4: =SUM($C$4:C4)/(ROW(C4)-3)
SUM과 ROW 함수를 사용하여 직설적으로 표현한 수식입니다. 아래로 복사하면 결과는 구해지지만, 데이터 행만큼 수식을 복사해 넣어야 한다는 단점이 있습니다.
SCAN 함수 활용
I4: =SCAN(0,C4:C33,LAMBDA(a,b,a+b))/SEQUENCE(ROWS(C4:C33))
SCAN, LAMBDA, SEQUENCE, 그리고 ROWS 함수를 조합했습니다.
- SCAN: 앞서 사용한 방식과 동일하게 누적 합계를 계산합니다.
- SEQUENCE: 행 인덱스에 해당하는 1, 2, 3... 같은 숫자로 된 동적 리스트를 생성합니다. (예: 5번째 행이면 숫자 5 반환)
이 두 가지 결과값을 나누면 하나의 셀에 입력한 하나의 수식으로 누적평균이 한 번에 구해집니다.
3. 월별 누적매출 구하기 (월 변경 시 리셋)
일반적인 누적 매출은 아래와 같이 구하면 됩니다.
J4: =SCAN(0,C4:C33,LAMBDA(a,b,a+b))
하지만 데이터가 12월에서 1월로 넘어가는 경우처럼, 월이 바뀔 때 이전 누적값은 무시하고 새롭게 누적해야 할 필요가 있습니다. 기존 방식으로는 수동으로 수식을 끊어서 새로 작성해야 했습니다.
1월이 되면 리셋하는 수식
J4: =SCAN(0,SEQUENCE(ROWS(C4:C33)),
LAMBDA(a,i,IF(MONTH(INDEX(B4:B33,i))=1,
INDEX(C4:C33,i),a+INDEX(C4:C33,i)))
)
이 수식의 핵심 논리는 다음과 같습니다.
SCAN(0, SEQUENCE(ROWS(...)): 데이터 행 개수만큼(1~30) 번호표를 만들어 SCAN에 전달합니다. 이를 통해 '지금 몇 번째 행을 처리 중인지' 알 수 있습니다.a: 주머니에 모인 돈(누적값),i: 현재 처리 중인 번호표(행 번호)입니다.IF(MONTH(INDEX(B4:B33,i))=1 ...: INDEX 함수로 i번째 날짜를 확인하여 1월인지 조건 비교를 합니다.- 참(1월)이라면 기존 누적값(a)을 버리고 해당 월 매출로 리셋하고, 아니라면 기존 값(a)에 매출을 더해 계속 누적합니다.
하지만 이 수식은 완전하지 않습니다. 아래 수식을 사용하세요.
매월(월이 바뀔 때마다) 리셋하는 수식
만약 특정 월(1월)뿐만 아니라, 월이 바뀔 때마다 자동으로 값을 새로 누적하고 싶다면 아래 수식을 사용합니다.
=SCAN(0,SEQUENCE(ROWS(C4:C33)),LAMBDA(a,i,
IF(i=1,INDEX(C4:C33,i),
IF(MONTH(INDEX(B4:B33,i))<>MONTH(INDEX(B4:B33,i-1)),
INDEX(C4:C33,i),
a+INDEX(C4:C33,i)
)
))
)
이전 행(i-1)과 현재 행(i)의 월(Month)이 같은지 비교하여 리셋 여부를 결정하는 방식입니다.
4. 사용자 지정 함수(모든 엑셀 버전)
SCAN 함수는 강력하지만 Office 365 등 최신 버전에서만 사용할 수 있습니다. 이를 해결하기 위해 모든 엑셀 버전에서 사용 가능한 VBA 사용자 지정 함수를 준비했습니다.
SCAN 함수를 사용할 수 없는 분들을 위한
VBA 월별누적 사용자 지정 함수 코드와 상세 적용 방법은
[풀 버전] 영상 및 예제 파일에서 확인하실 수 있습니다.
자주 묻는 질문 (FAQ)
Q1. SCAN 함수는 어느 버전부터 사용할 수 있나요?
A. SCAN 함수는 Microsoft 365 (Office 365) 구독 버전 또는 Excel 2021 이상의 최신 버전에서 사용할 수 있습니다.
Q2. SCAN 함수를 쓸 수 없는 하위 버전에서는 어떻게 하나요?
A. VBA(매크로)를 사용하여 사용자 지정 함수를 만들면 동일한 기능을 구현할 수 있습니다. 본문 하단의 멤버십 전용 VBA 코드를 참고하세요.
Q3. 기존 SUM 함수 방식과 비교했을 때 장점은 무엇인가요?
A. 데이터가 추가되거나 중간에 삽입되어도 수식을 수정할 필요 없이 자동으로 배열이 확장되며, 복잡한 조건(월별 리셋 등)을 하나의 수식으로 처리할 수 있어 관리가 용이합니다.
마치며
누적 합계는 데이터의 흐름을 파악하는 데 중요한 지표입니다. 상황에 따라 SCAN 함수를 활용하거나, VBA 사용자 정의 함수를 활용하여 업무 효율을 높여보시기 바랍니다.
멤버십 회원이 되시면 강의에 사용된 예제 파일과 전체 코드를 다운로드하실 수 있습니다.