- 최초 작성일: 2005-11-18
- 최종 수정일: 2026-09-30
- 조회수: 15 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 다빈도값 알아내기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
방문자께서 다음과 같은 메일을 보내 주셨습니다.
안녕하세요.Exceller님! 여전히 건강하시죠? 이렇게 자꾸 귀찮게 해 드려서 죄송합니다만, 첨부한 파일을 검토하시고 자료로서 가치가 있다고 판단 되시면, 다음에 시간되실 때 강좌 파일로 다루어 주셨으면 합니다.
전혀… 절대로 귀찮지 않으니까 좋은 아이디어나 다른 분들과 함께 나누고 싶은 것이 있는 분은 언제든 보내주시기 바랍니다.
다빈도값 알아내기
핵심 요약: 가장 자주 나온 값 찾기
=MaxFrequency(범위)로 입력하면 범위 내에서 발생 빈도가 가장 높은 값을 알려 주는 사용자 정의 함수입니다. 문자든 숫자든 사용할 수 있습니다.
- 1단계: 범위의 모든 값을 쉼표로 이어 붙인 문자열을 만듭니다.
- 2단계: Split으로 값을 나누고 각 값을 지웠을 때 남는 문자열 길이를 비교합니다.
- 3단계: 가장 많이 지워진 값을 결과로 돌려줍니다.
Step 1: 무엇을 하려는 걸까요?
오늘 내용을 살펴보도록 하지요. 버튼을 누르면 예제가 실행됩니다.
무엇을 하고자 하는지 짐작하시겠지요?
=MaxFrequency(범위)라고 입력하면 지정한 범위 내에서 가장 발생 빈도가 높은 값이 무엇인지를 찾아 주는 사용자 정의 함수입니다. 함수 마법사의 '사용자 정의' 범주에서 MaxFrequency를 찾아 실행하고, 인수(Count_Range)에 데이터가 입력된 영역(예: B10:E14)을 지정하면 그 영역에서 가장 자주 나온 값이 결과로 나타납니다.
Step 2: 코드 살펴보기
코드는 다음과 같습니다.
Function MaxFrequency(Count_Range As Range) As String
Dim rngCell As Range
Dim arrVar As Variant
Dim i As Long
Dim intLen As Long
Dim strVal As String
Dim strTarget As String
For Each rngCell In Count_Range
strVal = strVal & "," & rngCell
Next rngCell
arrVar = Split(strVal, ",")
intLen = Len(Replace(strVal, arrVar(0), ""))
strTarget = arrVar(0)
For i = 1 To UBound(arrVar)
If Len(Replace(strVal, arrVar(i), "")) < intLen Then
intLen = Len(Replace(strVal, arrVar(i), ""))
strTarget = arrVar(i)
End If
Next
MaxFrequency = strTarget
End Function
코드에 대한 해설은 앞선 강좌와 마찬가지로 생략할까 합니다. 보시다 잘 이해가 안되는 부분이 있으시면 게시판에 올려주시기 바랍니다.
이 코드의 원리와 한계: 이 함수는 모든 값을 쉼표로 이어 붙인 문자열에서 특정 값을 지웠을 때 줄어든 길이가 가장 큰 값을, 즉 가장 많이 나온 값을 찾는 방식입니다. 한 값이 다른 값의 일부(예: 'AB'와 'ABC')이거나 쉼표가 들어 있는 경우에는 결과가 부정확할 수 있습니다. 동적 배열 함수를 지원하는 Microsoft 365라면 아래와 같이 수식만으로도 가장 많이 나온 값을 구할 수 있습니다.
=TAKE(SORTBY(UNIQUE(TOCOL(B10:E14)), COUNTIF(B10:E14, UNIQUE(TOCOL(B10:E14))), -1), 1)
다음에 또…
정리 — MaxFrequency 함수 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 값 연결 | strVal = strVal & "," & rngCell | 범위의 값을 쉼표로 연결 |
| 값 분리 | Split(strVal, ",") | 값을 배열로 나눔 |
| 길이 비교 | Len(Replace(strVal, arrVar(i), "")) | 값을 지운 뒤 남는 길이 |
| 최빈값 갱신 | If ... < intLen Then | 남는 길이가 짧을수록 자주 나온 값 |
| 결과 반환 | MaxFrequency = strTarget | 가장 자주 나온 값 |
자주 묻는 질문 (FAQ)
Q1. 엑셀 내장 함수로 최빈값을 구할 수는 없나요?
숫자 데이터라면 MODE 함수(또는 MODE.SNGL)로 구할 수 있습니다. 문자 데이터는 MODE 함수로 구할 수 없으므로 INDEX와 MATCH를 조합하거나 Microsoft 365의 동적 배열 함수를 사용하거나 이번 강좌처럼 사용자 정의 함수를 만들어야 합니다.
Q2. 빈도가 같은 값이 여러 개이면 어떤 값이 반환되나요?
이 코드는 처음 발견한 값을 유지하다가 더 자주 나온 값이 있을 때만 바꿉니다. 따라서 빈도가 같으면 범위에서 먼저 나오는 값이 반환됩니다.
Q3. 사용자 정의 함수는 함수 마법사에서 어떻게 찾나요?
함수 마법사에서 범주를 '사용자 정의'로 선택하면 VBA로 만든 Function 프로시저 목록이 표시됩니다.
마치며
문자열을 이어 붙이고 Replace로 지워 보는 아이디어만으로도 최빈값을 구하는 함수를 만들 수 있었습니다. 사용자 정의 함수로 만들어 두면 워크시트에서 바로 활용할 수 있습니다.