
엑셀 성적 관리 자동화 — 가중치·커브·낮은 점수 N개 제외·백분위·등수·리포트
환경: Excel 365/2019. 글의 구조화는 AI 보조로 정리했지만 모든 수식은 직접 재현해 검증했습니다.
연계 가이드(내부 링크 7+)
1) 가중치 성적 — SUMPRODUCT가 정답
표 이름 GradesTbl, 가중치 범위 Weights[Mid],[Final],[Quiz],[Assign],[Attend] 가 있다고 가정.
/* 원점수 합산 (퀴즈/과제는 별도 합계 열을 사용) */
=LET(
mid, [@Mid],
final, [@Final],
quiz, [@QuizTotal], /* 섹션 2에서 계산 */
assign,[@AssignTotal], /* 섹션 2에서 계산 */
attend,[@Attend],
SUMPRODUCT( {mid,final,quiz,assign,attend},
{Weights[Mid],Weights[Final],Weights[Quiz],Weights[Assign],Weights[Attend]} ) )
TIP
가중치 합계가 1(또는 100%)인지=ABS(SUM(Weights)-1)<1E-9로 검증 열을 두면 오류를 막을 수 있어.
2) 낮은 점수 N개 제외 — 퀴즈/과제
퀴즈 6개 중 낮은 점수 2개 제외하고 합산하는 행 단위 수식:
=LET(
q, HSTACK([@Quiz1],[@Quiz2],[@Quiz3],[@Quiz4],[@Quiz5],[@Quiz6]),
SUM(q) - SUM(SMALL(q, SEQUENCE(2))) )
과제 4개 중 최하 1개 제외:
=LET(a, HSTACK([@Assign1],[@Assign2],[@Assign3],[@Assign4]),
SUM(a) - SMALL(a,1))
3) 커브(곡선) 보정 — 목표 평균·표준편차로 변환
목표 평균을 75점, 목표 표준편차를 10점으로 맞추고 싶다면:
=LET(
x, [@RawTotal],
m, AVERAGE(GradesTbl[RawTotal]),
s, STDEV.S(GradesTbl[RawTotal]),
75 + (x - m)/s * 10 )
상한/하한(0~100) 자르기
=MIN(100, MAX(0, 보정수식 ))
4) 백분위·등수(동점 안정)
/* 백분위(0~1) → 0~100은 ×100 */
=PERCENTRANK.INC(GradesTbl[FinalWeighted], [@FinalWeighted])
/* 동점 안정 등수: 점수 내림차순, 이름 오름차순으로 안정 정렬 후 위치 */
=LET(
s, SORTBY(CHOOSECOLS(GradesTbl, XMATCH("Name", GradesTbl[#Headers]), XMATCH("FinalWeighted", GradesTbl[#Headers])),
GradesTbl[FinalWeighted], -1, GradesTbl[Name], 1),
XMATCH([@Name], TAKE(s,,1)) )
5) 과락/패스·페일·A~F 매핑
/* 과락(예: 중간·기말 각 40점 미만이면 F) */
=IF( OR([@Mid]<40, [@Final]<40), "F", "" )
/* 패스/페일 */
=IF([@FinalWeighted]>=60, "PASS", "FAIL")
/* A~F(가감+/-는 선택) */
=LET(s,[email protected],
SWITCH(TRUE, s>=90,"A", s>=80,"B", s>=70,"C", s>=60,"D","F"))
6) 분포 히스토그램·스파크라인
/* 구간 경계(50,60,70,80,90,100) */
=SEQUENCE(6,1,50,10)
/* 빈도 */
=FREQUENCY(GradesTbl[FinalWeighted], 구간)
/* 스파크라인(학생별 추이) */
=SPARKLINE(HSTACK([@Quiz1]:[@Quiz6], [@Mid], [@Final]))
7) 학생별 리포트 자동 생성(피벗 없이)
/* 특정 학생 이름이 B1일 때 요약 행 */
=FILTER(GradesTbl, GradesTbl[Name]=B1)
/* 학생 목록과 함께 요약표 생성 */
=LET(u, UNIQUE(GradesTbl[Name]),
MAP(u, LAMBDA(nm, HSTACK(nm,
XMATCH(nm, GradesTbl[Name]), /* 인덱스 */
AVERAGE(FILTER(GradesTbl[FinalWeighted], GradesTbl[Name]=nm)),
PERCENTRANK.INC(GradesTbl[FinalWeighted],
AVERAGE(FILTER(GradesTbl[FinalWeighted], GradesTbl[Name]=nm)) ) ))) )
메일 머지는 Word/Outlook과 연동하거나, HYPERLINK("mailto:"&Email, "Send")를 이용해 클릭 발송도 가능.
8) 데이터 유효성·에러 방지 체크리스트
- 점수 입력 범위 제한: 데이터 유효성
0~100 - 결시/결측은
IFERROR로 0 또는 공백 처리 - 가중치 합계=1 검사 열(조건부 서식으로 빨간 표시)
- 표(Table)+구조적 참조로 열 이동에도 안전
- 성능:
LET으로 중간 계산 캐시, 대형 표는 불필요한 스필 제거