- 최초 작성일: 2002-07-19
- 최종 수정일: 2026-09-29
- 조회수: 25 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 순위 구하기 응용2
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
지난 두 강좌(X0275, X0276)를 통해 설명드린 순위 구하기는 잘 이해가 되시는지요? 이번 시간에는 순위를 구한 다음, 데이터를 정렬하지 않고도 몇 등이 누구인지 바로 찾아내는 방법을 살펴보겠습니다.
순위 구하기 응용2
핵심 요약: OFFSET과 MATCH로 순위별 이름 조회하기
순위를 구한 다음 각 순위별 이름을 확인하려면 보통 순위 기준으로 다시 정렬해야 합니다. OFFSET과 MATCH 함수를 조합하면 원본 데이터를 그대로 둔 채로도 순위별 이름을 바로 조회할 수 있습니다.
- 동점자 구분 순위: RANK+COUNTIF 조합으로 먼저 순위를 구합니다.
- MATCH: 원하는 순위가 순위 열의 몇 번째 위치인지 찾습니다.
- OFFSET: 그 위치만큼 이동해 이름 열의 값을 가져옵니다.
복습을 겸해서 잠시 살펴보면, 점수가 같을 경우 위에 있는 사람에게 우선 순위를 부여하기 위하여 아래와 같은 수식을 사용하였습니다(동점자가 있을 경우 가중치를 부여하는 방법에 대해서는 X0137 강좌를 참고하시기 바랍니다).
| 이름 | 득점 | 순위 |
|---|---|---|
| 김병지 | =INT(RAND()*100) | =RANK(C19,$C$19:$C$28)+COUNTIF($C$19:C19,C19)-1 |
| 안정환 | =INT(RAND()*100) | =RANK(C20,$C$19:$C$28)+COUNTIF($C$19:C20,C20)-1 |
| 박지성 | =INT(RAND()*100) | =RANK(C21,$C$19:$C$28)+COUNTIF($C$19:C21,C21)-1 |
| 김남일 | =INT(RAND()*100) | =RANK(C22,$C$19:$C$28)+COUNTIF($C$19:C22,C22)-1 |
| 이천수 | =INT(RAND()*100) | =RANK(C23,$C$19:$C$28)+COUNTIF($C$19:C23,C23)-1 |
| 차두리 | =INT(RAND()*100) | =RANK(C24,$C$19:$C$28)+COUNTIF($C$19:C24,C24)-1 |
| 히딩크 | =INT(RAND()*100) | =RANK(C25,$C$19:$C$28)+COUNTIF($C$19:C25,C25)-1 |
| 최진철 | =INT(RAND()*100) | =RANK(C26,$C$19:$C$28)+COUNTIF($C$19:C26,C26)-1 |
| 김태영 | =INT(RAND()*100) | =RANK(C27,$C$19:$C$28)+COUNTIF($C$19:C27,C27)-1 |
| 이운재 | =INT(RAND()*100) | =RANK(C28,$C$19:$C$28)+COUNTIF($C$19:C28,C28)-1 |
위의 표에서 각 순위별 이름을 보려면 순위를 먼저 구하고 다시 순위를 기준으로 오름차순 정렬을 해 주어야 합니다. 한마디로 좀 번거롭습니다. 데이터를 그대로 놓아둔 상태에서 순위/이름을 볼 수 있는 방법이 없을까요? 물론 있겠지요? 아래의 표를 보세요.
| 이름 | 득점 | 순위 | Rank | Name |
|---|---|---|---|---|
| 김병지 | =C19 | =RANK(C38,$C$38:$C$47)+COUNTIF($C$38:C38,C38)-1 | 1 | =OFFSET($B$38,MATCH(F38,$D$38:$D$47,0)-1,0) |
| 안정환 | =C20 | =RANK(C39,$C$38:$C$47)+COUNTIF($C$38:C39,C39)-1 | 2 | =OFFSET($B$38,MATCH(F39,$D$38:$D$47,0)-1,0) |
| (이하 동일한 패턴으로 순위 3~10까지 이어집니다) | ||||
위의 빨간 셀에는 이런 수식이 들어 있습니다.
=OFFSET($B$38,MATCH(F38,$D$38:$D$47,0)-1,0)
조금 복잡해 보이지요? 하지만 수식을 토막내어 맨 안쪽부터 분석해 나가면 어렵지 않을 것입니다. 우선, MATCH 함수를 사용하여 D38:D47 영역 중에서 F38 셀에 들어있는 값과 같은 값이 어디에 들어있는지를 파악합니다. 그런 다음 OFFSET 함수를 이용하여 B38 셀을 기준으로 하여 행/열 방향으로 지정한 위치만큼 떨어진 영역의 값을 끌어오는 것입니다.
위의 득점과 반대로 실점인 경우, 오름차순으로 배치를 하는 경우에도 순위를 구할 때는 조금 더 복잡해 보이는 수식을 사용합니다만, 순위별 이름을 구할 때에는 내림차순인 경우와 동일한 수식을 사용할 수 있습니다.
| 이름 | 실점 | 순위 | Rank | Name |
|---|---|---|---|---|
| 김병지 | =C38 | =COUNT($C$68:$C$77)-(RANK(C68,$C$68:$C$77)+COUNTIF($C$68:C68,C68)-2) | 1 | =OFFSET($B$68,MATCH(F68,$D$68:$D$77,0)-1,0) |
| (이하 동일한 패턴으로 순위 2~10까지 이어집니다) | ||||
많이 응용해 보시기 바랍니다.
정리 — OFFSET+MATCH로 순위별 이름 조회하기
| 단계 | 내용 |
|---|---|
| 1 | RANK+COUNTIF 조합으로 동점자를 구분한 순위 열을 만듭니다. |
| 2 | MATCH(찾는순위,순위열,0)로 순위 열에서 몇 번째 위치인지 찾습니다. |
| 3 | OFFSET(이름기준셀,위치-1,0)로 해당 위치의 이름을 가져옵니다. |
자주 묻는 질문 (FAQ)
Q1. 데이터를 정렬하지 않고 순위별 이름을 조회하려면 어떻게 하나요?
=OFFSET($B$38,MATCH(F38,$D$38:$D$47,0)-1,0) 처럼 MATCH 함수로 원하는 순위(F38)가 순위 열(D38:D47) 중 몇 번째 위치에 있는지 찾은 다음, OFFSET 함수로 이름 열의 기준 셀에서 그 위치만큼 이동한 값을 가져오면 데이터를 정렬하지 않고도 순위별 이름을 바로 조회할 수 있습니다.
Q2. MATCH(F38,$D$38:$D$47,0)의 마지막 인수 0은 무슨 의미인가요?
MATCH 함수의 세 번째 인수(match_type)를 0으로 지정하면 정확히 일치하는 값을 찾습니다. 순위처럼 이산적인 정수값을 찾을 때는 근사값이 아닌 정확한 일치가 필요하므로 반드시 0을 지정해야 합니다.
Q3. 오름차순 데이터(실점 등)에서도 같은 OFFSET+MATCH 수식을 쓸 수 있나요?
네. 순위를 구하는 수식 자체는 오름차순/내림차순에 따라 달라지지만, 순위 열을 참조해서 이름을 찾아오는 OFFSET+MATCH 수식의 구조는 동일하게 사용할 수 있습니다. 순위 값이 이미 계산되어 있다면 그 열을 그대로 MATCH의 대상으로 삼으면 됩니다.
마치며
OFFSET과 MATCH의 조합은 정렬을 거치지 않고도 원하는 값을 즉시 찾아내는 매우 강력한 패턴입니다. 순위표뿐 아니라 다양한 조회(lookup) 상황에 응용할 수 있으니 꼭 손에 익혀 두시기 바랍니다.