- 최초 작성일: 2009-10-19
- 최종 수정일: 2026-09-24
- 조회수: 25 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 수석과 꼴등 모두 표시하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
질문 하나
…(중략)… 다음과 같은 데이터에서 최고 점수를 받은 사람과 최저 점수를 받은 사람을 표시하려고 합니다. Max나 Min 함수를 사용하면 될 것 같지만 점수가 같은 사람이 있을 때에는 잘 안됩니다. 주변에 물어봐도 다들 모르겠다고 하고… 어떻게 해야죠?
| 이름 | 점수 |
|---|---|
| 이순신 | 85 |
| 강감찬 | 100 |
| 을지문덕 | 90 |
| 홍길동 | 100 |
| 권율 | 85 |
| 유비 | 95 |
| 관우 | 70 |
| 장비 | 60 |
| 여포 | 60 |
| 조조 | 100 |
이 정도 데이터라면야... 눈으로 대충 보고 해결할 수 있겠습니다만, 자료가 많아지면 한계가 있습니다. 예제 데이터를 먼저 만들어보죠. 아래 버튼을 클릭하세요.
수석과 꼴등 모두 표시하기
핵심 요약: INDEX·SMALL·IF 배열 수식으로 동점자 모두 찾기
MAX/MIN은 동점자가 있어도 값 하나만 보여주지만, INDEX+SMALL+IF 배열 수식을 아래로 복사하면 동점자 전원의 이름을 순서대로 나열할 수 있습니다.
- 공동 수석: INDEX+SMALL+IF(MAX(범위)=범위, ...) 배열 수식(Ctrl+Shift+Enter)
- 공동 꼴등: 같은 수식에서 MAX만 MIN으로 교체
- 점수 표시: 찾은 이름으로 VLOOKUP
- 오류 숨기기: 더 이상 동점자가 없는 칸의 #VALUE!는 조건부 서식으로 감춤
이 정도 데이터만 되더라도 눈으로 보고 해결하기란 쉽지가 않습니다. 데이터 정렬 기능을 이용하여 처리할 수 있긴 합니다만 원본 데이터 형태가 흐트러진다는 문제가 있습니다. 만약 데이터 형태를 그대로 둔 상태에서 처리해야 한다면 어떻게 해야 할까요?
100명의 이름과 점수를 무작위로 생성한 예제 데이터(Workplace 시트)를 대상으로, 공동 수석과 공동 꼴등을 모두 찾아 나열한 결과는 다음과 같은 모습이 됩니다(점수가 무작위로 생성되므로 실행할 때마다 동석자 수가 달라집니다).
| 공동 수석 | 공동 꼴등 | ||
|---|---|---|---|
| 이름 | 점수 | 이름 | 점수 |
| HESDK | 79 | UHLNC | 0 |
| EMNOV | 79 | ||
(더 이상 동점자가 없는 나머지 칸은 수식 결과가 #VALUE! 오류로 나오는데, '조건부 서식'을 이용해 화면에는 보이지 않도록 처리했습니다.)
오래간만에 배열 수식을 사용해 봅니다.
공동 수석의 이름을 알아내기 위해서 아래와 같은 수식을 사용하였습니다. B40:B49 영역을 범위로 지정한 다음 이 수식을 입력하고 <Ctrl+Shift+Enter>를 함께 눌러 마무리 합니다.
=INDEX(Workplace!$A$2:$A$101,SMALL(IF(MAX(Workplace!$B$2:$B$101)=Workplace!$B$2:$B$101,ROW(Workplace!$B$2:$B$101)-1,""),ROW()-A40))
공동 꼴등의 이름을 알아내기 위해서는 또 이런 수식을 사용했습니다. 다 똑같고 Max를 Min으로 바꿔 주었습니다. 역시나 D40:D49 영역을 범위로 지정한 다음, <Ctrl+Shift+Enter>를 함께 눌러주어야 합니다.
=INDEX(Workplace!$A$2:$A$101,SMALL(IF(MIN(Workplace!$B$2:$B$101)=Workplace!$B$2:$B$101,ROW(Workplace!$B$2:$B$101)-1,""),ROW()-A40))
점수의 경우에는 Vlookup 함수를 사용하였으므로 별도 설명은 생략합니다.
배열 수식에서 해당 값이 없을 때 생기는 오류 메시지를 처리하기 위해서 '조건부 서식'을 적용했습니다.
참, 예제 데이터를 만들기 위해 사용된 코드는 다음과 같습니다.
Sub MakeTable()
Dim intRow As Integer
Dim wrkSheet As Worksheet
Set wrkSheet = Worksheets("Workplace")
wrkSheet.Select
With wrkSheet
.Range("A1:B1") = Array("이름", "점수")
For intRow = 1 To 100
With .Range("A1")
.Offset(intRow, 0) = RandomName(3)
.Offset(intRow, 1) = Int(Rnd * 100)
End With
Next intRow
End With
MsgBox "예제 테이블을 다 만들었습니다. 순식간에... 그죠?", , "아이엑셀러 닷컴"
Application.Goto Sheets("Preface").Range("A30"), True
End Sub
코드의 내용은 그냥 참고만 하세요. 관심있는 분들만…
다음 시간에…
정리 — 동점자 모두 찾기 배열 수식
| 목적 | 수식 |
|---|---|
| 공동 수석 이름 | =INDEX($A$2:$A$101,SMALL(IF(MAX($B$2:$B$101)=$B$2:$B$101,ROW($B$2:$B$101)-1,""),ROW()-기준행)) (배열 수식) |
| 공동 꼴등 이름 | 위 수식에서 MAX를 MIN으로 교체 (배열 수식) |
| 해당 점수 | VLOOKUP으로 찾은 이름의 점수 조회 |
자주 묻는 질문 (FAQ)
Q1. MAX나 MIN 함수로는 왜 동점자를 모두 찾을 수 없나요?
MAX와 MIN은 범위에서 가장 크거나 작은 '값' 하나만 반환할 뿐, 그 값을 가진 사람이 몇 명인지, 누구인지는 알려주지 않습니다. 동점자가 여러 명이면 그중 이름을 알아내는 별도의 방법이 필요합니다.
Q2. INDEX·SMALL·IF를 조합한 배열 수식은 어떻게 작동하나요?
IF(MAX(범위)=범위, ROW(범위)-오프셋, "")로 최고점과 값이 같은 행 번호들만 골라내고, SMALL로 그중 n번째로 작은 행 번호를 구한 뒤, INDEX로 그 행의 이름을 가져옵니다. 수식을 아래로 복사하면 n이 1, 2, 3…으로 늘어나면서 동점자를 순서대로 모두 나열하게 됩니다.
Q3. 동점자가 없는 칸에 나타나는 #VALUE! 오류는 어떻게 처리하나요?
동점자 수보다 아래쪽 행에서는 더 가져올 이름이 없어 수식이 #VALUE! 오류를 반환합니다. 이 오류 자체를 없애기보다는, '조건부 서식'을 이용해 오류가 난 셀의 글자색을 배경색과 같게 만들어 화면에 보이지 않도록 처리했습니다.
마치며
VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 닷컴 사이트 상단 메뉴에서 [Excel 강의] - [Excel 입문]을 먼저 보시면 이해하기 쉽습니다.