바쁜 일정을 효율적으로 관리하고 미리 계획을 세우고 싶다면 엑셀(Excel) 달력이 큰 도움이 됩니다. 이 글에서는 엑셀에서 연간 달력을 만드는 방법을 단계별로 자세히 설명해 드립니다. 특히 여기서 소개하는 달력은 동적(Dynamic)이면서 인터랙티브합니다. 즉, 연도 값만 바꾸면 달력이 자동으로 업데이트됩니다. 또한 마지막에는 엑셀 VBA를 활용해 월간 달력을 만드는 방법까지 함께 다룹니다.
아래 링크에서 실습용 통합 문서를 다운로드할 수 있습니다.
엑셀에서 연간 달력 만들기: 4단계 완성
본격적인 튜토리얼에 들어가기 전에 최종 결과물이 어떤 모습인지 먼저 확인해 보겠습니다. 아래 예시는 연간 달력으로, 토요일과 일요일(주말)은 연한 주황색으로, 공휴일은 진한 주황색으로 표시됩니다.


이 튜토리얼은 Microsoft Excel 365 버전을 기준으로 작성되었지만, 사용 중인 버전에 따라 다른 버전을 활용하셔도 무방합니다.
📌 1단계: 기본 골격 만들기
- 먼저 12개월을 3열 × 4행 구조로 배치하여 달력의 전체 레이아웃을 잡습니다.
- 다음으로 요일 7개(일요일~토요일)를 입력하고, 주말인 토요일과 일요일은 색상으로 강조합니다.

📌 2단계: 월 이름 입력하기
- B4 셀로 이동한 후 숫자 1을 입력하고, 키보드에서 Ctrl + 1 키를 누릅니다.

그러면 셀 서식(Format Cells) 대화 상자가 열립니다.
- 표시 형식(Number) 탭으로 이동 >> 사용자 지정(Custom) 옵션 선택 >> 형식(Type) 입력란에 큰따옴표를 포함해 "January"라고 입력 >> 마지막으로 글꼴(Font) 탭으로 이동합니다.

- 이어서 굵은 기울임꼴(Bold-Italic) 글꼴 스타일을 선택하고 원하는 색상(여기서는 보라색)을 지정한 후 확인(OK) 버튼을 클릭합니다.

- 그런 다음 B4:H4 셀 범위를 선택하고 Ctrl + 1 키를 눌러 셀 서식 창을 엽니다.
- 맞춤(Alignment) 탭으로 이동 >> 가로(Horizontal) 항목에서 선택 영역의 가운데 정렬(Center Across Selection) 옵션을 선택 >> 확인 버튼을 누릅니다.

완료하면 아래 이미지처럼 January(1월)라는 월 이름이 표시됩니다.

- 같은 방법으로 나머지 월도 반복해서 입력하면 결과물은 아래 사진과 같습니다.


📌 3단계: 엑셀 함수로 동적 달력 만들기
- 세 번째 단계에서는 B6 셀로 이동하여 아래 수식을 입력합니다.
=IF(MONTH(DATE($B$2,$B$4,1)+SEQUENCE(6,7)-WEEKDAY(DATE($B$2,$B$4,1),2))=$B$4,DATE($B$2,$B$4,1)+SEQUENCE(6,7)-WEEKDAY(DATE($B$2,$B$4,1),2),"")
여기서 B2 셀은 연도 2022, B4 셀은 1월(January)을 각각 나타냅니다.
📃 참고: SEQUENCE 함수는 Excel 365, Excel 2021 및 Excel 웹 버전에서만 사용할 수 있으므로, 호환 가능한 버전을 사용 중인지 꼭 확인하세요.

- 이제 Enter 키를 누르면 수식이 자동으로 확장되어 1월의 모든 날짜가 채워집니다.
📃 참고: Ctrl + 1 키를 눌러 셀 서식 창을 열고, 날짜 형식을 'dd'만 표시하도록 변경해야 합니다. 그래야 날짜 대신 숫자만 깔끔하게 보입니다.

