- 최초 작성일: 2009-10-07
- 최종 수정일: 2026-09-24
- 조회수: 27 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 중복없이 당첨자 뽑기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
강좌가 많이 늦었습니다(약 4개월만… ^^;;). 선선한 바람도 불어오고 하니 그간 놓았던 정신줄(?)을 다시 바로잡고 살아야겠다는 생각을 해봅니다.
이번 강좌부터는 ZIP 파일로 압축하지 않고 엑셀 파일 그대로 올립니다.
이 시대 경영학 '구루'의 한 사람인 톰 피터스는 '전략적으로 잊어버리기'를 강조했습니다. 새로운 것을 학습하느냐 하는 것보다 어떻게 과거의 낡은 생각에서 벗어나느냐가 더욱 중요한 시대가 된 것 같습니다.
누군가의 말처럼 한 인간의 경력에 있어서 지식은 '우유'와 비슷한 것 같습니다. 그만큼 신선도가 중요하다는 얘기겠지요. 흔히 기술분야에서 취득한 학위의 유통기한은 3년이라고 합니다. 이 기한 내에 자신이 알고 있는 지식을 새로운 것으로 교체하지 못하면 이내 맛이 간다는 의미입니다.
이제 사람들은 더 이상 '벌어먹고' 살지 않는다. 이제 사람들은 '배워먹고' 산다.
- 토머스 프리드먼
오늘 강좌는 김상면님께서 보내주신 것입니다.
사이트에 올라온 질문을 보면 현업에서 엑셀이 얼마나 많이 사용되는지, 또 얼마나 많은 사람들이 사용하는지 알 수 있습니다. 유용한 활용 예제를 하나 소개합니다.
아래와 같은 표가 있습니다.
| 매장 | 상품권 번호 |
|---|---|
| 강남 | A001 |
| 호곡 | A002 |
| 질곡 | A003 |
| 질타 | A004 |
| 강북 | A005 |
| 강타 | A006 |
| 연타 | A007 |
| 막타 | A008 |
| 속사 | A009 |
| 분사 | B001 |
| 연사 | B002 |
| 괴사 | B003 |
| 파산 | B004 |
| 염산 | B005 |
| 규산 | B006 |
| 계산 | B007 |
| 연산 | B008 |
| 질산 | B009 |
중복없이 당첨자 뽑기
핵심 요약: RAND·RANK·COUNTIF로 중복 없는 추첨 순위 만들기
RAND로 난수를 부여하고 RANK로 순위를 매긴 뒤, 동점자는 COUNTIF로 보정해 겹치지 않는 순위를 만듭니다. 마지막엔 값으로 복사해 결과를 고정합니다.
- 1단계: RAND()*100을 TRUNC로 정수화해 난수 부여
- 2단계: RANK로 난수의 순위를 구해 추첨 순번 생성
- 3단계: COUNTIF로 동점자를 보정해 순위 중복 제거
- 4단계: 결과를 복사 → 값 붙여넣기로 고정
1. 먼저, 필요한 함수부터 나열해 보면 다음과 같습니다.
| 함수 | 역할 |
|---|---|
| RAND | 임의의 순서로 당첨되어야 하니까 난수를 발생시키기 위해 사용합니다. |
| TRUNC | 반드시 써야하는 것은 아니지만 생소한 함수도 한번 써보는게 좋겠지요. |
| RANK | 요게 핵심입니다. 아시겠지만 자료의 순위를 구할 때 사용합니다. |
| COUNTIF | 이 함수도 또 핵심입니다. RANK 함수로 순위를 구할 수는 있지만 동점자 문제가 발생하는데 이 문제를 해결해 줍니다. |
2. 함수를 알았으니 한번 구해 볼까요.
| 매장 | 상품권 번호 | Rand | Rank | Countif | 보정 |
|---|---|---|---|---|---|
| 강남 | A001 | 0.128 | 18 | 1 | 18 |
| 호곡 | A002 | 0.799 | 7 | 1 | 7 |
| 질곡 | A003 | 0.968 | 2 | 1 | 2 |
| 질타 | A004 | 0.983 | 1 | 1 | 1 |
| 강북 | A005 | 0.745 | 9 | 1 | 9 |
| 강타 | A006 | 0.222 | 15 | 1 | 15 |
| 연타 | A007 | 0.299 | 14 | 1 | 14 |
| 막타 | A008 | 0.402 | 11 | 1 | 11 |
| 속사 | A009 | 0.517 | 10 | 1 | 10 |
| 분사 | B001 | 0.913 | 4 | 1 | 4 |
| 연사 | B002 | 0.875 | 6 | 1 | 6 |
| 괴사 | B003 | 0.190 | 16 | 1 | 16 |
| 파산 | B004 | 0.922 | 3 | 1 | 3 |
| 염산 | B005 | 0.177 | 17 | 1 | 17 |
| 규산 | B006 | 0.889 | 5 | 1 | 5 |
| 계산 | B007 | 0.399 | 12 | 1 | 12 |
| 연산 | B008 | 0.364 | 13 | 1 | 13 |
| 질산 | B009 | 0.764 | 8 | 1 | 8 |
(RAND로 만든 난수에 100을 곱하고 TRUNC로 정수부만 취한 값의 순위를 RANK로 구한 뒤, 혹시 모를 동점자를 COUNTIF로 보정해 최종 추첨 순위를 만드는 방식입니다.)
3. 이제 결과가 제대로 된 것 같지만 한가지 문제가 있습니다.
RAND 함수를 사용했기 때문에 그 결과값이 수시로 바뀝니다. 따라서 추첨순위가 한번 정해지면 계속 유지되어야 해야 합니다.
4. 보정 영역을 '편집-복사'한 다음, '편집-값 붙여 넣기' 하여 마무리 합니다.
이번 강좌 이상 끝!!! … 하면 완전히 날로 먹는게 되니까…
김상면님이 알려주신 방법에 착안하여 수식을 조금 다듬으면 다음과 같이 표현할 수도 있겠습니다.
=RANK(D66,$D$66:$D$83)+COUNTIF($D$66:D66,D66)-1
낯선 함수는 없으리라 생각합니다.
늘 그렇듯, 함수는 알고 있는 게 중요한 것이 아니라 어떻게 적재적소에 활용하느냐가 관건입니다.
오늘은 여기까지…
정리 — 중복 없는 추첨 순위 만들기
| 단계 | 핵심 작업 |
|---|---|
| 난수 생성 | =TRUNC(RAND()*100) |
| 순위 계산 | =RANK(난수,범위) |
| 동점자 보정 | +COUNTIF(범위,해당값)로 중복 순위 제거 |
| 결과 고정 | 보정된 순위를 복사 후 값 붙여넣기 |
| 간결한 대안식 | =RANK(D66,$D$66:$D$83)+COUNTIF($D$66:D66,D66)-1 |
자주 묻는 질문 (FAQ)
Q1. RAND 함수만으로 당첨자를 뽑으면 안 되나요?
RAND는 재계산될 때마다(예: 다른 셀 입력, 파일 재실행 등) 값이 바뀌는 휘발성 함수입니다. 그래서 RAND 값 자체를 당첨 근거로 남겨두면 결과가 계속 바뀌므로, RANK로 순위를 구한 뒤 값으로 고정해 두어야 합니다.
Q2. RANK 함수로 순위를 매겼는데 순위가 겹치는 경우가 있는 이유는 무엇인가요?
TRUNC로 정수화하는 과정에서 서로 다른 난수가 우연히 같은 정수 순위를 받을 수 있기 때문입니다. RANK는 동점자에게 같은 순위를 부여하므로, 그대로 두면 두 명이 1등이 되는 등 중복이 생깁니다.
Q3. 동점자로 인한 순위 중복은 어떻게 해결하나요?
COUNTIF로 지금까지 나온 같은 값의 개수를 세어 RANK 결과에 더해줍니다. 이렇게 하면 값이 같은 항목들도 서로 다른, 겹치지 않는 순위를 갖게 됩니다. =RANK(D66,$D$66:$D$83)+COUNTIF($D$66:D66,D66)-1 처럼 한 수식으로 간결하게 표현할 수도 있습니다.
마치며
VBA에 대한 기초 지식을 공부하실 분은 아이엑셀러 닷컴 사이트 상단 메뉴에서 [Excel 강의] - [Excel 입문]을 먼저 보시면 이해하기 쉽습니다.