단 코드 몇 줄이면 시트에 달력을 표시할 수 있다.
아주 쉽게 만들어보자.
우선, 달력을 표시할 셀을 이쁘게 꾸며보자.
- 실행 과정
- 코드(윤년 계산법)
1. 실행 과정
나의 경우 셀 C1에는 '년도', C2에는 '월' 입력 하기 위한 양식을 만들었다. 그리고 데이터 유효성 검사 기능으로 각 셀에는 입력값을 제한 하고 있다.
- C1에는 1900 ~ 4000 까지 입력 가능
- C2에는 1 ~ 12 입력가능
정해진 범위가 아닌 값을 입력하면 오류가 출력되며 코드가 실행되지 않는다. 정확한 값을 넣으면 다음과 같이 정상적으로 작동하는 것을 볼 수 있다.
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년 까지 윤년이 없다는 얘기..흐흑)
다음은 대략 내가 만든 순서도인 것? 이렇게 하는게 맞는지 모르겠지만 만들어보았다.
윤년 순서도를 만들고 코드를 작성하니 한결 쉬운 느낌이었다. 순서도를 담당하고 있는 코드는 다음과 같다.
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일부터 무슨 요일인지 확인하고 토요일이 나오면 다음 줄로 이동하며 마지막 일까지 반복함.
아주아주 간단하다.
'컴퓨터 공부 > 엑셀 & VBA' 카테고리의 다른 글
[엑셀vba] 파일을 복사해보자!(filecopy) (0) | 2021.07.27 |
---|---|
[엑셀vba] 폴더를 만들어보자.(mkdir) (0) | 2021.07.27 |
[엑셀vba] 사용자 정의 폼을 써보자 (0) | 2021.01.28 |
[엑셀vba] 정수인지 소수(0.24, 0.1)인지 구분해보자 (0) | 2021.01.12 |
[엑셀vba] 코드 여러 줄로 작성하기 & IF문 한 줄로 끝내기 (0) | 2020.12.11 |