#2 엑셀 오류 가이드

엑셀 RANK 함수 동점자 처리 오류 해결 가이드

이세계의엑셀 2025. 4. 17. 21:37
반응형

엑셀 RANK 함수 동점자 처리 오류를 겪고 있다면, 이 가이드는 원인부터 다양한 공식·VBA 해결책까지 한눈에 정리해 드린다. (RANK 함수, COUNTIF, RANK.EQ, RANK.AVG, VBA 모두 포함)


실무에서 점수나 매출 실적 순위를 매길 때 엑셀 RANK 함수 동점자 처리 문제로 결과가 엉켜 보고서가 오류로 가득 찼던 경험이 한두 번씩은 있을 것이다. 엑셀 RANK 함수 동점자 처리를 잘못 하면 순위가 중복되거나 뒷순위가 사라져 데이터 분석 전체가 틀어질 수 있다. 이번 글에서는 발생 원인을 짚어 본 뒤 실전에서 즉시 쓸 수 있는 세 가지 공식 패턴과 한 개의 VBA 루틴까지 제시한다. 각 방법은 장단점·적용 팁을 함께 소개하니 작업 환경에 맞춰 선택해 보자.

동점자 처리 오류가 발생하는 이유

RANK(또는 RANK.EQ) 함수는 같은 값을 만나면 공동 순위를 부여한 뒤 다음 순위를 건너뛰는 정렬 방식(1224···)을 택한다. 업무 특성상 “연속 순위(1234···)”가 필요하거나 각 사람에게 고유 등수를 주어야 할 때 동점자 처리 오류가 문제가 된다.

구분 기본 RANK 결과 요구되는 결과(연속)
점수 95 1
  95 1
  90 3
  88 4

위 표처럼 95점 동점이 1·1위로 잡히면 90점이 3위가 되어 연속성이 깨진다.
다음과 같은 상황에서 특히 문제가 심하다.

  • 입사 성적: 전체 합격자에게 고유 등수를 부여해야 할 때
  • 스포츠 대회: 포인트 랭킹이 연속 숫자로 발표돼야 할 때
  • 영업 실적 대시보드: 시각화 차트 축에서 중복 순위가 겹쳐 레이블 위치가 틀어질 때
반응형

해결 방법 1: COUNTIF 보정 공식

=RANK(E2,$E$2:$E$11,0)+COUNTIF($E$2:E2,E2)-1

  1. RANK로 기본 순위를 먼저 계산한다.
  2. COUNTIF로 같은 값이 이미 몇 번 나왔는지 세어 직전 행까지의 동점 횟수를 추가한다.
  3. -1로 첫 동점 행은 보정값 0을 만들어 원 순위를 유지한다.
' 동점자 순위 연속 보정 (VBA 사용자 정의 함수)
Function RankSerial(scoreRange As Range, targetCell As Range) As Long
    Dim baseRank As Long
    Dim tiesBefore As Long

    baseRank = WorksheetFunction.Rank(targetCell.Value, scoreRange, 0)
    tiesBefore = WorksheetFunction.CountIf(scoreRange.Resize(targetCell.Row - scoreRange.Row + 1, 1), targetCell.Value) - 1

    RankSerial = baseRank + tiesBefore
End Function

장점 – 수식 한 줄로 끝나 구조가 간단하다.
단점 – 데이터 행 추가·삭제 시 부분 범위 누락을 주의해야 한다.

해결 방법 2: RANK.AVG와 정렬 열 추가

RANK.AVG는 동점자에 평균 순위를 부여하므로 추가 보정 열로 소수 점 순위를 DAX 또는 피벗에서 정렬 키로 활용할 수 있다.

  1. 평균 순위: =RANK.AVG(E2,$E$2:$E$11,0)
  2. 가중치 보정: 동점 내부를 시간·ID 같은 고유 값으로 다시 정렬
  3. 정렬 기준: 평균 순위 → ID 형태로 멀티 정렬 후 INDEX 열에 1부터 재번호 부여
