
LAMBDA · MAP · REDUCE · SCAN · BYROW · BYCOL · MAKEARRAY로 수식 자동화 끝! (반복 작업 1분 컷)
검수 고지: 이 글은 편집자가 Excel 365에서 직접 재현·검수했으며, 초안 정리에 AI 도구를 보조적으로 사용했습니다.
문법 & 핵심 개념
| 함수 | 형식 | 포인트 |
|---|---|---|
| LAMBDA | =LAMBDA(param1, param2, …, 계산식) | 이름 정의로 저장해 사용자 정의 함수처럼 사용 |
| MAP | =MAP(array1, [array2],…, LAMBDA(x,[y],…, 식)) | 각 원소에 함수 적용(스칼라/행렬) |
| REDUCE | =REDUCE(init, array, LAMBDA(acc, x, 식)) | 누적 집계 후 최종값 반환 |
| SCAN | =SCAN(init, array, LAMBDA(acc, x, 식)) | 누적 과정을 단계별로 스필 |
| BYROW/BYCOL | =BYROW(array, LAMBDA(r, 식)) / =BYCOL(array, LAMBDA(c, 식)) | 행/열 단위 연산 |
| MAKEARRAY | =MAKEARRAY(rows, cols, LAMBDA(r,c, 식)) | 행·열 위치에 따라 값 생성 |
LAMBDA로 “내 함수” 만들기
예: 안전한 나눗셈 함수
=LAMBDA(n,d, IF(d=0,"", n/d))
수식 탭 → 이름 관리자 → SAFE.DIVIDE로 저장하면, =SAFE.DIVIDE(A2,B2)처럼 사용 가능.
예: 텍스트 정리 함수(공백/대소문자)
=LAMBDA(t, PROPER(TRIM(SUBSTITUTE(t,CHAR(160)," "))))
MAP/REDUCE/SCAN — 함수형 처리
MAP: 가격에 부가세 일괄 반영
=MAP(Price, LAMBDA(p, ROUND(p*1.1,0)))
REDUCE: 조건부 합계(티어별 가중치)
=REDUCE(0, ROWS(Sales),
LAMBDA(acc, i,
LET(s, INDEX(Sales,i),
t, INDEX(Tier,i),
acc + s * XLOOKUP(t, {"A","B","C"}, {1,0.9,0.8}))))
SCAN: 누적 합계(러닝 토탈)
=SCAN(0, Sales, LAMBDA(acc, x, acc+x))
BYROW/BYCOL — 행/열 단위 계산
BYROW: 각 행에서 “키워드 포함 여부” 플래그
=BYROW(LOWER(Description),
LAMBDA(r, SUM(--ISNUMBER(SEARCH(TRANSPOSE({"delay","refund","defect"}), r)))>0 ))
BYCOL: 각 월 합계
=BYCOL(SalesTbl, LAMBDA(c, SUM(c)))
MAKEARRAY — 사용자 정의 배열 생성
달력 그리드(YYYY-MM)
=LET(d, DATE(2025,8,1),
days, SEQUENCE(DAY(EOMONTH(d,0))),
MAKEARRAY(6,7, LAMBDA(r,c, LET(x, INDEX(days,(r-1)*7+c), IFERROR(DATE(YEAR(d),MONTH(d),x),"")))))
가우시안 가중치 커널(3×3)
=MAKEARRAY(3,3, LAMBDA(r,c, CHOOSE({1,2,3},{1,2,1},{2,4,2},{1,2,1})[r,c]/16))
실무 패턴 12가지
① 표준화 함수(평균·표준편차)
=LAMBDA(x, rng, (x-AVERAGE(rng))/STDEV(rng))(Score, Score)
② MAP로 텍스트 포맷
=MAP(Email, LAMBDA(e, LOWER(TRIM(e))))
③ REDUCE로 “가중 평균”
=LET(n, ROWS(Val), REDUCE(0, SEQUENCE(n),
LAMBDA(acc, i, acc + INDEX(Val,i)*INDEX(Wt,i))) / SUM(Wt))
④ SCAN으로 KPI 신호 전환점 찾기
=LET(r, SCAN(0, Rate, LAMBDA(a,x, x-a)), XMATCH(TRUE, r<0))
⑤ BYROW로 행별 결측치 개수
=BYROW(Data, LAMBDA(r, SUM(--(r=""))))
⑥ BYCOL로 Z-점수 표
=BYCOL(Data, LAMBDA(c, (c-AVERAGE(c))/STDEV(c)))
⑦ MAKEARRAY로 인덱스 매트릭스
=MAKEARRAY(ROWS(Data), COLUMNS(Data), LAMBDA(r,c, r & "-" & c))
⑧ LAMBDA로 “안전한 VLOOKUP” 래퍼
=LAMBDA(key, kRange, vRange, IFERROR(XLOOKUP(key,kRange,vRange),"없음"))
⑨ MAP+TEXTAFTER: 이메일 도메인 추출
=MAP(Email, LAMBDA(e, TEXTAFTER(e,"@")))
⑩ REDUCE로 “Top-N 합”
=REDUCE(0, TAKE(SORT(Sales,-1), 10), LAMBDA(acc,x, acc+x))
⑪ SCAN으로 러닝 최대값
=SCAN(-1E9, Sales, LAMBDA(a,x, MAX(a,x)))
⑫ BYROW로 규칙 기반 라벨
=BYROW(HSTACK(Price, Stock), LAMBDA(r, IF(INDEX(r,1)>1000000, IF(INDEX(r,2)>0,"프리미엄","재고없음"),"일반")))
자주 하는 실수 & 체크
- 참조 크기 불일치 — MAP/BYROW/BYCOL 인수의 길이가 다르면 오류. 필요한 부분만 TAKE/CHOOSECOLS로 정렬.
- 과도한 재계산 — 큰 표는 LET로 중복 계산을 캐시, 필요 시 결과를 값으로 고정.
- 디버깅 어려움 — LAMBDA 내부를 임시로 일반 수식으로 풀어 중간 값을 확인.
- 이름 정의 누락 — LAMBDA는 이름 관리자에 저장해야 진짜 “내 함수”가 됨.
요약
| 목표 | 대표 공식 |
|---|---|
| 재사용 함수화 | LAMBDA(...) + 이름 정의 |
| 원소별 처리 | MAP(array, LAMBDA(x, …)) |
| 누적 집계/과정 | REDUCE / SCAN |
| 행/열 단위 | BYROW / BYCOL |
| 커스텀 그리드 | MAKEARRAY(rows, cols, LAMBDA(r,c,…)) |