컴퓨터 공부/엑셀 & VBA

[엑셀vba] 시트에 달력을 표시해보자.

도 박사 2021. 4. 13. 17:39
반응형

단 코드 몇 줄이면 시트에 달력을 표시할 수 있다.

 

아주 쉽게 만들어보자.

 

우선, 달력을 표시할 셀을 이쁘게 꾸며보자.


  1. 실행 과정
  2. 코드(윤년 계산법)

1. 실행 과정

나름 이쁘게 꾸민 달력 양식

 

나의 경우 셀 C1에는 '년도', C2에는 '월' 입력 하기 위한 양식을 만들었다. 그리고 데이터 유효성 검사 기능으로 각 셀에는 입력값을 제한 하고 있다. 

 

- C1에는 1900 ~ 4000 까지 입력 가능

- C2에는 1 ~ 12  입력가능

 

데이터 유효성 검사

정해진 범위가 아닌 값을 입력하면 오류가 출력되며 코드가 실행되지 않는다. 정확한 값을 넣으면 다음과 같이 정상적으로 작동하는 것을 볼 수 있다.

 

2021년 4월 달력

 

2021년 4월 달력을 출력해봤다. 실제 달력과 비교해본 결과 똑같았다. 년도나 월 값을 변경하면 달력도 자동으로 변경된다. 다음 그림을 보자.

 

 

 

달려크

 

 

윤년도 정확히 계산 했던것같다,,


2. 코드

 

모듈1개와 시트1개에 코드를 작성하였음

 

- 모듈 코드: 달력 날짜 계산

- 시트 코드: 년도와 월 셀의 입력 값 바뀌면 모듈 실행 

 

 

   2.1 모듈 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Option Explicit
Sub Carlendar()
 
    Dim Years As Integer
    Dim Months As Integer
    Dim LastDay As String
    Dim x As Integer: x = 4
    Dim y As Integer
    Dim i As Integer: i = 1
    
    Years = Range("C1"'C1에 있는 값을 Years 변수에 저장
    Months = Range("C2"'C2에 있는 값을 Months 변수에 저장
    
    Rows("4:9").ClearContents '코드 실행 전 달력에 입력되있는 날짜 데이터 지우기(값만 지움)
    
    If Years = 0 Or Months = 0 Then '년도나 월 중에 데이터 없을 때 코드 진행 안하기 위함
    Else
        '################################################################################
        '마지막 일수 및 윤년 계산 ↓↓
        
        If InStr(1"-1-3-5-7-8-10-12-""-" & Months & "-"Then
            LastDay = 31
        ElseIf InStr(1"-4-6-9-11-""-" & Months & "-"Then
            LastDay = 30
        Else
            If Years Mod 4 = 0 Then
                If Years Mod 100 = 0 Then
                    If Years Mod 400 = 0 Then
                        LastDay = 29
                    Else
                        LastDay = 28
                    End If
                Else
                    LastDay = 29
                End If
            Else
                LastDay = 28
            End If
        End If
        
        '################################################################################
        '셀에 날짜 넣기 ↓↓
        
        For i = 1 To LastDay
            y = Format(Years & "-" & Months & "-" & i, "w")
            Cells(x, y) = i
            If y = 7 Then: x = x + 1
        Next i
    End If
    
End Sub
cs

 

모듈 코드에는 크게 2가지 부분이 있다. 윤년 확인 구간, 시트에 날짜 넣는 구간.

 


※ 윤년 계산법

년도/4의 나머지가 0이면 윤년, But 100으로 나눴을때도 나머지가 0이면 평년.

년도/4의 나머지 0, 년도/100 나머지 0, 년도/400 나머지 0 의 경우이면 윤년

EX.

- 2100년은 윤년인가 평년인가??!

2100/4의 나머지는 0, 2100/100의 나머지 0, 2100/400의 나머지 100이 나옴. 

계산결과 2100년은 평년이다. 윈도우 달력을 봐도 평년으로 나타남

이 결과에는 무서운 사실이 하나 있는데 2096년 2월 29일에 태어난 애기는 2104년 2월 29일에 돌잔치를 할 수 있다..

 (2097년 ~ 2103년 까지 윤년이 없다는 얘기..흐흑)

2100년 2월 윈도우 달력

 

다음은 대략 내가 만든 순서도인 것? 이렇게 하는게 맞는지 모르겠지만 만들어보았다.

내가 만든 윤년 순서도


 

윤년 순서도를 만들고 코드를 작성하니 한결 쉬운 느낌이었다. 순서도를 담당하고 있는 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        If InStr(1"-1-3-5-7-8-10-12-""-" & Months & "-"Then
            LastDay = 31
        ElseIf InStr(1"-4-6-9-11-""-" & Months & "-"Then
            LastDay = 30
        Else
            If Years Mod 4 = 0 Then
                If Years Mod 100 = 0 Then
                    If Years Mod 400 = 0 Then
                        LastDay = 29
                    Else
                        LastDay = 28
                    End If
                Else
                    LastDay = 29
                End If
            Else
                LastDay = 28
            End If
        End If
cs

첫번째 if 제어문에서는 31일로 끝나는 달을 확인하는 부분이다. 만약 Months 변수에 3이라는 값이 있다면 첫번째 제어문에서 "-1-3-5-7-8-10-12-" 문자열안에 "-3-"이 포함됐는지 확인하고 있을 경우 LastDay 변수에 31이 저장되며 if문을 나가게된다. 

 

두번째 elseif 제어문은 30일로 끝나는 달을 체크하고 작동방식은 첫번째 제어문과 유사하다.

 

마지막 else 제어문에서 윤년인지 확인하는 구문이다. 순서도에서 나타낸대로  if ~ else 를 여러개 이용해 구현했다.


다음은 셀에 날짜를 입력하는 구문이다.

1
2
3
4
5
        For i = 1 To LastDay
            y = Format(Years & "-" & Months & "-" & i, "w")
            Cells(x, y) = i
            If y = 7 Then: x = x + 1
        Next i
cs

윤년 및 마지막 일 확인하는 구문을 지나면 LastDay 변수에는 28, 29, 30, 31 중에 어떤 값이든 들어있게 된다.

For 반복문을 통해 1일부터 마지막 일까지 표시하는 작업을 반복한다.


※ Format(날짜 데이터, "w")

요일을 숫자로 나타내준다. 일 = 1, 월 = 2, 화 = 3, 수 = 4, 목 = 5 , 금 = 6, 토 = 7

y=format("2020-04-01","w") 이렇게 사용한다면 y 변수에는 숫자 4가 저장된다. 2020년 4월 1일은 수요일이기 때문 

Format 함수에는 다양한 데이터 타입을 쓸 수 있으며 구글링으로 많은 정보를 얻을 수 있다.


 

 

실질적으로 위에 표시된 5줄의 코드가 달력의 핵심(?) 기능이다. 왜냐면 시트에 일수를 표시해주기 때문 ㅋㅋ

간단하게 글로 표현하면 1일부터 무슨 요일인지 확인하고 토요일이 나오면 다음 줄로 이동하며 마지막 일까지 반복함.

아주아주 간단하다.

 


 

 

 

 

반응형