엑셀 REDUCE · SCAN · MAP · MAKEARRAY — LAMBDA 헬퍼 완전 가이드

엑셀 REDUCE·SCAN·MAP·MAKEARRAY — 러닝합·원소변환·달력생성·집계 요약, 실물에 가까운 꽁이가 노트북을 가리키는 썸네일
엑셀 REDUCE · SCAN · MAP · MAKEARRAY — LAMBDA 헬퍼 완전 가이드

엑셀 REDUCE · SCAN · MAP · MAKEARRAY — LAMBDA 헬퍼 4총사

환경: Excel 365(동적 배열 + LAMBDA) 기준. 초안 정리에 AI 도구를 보조적으로 활용했지만, 모든 수식은 직접 재현했습니다.

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 또는 검색형 드롭다운과 결합해 자동화 파이프라인을 완성하세요.


Leave a Reply

Your email address will not be published. Required fields are marked *