
엑셀 REDUCE · SCAN · MAP · MAKEARRAY — LAMBDA 헬퍼 4총사
환경: Excel 365(동적 배열 + LAMBDA) 기준. 초안 정리에 AI 도구를 보조적으로 활용했지만, 모든 수식은 직접 재현했습니다.
연계 가이드(내부 링크 7+)
1) 치트시트
// REDUCE([initial_value], array, LAMBDA(acc, current, 계산))
=REDUCE(0, A2:A100, LAMBDA(a,v, a+v))
// SCAN([initial], array, LAMBDA(acc, current, 계산))
=SCAN(0, A2:A10, LAMBDA(a,v, a+v)) // 러닝 합계
// MAP(array1, [array2], ..., LAMBDA(v1, v2, ..., 계산))
=MAP(Qty, Price, LAMBDA(q,p, q*p)) // 원소별 곱
// MAKEARRAY(rows, cols, LAMBDA(r,c, 계산))
=MAKEARRAY(6,7, LAMBDA(r,c, DATE(2025,8,0)+r*7+c))
TIP 표(Table)와 구조적 참조를 함께 쓰면 열 이동에도 안전합니다.
2) REDUCE — 누적·집계 레시피 7가지
// ① 조건부 합계(피벗 없이)
=REDUCE(0, SalesTbl[Amount],
LAMBDA(a,v, a + IF(INDEX(SalesTbl[Region], XMATCH(v, SalesTbl[Amount]))="Seoul", v, 0)))
/* ② 텍스트 이어붙이기(쉼표 구분) */
=LET(arr, FILTER(Items, Qty>=10),
REDUCE("", arr, LAMBDA(a,v, IF(a="", v, a&", "&v))))
// ③ VSTACK 누적(여러 표를 한 번에 아래로)
=REDUCE(TAKE(T1,1), {T1,T2,T3}, LAMBDA(a,t, VSTACK(a, DROP(t,1))))
// ④ 고유 항목 + 개수(딕셔너리 느낌)
=LET(u, UNIQUE(Items),
HSTACK(u, MAP(u, LAMBDA(x, COUNTIF(Items, x)))))
/* ⑤ 날짜별 누적 최대(최고 실적 갱신 지점 수) */
=LET(s, SalesTbl[Amount], r, SalesTbl[Date],
BYROW(SCAN(-1,s,LAMBDA(a,v, MAX(a,v))), LAMBDA(x, 1)))
// ⑥ 다중 조건 점수 누적
=REDUCE(0, ScoreTbl[Rule],
LAMBDA(a,row, a + IF(XLOOKUP([@Key], Rule[Key], Rule[Pts],0)>0, XLOOKUP([@Key], Rule[Key], Rule[Pts]), 0)))
// ⑦ NA 제외 평균(직접 누적)
=LET(s, FILTER(A2:A, A2:A<>""), REDUCE(0, s, LAMBDA(a,v, a+v))/ROWS(s))
3) SCAN — 러닝 값·단계별 결과 7가지
// ① 러닝 합계
=SCAN(0, SalesTbl[Amount], LAMBDA(a,v, a+v))
// ② 러닝 최대/최소
=SCAN(-1E99, SalesTbl[Amount], LAMBDA(a,v, MAX(a,v)))
=SCAN(1E99, SalesTbl[Amount], LAMBDA(a,v, MIN(a,v)))
// ③ 이동평균(n=7)
=LET(n,7, SCAN(0, A2:A100, LAMBDA(a,v, (a*(n-1)+v)/n)))
// ④ 목표 도달 시점(처음 TRUE)
=XMATCH(TRUE, SCAN(0, A2:A, LAMBDA(a,v, a+v))>=100000)
// ⑤ 러닝 고유 개수
=SCAN(0, A2:A, LAMBDA(a,v, ROWS(UNIQUE(TAKE(A2:A, ROWS(A2:v))))))
// ⑥ 재고 러닝 밸런스(입출고 +/−)
=SCAN(0, Movements[Qty], LAMBDA(a,v, a+v))
// ⑦ 누적 비율(파레토)
=LET(t,SUM(A2:A), SCAN(0, SORT(A2:A,-1), LAMBDA(a,v, (a+v)/t)))
4) MAP — 원소 대응 변환 7가지
// ① 단가×수량 = 금액
=MAP(Orders[Qty], Orders[Price], LAMBDA(q,p, q*p))
// ② 조건부 라벨링
=MAP(SalesTbl[Amount], LAMBDA(v, IF(v>=100000,"A","B")))
// ③ 여러 배열 동시 변환(부가세 포함가)
=MAP(Net, VAT, LAMBDA(n,vat, n*(1+vat)))
// ④ 텍스트 정규화(공백·대소문자)
=MAP(A2:A, LAMBDA(t, PROPER(TRIM(SUBSTITUTE(t,CHAR(160)," ")))))
/* ⑤ URL에서 도메인 추출 */
=MAP(URLs, LAMBDA(u, TEXTAFTER(TEXTBEFORE(u,"/",3),"//")))
// ⑥ 가격 서식 붙이기
=MAP(Prices, LAMBDA(p, TEXT(p,"#,##0")))
// ⑦ 오류 친화 표시
=MAP(Result, LAMBDA(x, IFERROR(x,"-")))
5) MAKEARRAY — 계산형 배열 생성 7가지
// ① 월간 달력(행=주, 열=요일)
=MAKEARRAY(6,7, LAMBDA(r,c, DATE(2025,8,1) - WEEKDAY(DATE(2025,8,1),2) + (r-1)*7 + c))
// ② 구구단 표
=MAKEARRAY(9,9, LAMBDA(r,c, r*c))
// ③ 좌표열(열 인덱스 표시)
=MAKEARRAY(1, COLUMNS(A2:Z2), LAMBDA(r,c, c))
// ④ 난수 매트릭스(0~1)
=MAKEARRAY(10,5, LAMBDA(r,c, RAND()))
// ⑤ 조건 마스크(임계값 이상=1)
=MAKEARRAY(ROWS(A2:A10),1, LAMBDA(r,c, --(INDEX(A2:A10,r)>=B1)))
// ⑥ 열 이름 복제 행렬
=MAKEARRAY(ROWS(A2:A6), COLUMNS(A1:F1), LAMBDA(r,c, INDEX(A1:F1,c)))
// ⑦ 커스텀 인덱스(매주 월요일)
=MAKEARRAY(10,1, LAMBDA(r,c, TEXT(TODAY()+7*(r-1),"yyyy-mm-dd")))
6) 오류·성능 체크리스트
- #SPILL! — 스필 범위의 값/병합/도형 제거
- 표와 결합:
SalesTbl[Amount]처럼 구조적 참조 사용 - 대용량: 불필요한 중간 스필은 LET로 변수화, MAP/SCAN 내부에서 계산 최소화
- 오류:
IFERROR로 사용자 친화 메시지 제공
다음 글로 VSTACK/HSTACK 또는 검색형 드롭다운과 결합해 자동화 파이프라인을 완성하세요.