- 최초 작성일: 2002-06-08
- 최종 수정일: 2026-09-30
- 조회수: 11 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 숫자를 시간으로 바꾸기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이번 시간에는 숫자로 입력된 시간 데이터를 시간 형태로 바꾸는 방법을 살펴봅니다.
숫자를 시간으로 바꾸기
핵심 요약: 숫자를 시간으로 변환하기
뒤 두 자리를 분, 나머지를 시간으로 나누어 TimeSerial 함수에 넣으면 자릿수가 다른 숫자도 시간으로 바꿀 수 있습니다.
- 1단계: 값이 숫자이고 3~4자리인지 확인합니다.
- 2단계: 뒤 두 자리는 분, 그 앞은 시간으로 나누어 범위를 검사합니다.
- 3단계: TimeSerial로 변환하고 hh:mm 서식을 지정합니다.
Step 1: 어떤 질문이었을까요?
셀에 숫자가 들어 있는데 실제로는 시간입니다. 예를 들어 0930이라는 숫자를 09:30으로 바꾸어야 합니다. 그런데 숫자가 모두 자릿수가 같다면 Time 함수를 쓰면 되지만, 130처럼 세 자리로 된 값도 있어서 곤란하다는 질문이었습니다.
Step 2: 자릿수가 같다면 TIME 함수로 간단히
데이터의 자릿수가 모두 네 자리로 같다면 워크시트의 TIME 함수로 간단히 해결됩니다.
| 입력값 | =TIME(LEFT(B23,2),RIGHT(B23,2),0) |
|---|---|
| 1030 | 0.4375 (10:30) |
| 1230 | 0.520833... (12:30) |
그러나 세 자리와 네 자리가 섞여 있고, 문자열 데이터나 시간으로 바꿀 수 없는 데이터까지 섞여 있다면 어떻게 해야 할까요? 예제의 표에서 버튼을 누르면 변환 가능한 값은 시간 형태로, 그렇지 않은 값은 오류 메시지로 옆 셀에 표시됩니다.
| 입력값 | 변환 결과 |
|---|---|
| 740 | 07:40 |
| 845 | 08:45 |
| 1130 | 11:30 |
| 83 | 잘못된 데이터입니다! |
| abcd | 잘못된 데이터입니다! |
| 9910 | 잘못된 데이터입니다! |
| 10000 | 잘못된 데이터입니다! |
Step 3: 코드 살펴보기
잘 되지요? 코드를 볼까요?
Sub ChangeNumToTime()
Dim i As Long
Dim rngStart As Range
Dim strVal As String
Dim lngHour As Long
Dim lngMin As Long
Set rngStart = [Start]
rngStart.CurrentRegion.Columns(2).ClearContents
Do
' Do ~ Loop 문으로 순환을 합니다. 언제까지 순환을 하느냐 하면 rngStart 셀에서
' 아래로 내려 가다가 공백 셀이 나타날 때까지 합니다.
With rngStart
' 셀 값을 순차적으로 접근하면서 조건 검색을 합니다.
strVal = Trim(.Offset(i, 0).Value)
If Not IsNumeric(strVal) Or Len(strVal) > 4 Or Len(strVal) < 3 Then
' 만약 셀 값이 숫자 형태가 아니거나 데이터 자리수가 4보다 크거나 3자리 보다 작으면
' 에러 메시지를 옆 셀에 표시합니다.
.Offset(i, 1) = "잘못된 데이터입니다!"
Else
' 뒤의 두 자리는 분, 그 앞의 한두 자리는 시간으로 처리합니다. 이 때 TimeSerial 이라는
' VBA 함수를 사용하였습니다. 시간이 23 이하, 분이 59 이하인 경우에만 변환합니다.
lngMin = CLng(Right(strVal, 2))
lngHour = CLng(Left(strVal, Len(strVal) - 2))
If lngHour > 23 Or lngMin > 59 Then
.Offset(i, 1) = "잘못된 데이터입니다!"
Else
.Offset(i, 1) = TimeSerial(lngHour, lngMin, 0)
.Offset(i, 1).NumberFormatLocal = "hh:mm"
' 데이터 변환 작업이 끝났으면 셀 서식을 바꾸어 줍니다.
End If
End If
End With
i = i + 1
Loop Until IsEmpty(rngStart.Offset(i, 0))
End Sub
세 자리 값은 앞 한 자리를 시간으로, 네 자리 값은 앞 두 자리를 시간으로 처리하고 뒤의 두 자리는 언제나 분으로 처리합니다. 숫자가 아니거나 자릿수가 맞지 않거나 시간·분의 범위를 벗어나는 값은 '잘못된 데이터입니다!'로 표시합니다.
다음 시간에 또…
정리 — 숫자를 시간으로 변환하는 핵심 코드
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 숫자 검사 | IsNumeric(strVal) | 숫자 형태 확인 |
| 분 추출 | Right(strVal, 2) | 뒤 두 자리 |
| 시간 추출 | Left(strVal, Len(strVal) - 2) | 앞 한두 자리 |
| 변환 | TimeSerial(시, 분, 0) | 시간 값 만들기 |
| 서식 | NumberFormatLocal = "hh:mm" | 시:분 표시 |
자주 묻는 질문 (FAQ)
Q1. TIME 함수만으로는 왜 부족한가요?
TIME(LEFT(),RIGHT())는 값이 모두 네 자리일 때만 정확합니다. 세 자리 값은 앞 한 자리를 시간으로 처리해야 하므로 자릿수에 따라 나누어 처리해야 합니다.
Q2. TimeSerial 함수는 무엇인가요?
시, 분, 초를 인수로 받아 시간 값을 만들어 주는 VBA 함수입니다.
Q3. 잘못된 값은 어떻게 걸러 내나요?
숫자 여부, 자릿수, 시간(23 이하)과 분(59 이하)의 범위를 검사해 벗어나면 오류 문구를 옆 셀에 표시합니다.
마치며
데이터를 변환할 때는 정상적인 경우뿐 아니라 잘못된 값이 들어왔을 때의 처리까지 함께 고려해 두는 것이 좋습니다.