- 최초 작성일: 2005-09-23
- 최종 수정일: 2026-09-30
- 조회수: 28 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 시간표 만들기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
질문 하나
수업 시간표를 다음과 같이 입력했다고 합니다. 이름 옆의 시각은 해당 요일에 수업이 시작하는 시간입니다.
| 성명 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 정태우 | 5:00 | 5:00 | 4:00 | |||
| 이현우 | 5:00 | 4:00 | 7:00 | 7:00 | ||
| 소혜현 | 4:00 | 4:00 | 4:00 | |||
| 한홍수 | 5:00 | 6:00 | 5:00 | 6:00 | 6:00 | 5:00 |
이것을 엑셀이나 VBA로 아래와 같이 요일과 시간 항목에 자동으로 이름이 들어가게 하려면 어떻게 해야 되는지 알려 달라는 질문이었습니다.
| 요일 | 4:00 | 5:00 | 6:00 | 7:00 |
|---|---|---|---|---|
| 월 | 소혜현 | 이현우한홍수 | ||
| 화 | 이현우 | 정태우 | 한홍수 | |
| 수 | 소혜현 | 한홍수 | ||
| 목 | 정태우 | 한홍수 | 이현우 | |
| 금 | 소혜현 | 한홍수 | 이현우 | |
| 토 | 정태우 | 한홍수 |
같은 유형의 질문이 요일과 시간, 이름만 바꾸어 한 번 더 올라왔습니다.
시간표 만들기
핵심 요약: Find로 요일·시간별 시간표 만들기
이름 기준으로 입력된 요일별 시각 데이터를 요일 × 시간 표로 뒤집는 VBA 코드입니다. 시간 값을 Find와 FindNext로 모두 찾아 해당 위치에 이름을 채웁니다.
- 1단계: 새 시트를 추가하고 요일과 시간 머리글을 만듭니다.
- 2단계: 각 시간 값을 Find 메서드로 찾고 FindNext로 계속 찾아 나갑니다.
- 3단계: 찾은 셀의 열 위치로 요일을 정해 이름을 이어 붙입니다.
Step 1: 답변 살펴보기
질문의 내용으로 보아 학교에서 과제로 내 준 문제인 듯하여 답변을 달지 않고 있었는데요(동일한 분의 질문일 수도 있겠습니다만, 실명을 사용하시지 않으셨기에…), 도우미 중 한 분인 21centmen님께서 이런 답변을 주셨네요.
Step 2: 21centmen님의 답변 코드
코드는 크게 어려운 부분은 없습니다. 그동안 Exceller의 강의를 충실히 학습하신 분이라면 누구나 쉽게 풀 수 있는... (어디서 많이 듣던 소리지요? ^^;)
Find, FindNext 메서드에 대해서는 VB0125를 살펴보시면 되겠습니다. 코드에 대한 해설은 생략합니다. 궁금한 것이 있으면 질문주세요.
Sub 분류()
Dim rngStart As Range
Dim rng As Range
Dim rngSource As Range
Dim rngFind As Range
Dim addr As String
Dim intOff As Integer
Dim 시간개수 As Integer
Set rngSource = Range("A1").CurrentRegion
Set rngSource = rngSource.Offset(1, 1).Resize(rngSource.Rows.Count - 1, rngSource.Columns.Count - 1)
Worksheets.Add
Range("A1:A7") = Application.Transpose(Array("일", "월", "화", "수", "목", "금", "토"))
For 시간개수 = 4 To 7
With Cells(1, 시간개수 - 2)
.NumberFormat = "h:mm"
.Value = TimeSerial(시간개수, 0, 0)
End With
Next 시간개수
Set rngStart = Range("B1")
For Each rng In Range(rngStart, rngStart.End(xlToRight))
Set rngFind = rngSource.Find(What:=CDate(rng.Value), LookIn:=xlValues, LookAt:=xlWhole)
If Not rngFind Is Nothing Then
addr = rngFind.Address
Do
intOff = rngFind.Column - 1
rng.Offset(intOff, 0) = rng.Offset(intOff, 0) & Worksheets("Stage").Cells(rngFind.Row, 1)
Set rngFind = rngSource.FindNext(rngFind)
Loop While (Not rngFind Is Nothing) And rngFind.Address <> addr
End If
Next rng
End Sub
Stage 시트의 버튼에 연결된 코드는 21centmen님의 코드에서 괘선이나 열 너비를 지정하는 부분만 수정한 것입니다.
21centmen님 덕택에 이번 강의는 이렇게 해결(?)이 되는군요. ^^
오늘은 짧게 여기까지…
정리 — 시간표 만들기 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 시간 머리글 | TimeSerial(시간개수, 0, 0) | 4:00~7:00 시간 값 생성 |
| 요일 머리글 | Application.Transpose(Array("일", ...)) | 요일을 세로로 입력 |
| 값 찾기 | rngSource.Find(What:=CDate(rng.Value), ...) | 같은 시간이 입력된 첫 셀 검색 |
| 계속 찾기 | rngSource.FindNext(rngFind) | 같은 시간의 다음 셀 검색 |
| 이름 입력 | rng.Offset(intOff, 0) & 이름 | 요일 위치에 이름 이어 붙임 |
자주 묻는 질문 (FAQ)
Q1. Find로 찾은 셀을 모두 처리하려면 어떻게 하나요?
처음 찾은 셀의 주소를 저장해 두고, FindNext로 다음 셀을 계속 찾다가 찾은 셀이 없거나 처음 주소로 되돌아오면 반복을 끝내면 됩니다. 이 예제의 Do ~ Loop While 구조가 바로 그 방식입니다.
Q2. 시간 값은 엑셀에서 어떻게 저장되나요?
시간은 하루를 1로 보는 소수로 저장됩니다. 예를 들어 4:00은 약 0.1667, 6:00은 0.25입니다. 그래서 TimeSerial로 만든 시간 값을 Find로 찾을 수 있습니다.
Q3. 같은 시간에 여러 명이 수업하면 어떻게 표시되나요?
같은 칸에 이름을 이어 붙여 표시합니다. 이 예제에서는 이름 사이에 구분 기호가 없으므로 필요하면 이름 뒤에 쉼표 등을 추가해 사용하세요.
마치며
Find와 FindNext를 활용하면 같은 값이 여러 곳에 있는 경우에도 빠짐없이 찾아 처리할 수 있습니다. 도우미님의 코드 덕분에 이번 강좌가 이렇게 해결되었습니다.