- 최초 작성일: 2006-01-19
- 최종 수정일: 2026-09-30
- 조회수: 12 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 간단 달력 만들기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
이 사이트의 회원 한 분께서 다음과 같은 메일을 보내 주셨습니다.
안녕하세요. Exceller님! 먼저 보잘 것 없는 내용들을 잊지 않으시고 강좌파일로 올려 주시고 격려해 주심에 머리숙여 감사드립니다.
평소 존경하는 Exceller님의 격려에 힘입어 연말도 가까워 지고 해서 간단한 달력만들기 예제파일을 만들어 봤습니다. 첨부파일은 역시 전과 같이 다루어 주셨으면 합니다.^^
Exceller 사이트에 거의 상주하다시피 하시면서 좋은 답변을 많이 남겨주시는 어느 고수님의 글입니다(누구신지는 다들 짐작하실 듯… ^^).
지난 해에 보내주신 것인데, Exceller가 경황이 좀 없어서 이제서야 소개해 드림을 너른 마음으로 양해해 주시기 바랍니다.
간단 달력 만들기
핵심 요약: 콤보 상자로 만드는 간단 달력
년/월 콤보 상자에서 값을 고르면 해당 월의 날짜와 요일이 표시되는 달력입니다. 파일을 열 때 콤보 상자가 오늘 날짜로 맞춰집니다.
- 1단계: Workbook_Open 이벤트에서 콤보 상자에 연도와 월 목록을 채웁니다.
- 2단계: 현재 연도와 월이 선택되도록 지정하고 Combo_Change를 호출합니다.
- 3단계: DateSerial로 말일을 구해 1일부터 말일까지 날짜와 요일을 나열합니다.
Step 1: 완성된 달력 살펴보기
일단 아래 버튼을 눌러서 달력의 형태를 살펴보고 오세요.
Stage 시트에는 년과 월을 고르는 두 개의 콤보 상자(YearCombo, MonthCombo)가 있고, 선택한 년/월에 맞추어 1일부터 말일까지의 날짜와 요일이 가로 방향으로 표시됩니다.
Step 2: Workbook_Open 이벤트 프로시저
VB Editor 상태(<Alt> + <F11>)에서 ThisWorkbook 개체를 더블 클릭하면 다음과 같은 Workbook_Open 이벤트 핸들러 프로시저의 내용이 나타납니다. 이것은 파일을 열 때 Stage 시트에 있는 두 개의 콤보 상자(년, 월)의 내용을 오늘 날짜(정확하게 말하자면 현재 컴퓨터 시스템에 세팅되어 있는 날짜)로 맞추기 위한 것입니다.
코드에 대한 설명은 생략합니다. 보시다가 이해가 안되는 부분이 있으면 홈 페이지 Q&A 게시판에 질문주시기 바랍니다.
Private Sub Workbook_Open()
Dim sht As Worksheet
Dim YearCombo As DropDown
Dim MonthCombo As DropDown
Dim y As Integer
Dim m As Integer
Dim i As Integer
Set sht = Worksheets("Stage")
With sht
Set YearCombo = .DropDowns("YearCombo")
Set MonthCombo = .DropDowns("MonthCombo")
.DropDowns.RemoveAllItems
End With
For y = 2000 To 2050
YearCombo.AddItem y
Next y
With YearCombo
For i = 1 To .ListCount
If .List(i) = Val(Year(Date)) Then
.Selected(i) = True
End If
Next i
End With
For m = 1 To 12
MonthCombo.AddItem m
Next m
With MonthCombo
For i = 1 To .ListCount
If .List(i) = Val(Month(Date)) Then
.Selected(i) = True
End If
Next i
End With
Call Combo_Change
End Sub
Step 3: Combo_Change 프로시저
그 다음에는 일반 모듈시트를 한 장 삽입하고 다음과 같은 코드를 작성합니다. 이 프로시저는 앞의 Workbook_Open 이벤트 프로시저에서도 호출되었고 Stage 시트에 있는 두 개의 콤보 박스(YearCombo, MonthCombo)에도 연결되어 있습니다.
Sub Combo_Change()
Dim sht As Worksheet
Dim YearCombo As DropDown
Dim MonthCombo As DropDown
Dim rngStart As Range
Dim MyDate As Date
Dim r As Integer
Dim i As Integer
Dim intDay As Integer
Dim yNum As Integer, mNum As Integer
Set sht = Worksheets("Stage")
With sht
Set YearCombo = .DropDowns("YearCombo")
Set MonthCombo = .DropDowns("MonthCombo")
End With
yNum = Val(YearCombo.List(YearCombo.ListIndex))
mNum = Val(MonthCombo.List(MonthCombo.ListIndex))
Set rngStart = sht.Range("Start")
rngStart.CurrentRegion.ClearContents
MyDate = DateSerial(yNum, mNum + 1, 0)
intDay = Day(MyDate)
With rngStart
For i = 1 To intDay
MyDate = DateSerial(yNum, mNum, i)
.Offset(0, r) = Format(MyDate, "d")
.Offset(1, r) = WeekdayName(Weekday(MyDate), True)
r = r + 1
Next i
End With
End Sub
여러분의 많은 관심과 참여를 기다립니다. ^^
다음에 또…
정리 — 간단 달력 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 콤보 상자 채우기 | YearCombo.AddItem y | 연도와 월 목록 추가 |
| 오늘 날짜 선택 | .Selected(i) = True | 현재 연도/월 항목 선택 |
| 말일 구하기 | DateSerial(yNum, mNum + 1, 0) | 해당 월의 마지막 날짜 |
| 날짜 표시 | Format(MyDate, "d") | 날짜를 일 단위로 표시 |
| 요일 표시 | WeekdayName(Weekday(MyDate), True) | 요일을 약칭으로 표시 |
자주 묻는 질문 (FAQ)
Q1. 월의 마지막 날짜는 어떻게 구하나요?
DateSerial 함수에 다음 달의 0일을 지정하면 이번 달의 마지막 날짜가 됩니다. 예를 들어 DateSerial(2026, 3, 0)은 2026년 2월 28일입니다.
Q2. 파일을 열 때 자동으로 실행되는 코드는 어디에 작성하나요?
VB Editor에서 ThisWorkbook 개체를 더블 클릭한 뒤 Workbook_Open 이벤트 프로시저에 작성합니다. 매크로를 사용하지 않도록 설정한 상태로 열면 실행되지 않습니다.
Q3. 콤보 상자에 연결된 프로시저는 어디에 작성하나요?
일반 모듈에 Sub 프로시저를 작성한 뒤 콤보 상자를 마우스 오른쪽 버튼으로 클릭하고 '매크로 지정'으로 연결합니다.
마치며
DateSerial과 WeekdayName만으로 간단한 달력을 만들 수 있습니다. 이 예제를 바탕으로 자신만의 달력을 만들어 보세요.