모든 과정을 마치면 결과물은 아래 이미지와 같습니다.


📌 4단계: 공휴일 표시하기
- 마지막 단계에서는 새 시트에 아래와 같이 공휴일 목록을 작성합니다.

- 그다음 B6:H11 범위를 선택 >> 조건부 서식(Conditional Formatting) 드롭다운 메뉴로 이동 >> 새 규칙(New Rule) 옵션을 선택합니다.

즉시 새 서식 규칙(New Formatting Rule) 마법사가 열립니다.
- 수식을 사용하여 서식을 지정할 셀 결정(Use a formula to determine which cells to format) 옵션을 선택합니다.
- 그런 다음 규칙 설명(Rule Description)에 아래 수식을 입력합니다.
=ISNUMBER(VLOOKUP(B6,Holidays!$C:$C,1,0))
여기서 B6 셀은 1월의 월요일을 가리키며, Holidays!$C:$C는 Holidays 시트의 날짜 열을 의미합니다.
수식 분석:
- VLOOKUP(B6,Holidays!$C:$C,1,0)) → VLOOKUP 함수는 테이블의 가장 왼쪽 열에서 값을 찾은 후, 같은 행에서 지정한 열의 값을 반환합니다. 여기서 B6(lookup_value 인수)는 Holidays!$C:$C(table_array 인수) 배열에서 조회됩니다. 다음 1(col_index_num 인수)은 반환할 열 번호를, 마지막 0(range_lookup 인수)은 조회 값의 정확한 일치(Exact match)를 의미합니다.
- 결과 → #N/A
- ISNUMBER(VLOOKUP(B6,Holidays!$C:$C,1,0)) → 위 결과가 적용되면 다음과 같이 됩니다.
- ISNUMBER(#N/A) → ISNUMBER 함수는 값이 숫자인지 확인하고 TRUE 또는 FALSE를 반환합니다. 여기서 #N/A는 value 인수이며, 숫자가 아니므로 함수는 FALSE를 반환합니다.
- 결과 → FALSE

이제 1월 1일 공휴일이 진한 주황색으로 강조 표시됩니다.

같은 방식으로 나머지 월에도 동일한 절차를 반복하면 아래 스크린샷과 같은 결과물을 얻을 수 있습니다.


VBA로 월간 달력 자동 생성하기
연간이 아니라 월간 달력을 만들고 싶다면 어떻게 해야 할까요? 다음 방법을 활용하면 됩니다! 여기서는 VBA 코드를 사용해 작업을 자동화합니다. 바로 살펴보겠습니다.
📌 단계:
- 우선 리본 메뉴에서 개발 도구(Developer) 탭으로 이동 >> Visual Basic 버튼을 클릭합니다.

새 창으로 Visual Basic 편집기(VBE)가 열립니다.
- 다음으로 삽입(Insert) 탭으로 이동 >> 모듈(Module)을 선택합니다.

편의를 위해 아래 코드를 복사해서 모듈 창에 붙여 넣으세요.
Sub CalendarMaker()
'This code was taken from extendoffice.com
ActiveSheet.Protect DrawingObjects:=False, Contents:=False, _
Scenarios:=False
Application.ScreenUpdating = False
On Error GoTo MyErrorTrap
Range("a1:g14").Clear
MyInput = InputBox("Type in Month and year for Calendar ")
If MyInput = "" Then Exit Sub
StartDay = DateValue(MyInput)
If Day(StartDay) <> 1 Then
StartDay = DateValue(Month(StartDay) & "/1/" & _
Year(StartDay))
End If
Range("a1").NumberFormat = "mmmm yyyy"
With Range("a1:g1")
.HorizontalAlignment = xlCenterAcrossSelection
.VerticalAlignment = xlCenter
.Font.Size = 18
.Font.Bold = True
.RowHeight = 35
End With
With Range("a2:g2")
.ColumnWidth = 11
.VerticalAlignment = xlCenter
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Orientation = xlHorizontal
.Font.Size = 12
.Font.Bold = True
.RowHeight = 20
End With
Range("a2") = "Sunday"
Range("b2") = "Monday"
Range("c2") = "Tuesday"
Range("d2") = "Wednesday"
Range("e2") = "Thursday"
Range("f2") = "Friday"
Range("g2") = "Saturday"
With Range("a3:g8")
.HorizontalAlignment = xlRight
.VerticalAlignment = xlTop
.Font.Size = 18
.Font.Bold = True
.RowHeight = 21
End With
Range("a1").Value = Application.Text(MyInput, "mmmm yyyy")
DayofWeek = Weekday(StartDay)
CurYear = Year(StartDay)
CurMonth = Month(StartDay)
FinalDay = DateSerial(CurYear, CurMonth + 1, 1)
Select Case DayofWeek
Case 1
Range("a3").Value = 1
Case 2
Range("b3").Value = 1
Case 3
Range("c3").Value = 1
Case 4
Range("d3").Value = 1
Case 5
Range("e3").Value = 1
Case 6
Range("f3").Value = 1
Case 7
Range("g3").Value = 1
End Select
For Each cell In Range("a3:g8")
RowCell = cell.Row
ColCell = cell.Column
If cell.Column = 1 And cell.Row = 3 Then
ElseIf cell.Column <> 1 Then
If cell.Offset(0, -1).Value >= 1 Then
cell.Value = cell.Offset(0, -1).Value + 1
If cell.Value > (FinalDay - StartDay) Then
cell.Value = ""
Exit For
End If
End If
ElseIf cell.Row > 3 And cell.Column = 1 Then
cell.Value = cell.Offset(-1, 6).Value + 1
If cell.Value > (FinalDay - StartDay) Then
cell.Value = ""
Exit For
End If
End If
Next
For x = 0 To 5
Range("A4").Offset(x * 2, 0).EntireRow.Insert
With Range("A4:G4").Offset(x * 2, 0)
.RowHeight = 65
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlTop
.WrapText = True
.Font.Size = 10
.Font.Bold = False
.Locked = False
End With
With Range("A3").Offset(x * 2, 0).Resize(2, _
7).Borders(xlLeft)
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
With Range("A3").Offset(x * 2, 0).Resize(2, _
7).Borders(xlRight)
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
Range("A3").Offset(x * 2, 0).Resize(2, 7).BorderAround _
Weight:=xlThick, ColorIndex:=xlAutomatic
Next
If Range("A13").Value = "" Then Range("A13").Offset(0, 0) _
.Resize(2, 8).EntireRow.Delete
ActiveWindow.DisplayGridlines = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True
ActiveWindow.WindowState = xlMaximized
ActiveWindow.ScrollRow = 1
Application.ScreenUpdating = True
Exit Sub
MyErrorTrap:
MsgBox "You may not have entered your Month and Year correctly." _
& Chr(13) & "Spell the Month correctly" _
& " (or use 3 letter abbreviation)" _
& Chr(13) & "and 4 digits for the Year"
MyInput = InputBox("Type in Month and year for Calendar")
If MyInput = "" Then Exit Sub
Resume
End Sub

- 이제 VBA 창을 닫고 >> 매크로(Macros) 버튼을 클릭합니다.
매크로 대화 상자가 열립니다.
- CalendarMaker 매크로를 선택 >> 실행(Run) 버튼을 누릅니다.

그러면 입력 상자(Input box)가 열리는데, 아래와 같이 월 이름(Month Name)과 연도(Year)를 입력합니다.

실행이 완료되면 결과물은 아래 사진과 같습니다.

마무리
이 글이 엑셀에서 연간 달력을 만드는 방법을 이해하는 데 도움이 되었기를 바랍니다. 궁금한 점이 있다면 아래 댓글로 남겨주세요. 또한 이와 같은 유용한 엑셀 팁을 더 보고 싶다면 올인원 엑셀 솔루션 사이트인 ExcelDemy를 방문해 보세요.
함께 읽으면 좋은 글
- 엑셀에서 빈 달력 만드는 방법 (무료 템플릿 다운로드)