' RANK.AVG 이후 정렬 열 기반으로 1~N 재순번
Sub SerialRankAfterAvg()
    With ActiveSheet
        Dim lastRow As Long: lastRow = .Cells(.Rows.Count, "E").End(xlUp).Row
        .Range("G2").Formula = "=ROW()-1"   ' ID 열
        .Range("H2").Formula = "=RANK.AVG(E2,$E$2:$E$" & lastRow & ",0)"
        .Range("A1").CurrentRegion.Sort Key1:=.Range("H2"), Order1:=xlAscending, _
                                        Key2:=.Range("G2"), Order2:=xlAscending, Header:=xlYes
        .Range("I2").Formula = "=ROW()-1"   ' 연속 순번 열
    End With
End Sub

장점 – 대량 데이터에서 빠른 정렬 성과를 낸다.
단점 – VLOOKUP·XLOOKUP 참조 열까지 변경되면 연계 수식 수정이 필요.

해결 방법 3: 고유 식별자 열 병합

데이터에 이미 “사번·학생번호·거래ID” 같은 식별자가 있다면 아래 방식을 추천한다.

=RANK(E2,$E$2:$E$11,0) + 
  (COUNTIFS($E$2:$E$11,E2,$A$2:$A$11,"<"&A2))

여기서 $A$2:$A$11은 고유 ID 열이다. 같은 점수 내에서 ID가 작을수록 순위가 앞선다. 추가 열이 필요 없어 테이블 구조가 깔끔하다.

체크리스트 

  • 동점 기준 열(점수)과 보조 열(ID)이 모두 숫자인지 확인
  • 테이블 서식 영역 전체를 참조해 행 추가 시 범위가 자동 늘어나게 설정
  • 조건부 서식을 활용해 순위 변동이 생기면 시각적으로 표시

VBA 전용 선형 랭킹 모듈 

정확한 연속 등수를 VBA로 한 번에 완성하려면 다음 모듈을 통째로 붙여 넣으면 된다.

Option Explicit
'—————————————
' SerialRankModule.bas
'—————————————
Sub ApplySerialRank()
    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim rngScore As Range
    Set rngScore = ws.Range("E2", ws.Cells(ws.Rows.Count, "E").End(xlUp))

    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim i As Long, score As Variant

    ' 값별 등장 횟수 초기화
    For Each score In rngScore.Value
        If Not dict.exists(score) Then dict(score) = 0
    Next

    ' 연속 순위 산출
    For i = 1 To rngScore.Rows.Count
        score = rngScore(i, 1).Value
        dict(score) = dict(score) + 1
        ws.Cells(rngScore.Row + i - 1, "F").Value = _
            WorksheetFunction.Rank(score, rngScore, 0) + dict(score) - 1
    Next
End Sub
  • 열 E: 점수
  • 열 F: 연속 순위 결과
  • 점수 값이 텍스트로 들어갔다면 Val()로 숫자형 변환 추가

추가 팁 및 자동화 전략

  • 동적 이름 범위를 정의해 피벗 테이블·차트 업데이트를 한 방에 끝내기
  • Power Query 단계에서 중복 값 그룹화 → 인덱스 열 추가 → 원본에 병합하면 수식 없이 연속 순위를 반영할 수 있다.
  • 보고서 주기가 짧다면 VBA 자동 실행을 Workbook_Open 이벤트에 걸어두어 파일을 열자마자 순위를 재계산하도록 세팅
  • 공동 1위 가산점을 주거나 페널티를 부여하는 경우 RANK.EQ 결과를 기준으로 가중치 계산 열을 추가하면 가독성이 높아진다.

정리 및 실전 적용 포인트

오늘 살펴본 세 가지 공식과 VBA 모듈만 잘 활용해도 보고서마다 반복되는 엑셀 RANK 함수 동점자 처리 오류는 더 이상 발생하지 않는다. 현장에서 가장 중요한 것은 데이터 특성과 업무 요구사항에 맞는 방법을 선택해 유지 보수를 쉽게 만드는 것이다. 작은 테이블에는 COUNTIF 보정을, 대규모 데이터 파이프라인에는 Power Query 또는 VBA를 도입해 효율을 최적화해 보자. 엑셀 RANK 함수 동점자 처리 한 번에 끝내고 보고서 품질 지수를 한 단계 올려 보길 바란다.

반응형