- 최초 작성일: 2000-10-25
- 최종 수정일: 2026-09-30
- 조회수: 8 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 숫자를 한글로 표시하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
강좌 제목을 보니 "숫자를 한글로 표시하기"라고 되어 있군요. 그런데 좀 이상하지요? 그동안 강좌를 충실히 따라오신 분이라면 아마도,
어라? "숫자를 한글로 표시하기"라고?? 이것은 그 옛날, Excel 강좌시간에 NumberString() 함수와 사용자 정의 서식 등을 통해 가능하다고 이미 다 설명해 놓고… Exceller가 이제는 강좌에 물타기를 하나? 아니면 때이른 추위를 먹었나?
이런 의문을 가지실 것입니다. ^___^
그렇습니다!!! 숫자를 문자(한글/한자 등)로 바꾸려면 NumberString() 함수나 [DBNUM] 이라는 사용자 정의 서식을 사용하면 됩니다. 예를 들어,
예를 들어 숫자 12345는 NumberString 함수나 [DBNUM] 서식을 사용하면 한글·한자 숫자로 바꿔 표시할 수 있습니다.
이렇게 됩니다. 아주 잘 됩니다. 전혀 이상이 없지요. 그런데… 이런 질문을 하신 분이 있군요.
강좌 중에 숫자를 문자로 바꾸는 것이 있는데, 예를 들어 1234를 문자로 바꾸면 "천이백삼십사"로 표시되지만 자신이 필요한 것은 "일천이백삼십사"라는 질문입니다. 주변에 물어볼 사람이 없어 질문드린다고 하셨습니다.
숫자를 한글로 표시하기
핵심 요약: 숫자를 한글로 표시
숫자를 한 자리씩 떼어 한글로 바꾸고 자릿수에 맞는 단위(천, 백, 십, 만, 억, 조)를 붙이는 사용자 정의 함수를 만듭니다.
- 1단계: CStr로 숫자를 문자열로 바꾸고 길이를 구합니다.
- 2단계: 자릿수만큼 순환하며 0이 아닌 자리에 한글 숫자와 천·백·십을 붙입니다.
- 3단계: Flag 변수로 만·억·조 단위를 붙이고 함수명에 결과를 대입해 반환합니다.
Step 1: 무엇이 다른가
Exceller의 강좌를 들으시는… 아니 보시는 분이 많다보니 이제는 계층도 다양하고 그에 따라 질문도 아주 새로운 것이 많아서 기분이 좋습니다. 그만큼 Exceller의 머리는 더 아파오지만서도… ^_____^ 아래의 표를 보세요.
Num2Kor라는 사용자 정의 함수를 사용하면 다음과 같이 표시됩니다.
| 숫자 | Num2Kor 함수 사용 결과 |
|---|---|
| 11234 | 일만일천이백삼십사 원정 |
| 11100 | 일만일천일백 원정 |
| 1234 | 일천이백삼십사 원정 |
바로 이렇게 표시되도록 해 달라는 말씀이지요? 이것은 사용자 정의 함수, 즉 함수를 하나 만들어서 쓰시면 되겠습니다. 프로시저와 함수의 가장 큰 차이점이 무엇인지 아십니까? 그것은 바로, 함수는 프로시저와 달리 작업 수행 결과를 리턴, 즉 돌려준다는 것입니다.
NumberString 함수와 [DBNUM] 서식은 한국어 환경의 엑셀에서 지원되며, 사용하는 엑셀 버전과 언어 설정에 따라 결과가 다를 수 있습니다. 이 강좌의 Num2Kor 함수는 정수 형태의 양수를 대상으로 만든 예제입니다.
Step 2: 사용자 정의 함수 작성하기
Function Num2Kor(XXX) As String
'//이 함수는 XXX라는 값을 받아서 연산을 한 다음 String 타입으로 리턴해 준다는 의미입니다.
Dim strInput As String
Dim strOutput As String
Dim strTemp As String
Const strChar As String = "일이삼사오육칠팔구"
Dim i As Integer
Dim intLen As Integer
Dim blnOK As Boolean
'//언제나 처럼 함수 내에서 사용되는 변수를 먼저 선언해 주었습니다.
strInput = CStr(XXX)
intLen = Len(strInput)
'//CStr은 Change to String, 즉 숫자자료를 문자열로 변환해 주는 함수입니다.
For i = intLen To 1 Step -1
'//이제 입력된 숫자의 길이만큼 순환문을 돌면서 작업을 진행합니다.
strTemp = Mid(strInput, intLen - i + 1, 1)
If Val(strTemp) <> 0 Then
strOutput = strOutput & Mid(strChar, Val(strTemp), 1)
'//입력받은 숫자를 한자리씩 떼어낸 다음, 0이 아니면 이것을 한글로 변환합니다.
'//자리수를 4로 나눈 나머지가 0이면 "천", 나머지가 3이면 "백", 나머지가 2이면
'//"십"이라는 문자열을 바꾼 한글 뒤에 덧붙입니다.
Select Case i Mod 4
Case 0: strOutput = strOutput & "천"
Case 3: strOutput = strOutput & "백"
Case 2: strOutput = strOutput & "십"
End Select
blnOK = True
'//그 다음에 blnOK를 True로 해 줍니다. 이것은 일종의 Flag, 즉 작업을 했다는 것을
'//알려주는 깃발입니다.
'//마을을 열 바퀴를 돌아야 하는데 머리가 좋으면야 기억해 두면 되겠지만 그렇지
'//않으면 한 바퀴 돌 때마다 전봇대에 표시를 해야 알 수가 있겠지요? 바로 이런
'//전봇대 역할을 하는 것입니다.
End If
If blnOK Then
'//즉 깃발이 꽂혀 있는 것만을 대상으로 하여 아래의 작업을 하게 되지요.
'//그러면 여기서, 깃발이 꽂혀 있는 것이란 어떤 것일까요? 그렇습니다. 0이 아닌 모든
'//값이 되겠지요?
Select Case i
'//입력받은 숫자 중에서 I의 자리수가 13자리를 넘으면 "조", 9자리를 넘으면 "억",
'//5자리를 넘으면 "만"을 또 strOutput 뒤에다가 덧붙입니다.
Case 13
strOutput = strOutput & "조"
blnOK = False
Case 9
strOutput = strOutput & "억"
blnOK = False
Case 5
strOutput = strOutput & "만"
blnOK = False
End Select
End If
Next i
Num2Kor = strOutput & " 원정"
'//이렇게 해서 자리수만큼 순환문을 돌고나면 숫자들이 모두 문자열로 치환이 될 것입니다.
'//그런 다음에는 위와 같이 "함수명=결과값"이라는 형태를 사용해서 연산의 결과값을 다시
'//리턴, 즉 되돌려 줍니다. 함수의 결과값을 다시 돌려줄 때에는 보통 이런 식으로 사용하니까
'//잘 기억해 두세요.
End Function
마무리
아무리 생각해 봐도 Excel과 VBA는 논리적인 사고를 키우는데는 그만입니다. "늙었을 때 치매에 걸리지 않기 위해서 고스톱을 친다"고 강변하는 분이 있었는데 치매예방(?)을 위해서라도 VBA는 더할나위 없이 좋다고 생각됩니다. ^^ 컴퓨터라는 물건은 거대한 논리의 덩어리입니다. VBA로 Programming을 하는 것은 곧 논리를 배우는 것입니다.
오늘은 여기까지…
정리 — 숫자 한글 변환 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 문자열 변환 | CStr(XXX) | 숫자를 문자열로 변환 |
| 한 자리 추출 | Mid(strInput, intLen - i + 1, 1) | 왼쪽부터 한 글자씩 |
| 자리 단위 | Select Case i Mod 4 | 천, 백, 십 붙이기 |
| 큰 단위 | Case 13 / 9 / 5 | 조, 억, 만 붙이기 |
| 결과 반환 | Num2Kor = strOutput & " 원정" | 함수 결과값 돌려주기 |
자주 묻는 질문 (FAQ)
Q1. 프로시저와 함수의 가장 큰 차이는 무엇인가요?
함수는 프로시저와 달리 작업 수행 결과를 값으로 돌려준다는 점입니다.
Q2. Flag 변수는 왜 사용하나요?
한 그룹(만, 억, 조)에서 0이 아닌 숫자가 있었는지 기억해 두었다가 해당 단위를 붙이기 위해서입니다.
Q3. NumberString 함수와 무엇이 다른가요?
"일천이백삼십사"처럼 1도 "일"로 읽는 등 원하는 표기 형식을 직접 제어할 수 있다는 점이 다릅니다.
마치며
논리를 차근차근 따라가 보면 원하는 표기 방식을 직접 구현하는 사용자 정의 함수도 어렵지 않습니다.