날짜/시간관련함수
VBA에서 날짜는 8바이트의 부동소수점(floating-point) 값입니다. 정수부분은 1899년 12월 30일 이후의 날짜이며, 소수부분은 저장된 시간을 나타냅니다. 예를 들어, 1998년 8월 22일 오후 3시는 36029.625인데, 정수부분인 36029는 1998년 8월 22일이 1899년 12월 30일 이후부터 36029번째 날이며, 0.625는 하루를 1로 보았을 때 그중 62.5%인 오후 3시라는 의미입니다.
본격적인 날짜/시간 관련 함수와 실행문을 설명하기 앞서 먼저 알아둘 것은 날짜 리터럴(literal)입니다. VBA에서 문자열은 ““안에 둘러싸인 문자를 문자열로 보는 것과 마찬가지로 날짜 표시는 # #사이에 둡니다. 가령, 1998년 8월 22일은 #8/22/1998# 이고, 오늘 오후 3시는 #03:00 PM# 입니다. 만일 둘을 묶어 표시하면 #8/22/98 3:00:00 PM# 입니다.
현재시점 알아내기
VBA는 컴퓨터의 하드웨어에서 현재의 날짜, 시간등을 읽어 오는데 다음과 같은 함수를 이용한다.
함수 설명
Now | 현재의 날짜와 시간을 돌려준다 |
Date | 현재의 날짜만 돌려준다 |
Time | 현재의 시간만 돌려준다 |
Sub demoPresent()
Dim aAs Date
a = Now
MsgBox a
a = Date
MsgBox a
a = Time
MsgBox a
EndSub
위의 예와 같이 날짜/시간 함수의 값을 제대로 받으려면 변수(여기서는 a) 역시 Date형이어야 합니다. Date와 Time 함수는 현재의 날짜와 시간을 반환하는 역할도 하지만, 반대로 # #에 싸인 날짜나 시간을 받아 현재의 날짜와 시간을 변경하는 역할도 합니다. 예를 들어, 날짜를 98년 8월 23일 자정으로 하려면 다음과 같이 하면 됩니다.
Sub demoAdjustSystemClock()
Date = #8/23/98#
Time = #12:00:00 AM#
MsgBox Now
EndSub
필요부분 추출
날짜/시간를 다루면서 날짜만 필요하거나 시간부분만 필요할 수 있다. 먼저 날짜부분만을 다루기 위해 DateValue( )라는 함수가 있다.
Sub demoDateValue( )
MsgBox DateValue(Now)
End Sub
시간만 뽑아내려면 TimeValue( )함수를 사용한다.
Sub demoTimeValue( )
MsgBox TimeValue(Now)
End Sub
DateValue( )와 TimeValue( )함수는 나중에 나오는 문자열을 날짜로 변화하는 기능도 있다.
이외에도 년도, 월, 날, 시간, 분, 초등을 추출하는 함수는 아래 표와 같다.
함수 반환값
Year ( ) | 날짜 값에서 년도에 해당하는 부분 |
Month( ) | 날짜 값에서 월에 해당하는 부분 |
Day( ) | 날짜 값에서 날에 해당하는 부분 |
Hour( ) | 날짜 값에서 시간에 해당하는 부분 |
Minute( ) | 날짜 값에서 분에 해당하는 부분 |
Second( ) | 날짜 값에서 초에 해당하는 부분 |
WeekDay( ) | 날짜 값에서 요일에 해당하는 부분 |
DatePart( ) | 위의 모든 것을 해준다. |
Sub demoDetect()
MsgBox Year(Now)
MsgBox Month(Now)
MsgBox Day(Now)
MsgBox Hour(Now)
MsgBox Minute(Now)
MsgBox Second(Now)
End Sub
위의 표에서 WeekDay( )함수는 요일을 반환하지만 “월”,”화,”수”,…등등으로 반환하는 것이 아니라 아래의 표와 같이 숫자값으로 반환한다.
Weekday(날짜, 옵션)
옵션은 주중 첫 날을 지정하는 상수값으로 일요일이 주의 첫요일인가 월요일이 주의 요일의 시작인가를 정하는것이다. 지정되지 않았다면 일요일(vbSunday)으로 한다.
옵션은 다음과 같이 같다.
상수 값 설명
vbUseSystem | 0 | NLS API 설정을 사용. |
VbSunday | 1 | 일요일 (기본값) |
vbMonday | 2 | 월요일 |
vbTuesday | 3 | 화요일 |
vbWednesday | 4 | 수요일 |
vbThursday | 5 | 목요일 |
vbFriday | 6 | 금요일 |
vbSaturday | 7 | 토요일 |
반환값 WeekDay 함수는 다음과 같은 값중의 하나를 반환한다:
상수 값 설명
vbSunday | 1 | 일요일 |
vbMonday | 2 | 월요일 |
vbTuesday | 3 | 화요일 |
vbWednesday | 4 | 수요일 |
vbThursday | 5 | 목요일 |
vbFriday | 6 | 금요일 |
vbSaturday | 7 | 토요일 |
Sub demoWeekDay()
SelectCase WeekDay(Now)
Case vbSunday
MsgBox "Today is Sunday"
Case vbMonday
MsgBox "Today is Monday"
Case vbTuesday
MsgBox "Today is Tuesday"
Case vbWednesday
MsgBox "Today is Wednesday"
Case vbThursday
MsgBox "Today is Thursday"
Case vbFriday
MsgBox "Today is Friday"
Case vbSaturday
MsgBox "Today is Saturday"
EndSelectEndSub
DatePart( )함수는 위의 모든 것을 다룰 수 있다. 그래서 이것 하나만 알아두면 날짜/시간에서 필요한 부분을 모두 추출할 수 있다.
DatePart( )함수의 옵션은 아래 표와 같다.
옵션 설명
yyyy | 년도 |
q | 분기 |
m | 달 |
y | 년중 몇번째 날 |
d | 날짜 |
w | 요일 |
ww | 년중 몇번째 주 |
h | 시 |
n | 분 |
s | 초 |
특히 y와 ww옵션은 1월1일1부터 계산하여 지정한 시간까지 지나온 날의 수와 주의 수를 되돌려준다.
Sub demoDatePart()
MsgBox DatePart("yyyy", Now)
MsgBox DatePart("q", Now)
MsgBox DatePart("m", Now)
MsgBox DatePart("y", Now)
MsgBox DatePart("d", Now)
MsgBox DatePart("w", Now)
MsgBox DatePart("ww", Now)
MsgBox DatePart("h", Now)
MsgBox DatePart("n", Now)
MsgBox DatePart("s", Now)
End Sub
위의 예에서 h,n,s옵션사용시 주의할 점이 있는데 위의 예와 같이 Now대신 Date를 사용하면 ‘0’을 출력한다. 이는 Date함수가 시간에 대한 자료를 제공하지 않기 때문이다.
날짜연산
VBA는 날짜/시간을 8바이트 부동소수점으로 처리하기 때문에 날짜나 시간을 더하거나 빼는 경우 수치를 다루는 것과 마찬가지로 +/-를 사용할 수 있습니다. 그러나 이 방법은 정확하지 않을 수 있으며, VBA는 더 정확하고 편리한 더하고 빼는 DateAdd( )와 DateDiff( ) 함수를 제공합니다.
날짜덧셈
DateAdd( )함수를 이용하여 날짜,월,년등을 더할 수 있다. DateAdd함수는 다음과 같이 사용한다.
datReturn=DateAdd(Interval,Number,Date)
Interval이란 연산할 시간의 간격을 나타내는 것으로 앞서 배운 DatePart( )함수의 옵션과 같다.
옵션 설명
yyyy | 년도 |
q | 분기 |
m | 달 |
y | 년중 몇번째 날 |
d | 날짜 |
w | 요일 |
ww | 년중 몇번째 주 |
h | 시 |
n | 분 |
s | 초 |
Number는 더해지는 값입니다. 예를 들어, Interval이 "yyyy"인 경우 Number가 1이면 1년을 더하는 것이며, Interval이 "q"인 경우 Number가 1이면 1분기를 더하는 것입니다. Date는 덧셈의 기준이 되는 날짜입니다. 예를 들어, 앞으로 1년 후의 오늘이 무슨 요일인지 알고 싶다면, DateAdd() 함수와 WeekDay() 함수를 조합하여 다음과 같이 사용할 수 있습니다.
Sub demoDateAdd()
Dim OneYearLaterAs Date
OneYearLater = DateAdd("yyyy", 1, Now)
SelectCase WeekDay(OneYearLater)
Case vbSunday
MsgBox "This day of the next year is Sunday"
Case vbMonday
MsgBox "This day of the next year is Monday"
Case vbTuesday
MsgBox "This day of the next year is Tuesday"
Case vbWednesday
MsgBox "This day of the next year is Wednesday"
Case vbThursday
MsgBox "This day of the next year is Thursday"
Case vbFriday
MsgBox "This day of the next year is Friday"
Case vbSaturday
MsgBox "This day of the next year is Saturday"
EndSelectEndSub
날짜뺄셈
DateDiff( )함수는 두날짜간의 시간간격을 알려준다. DateDiff( )함수는 다음과 같이 사용한다.
datReturn=DateDiff(Interval,Date1,Date2,FirstDayOfWeek,FirstWeekOfYear)
Interval은 DateAdd( )함수와 같다.
- Date1,Date2는 계산에 사용되는 날짜
- FirstDayOfWeek 한주를 시작하는 요일로서 선택사항이다.
- FirstWeekOfYear 일년을 시작하는 주로서 역시 선택사항이다.
다음의 예는 사용자로부터 “98-09-11” 같은 날짜입력을 받으면 현재부터 입력한 날까지의 날짜수를 돌려준다.
Sub demoDateDiff()
Dim TheDateAs Date
TheDate = InputBox("Enter a date")
MsgBox "Days from today: " & DateDiff("d", Now, TheDate)
EndSub
날짜뺄셈에서는 주의할 점이 있다 . 다음예를 보자.
Sub demoDateDiff1()
MsgBox DateDiff("h", #10:00:00 AM#, #12:59:59 PM#)
EndSub
위에서 12시59분에서 10시까지는 거의 3시간이지만 DateDiff( )함수는 Interval이 “h”이므로 단순히 시간계산만 한다(즉 12시-10시).
Sub demoDateDiff2()
MsgBox DateDiff("m", #7/30/98#, #8/1/98#)
End Sub
위의 예에선 날짜로 따지면 이틀간이지만 달이 바꿔었으므로 1을 돌려준다.
이는 DateDiff( )함수가 전적으로 Interval을 기준으로 계산하기 때문이다.
날짜변환
프로그램을 짜다보면 날짜 형식으로 입력된 문자열을 계산을 위해 실제 날짜 데이터로 바꿀 필요가 있습니다. VBA는 DateValue( ), TimeValue( ), CDate( ) 등 날짜 변환에 이용되는 3가지 함수를 제공합니다.
DateValue( )는 문자열 중 날짜 포맷과 일치하는 부분을 변환시키며 이름에서 알 수 있듯이 시간 부분은 무시합니다. 마찬가지로 TimeValue( )는 날짜 부분은 무시하고 시간 부분만 변환합니다. CDate( ) 함수는 문자열을 변환하여 날짜와 시간 부분을 모두 변환합니다. CDate 함수는 허용 가능한 날짜 범위 안의 숫자뿐만 아니라 Date 문자열과 시간 문자열을 인식합니다. 숫자를 날짜로 변환할 때는 숫자 전체가 날짜로 바뀌며 숫자 중 소수점 부분은 자정을 시작으로 하여 시간 단위로 변환합니다.
'excel VBA' 카테고리의 다른 글
엑셀 VBA 작업 범위 지정 (0) | 2023.08.30 |
---|---|
엑셀의 구조 (0) | 2023.08.30 |
엑셀 VBA 변수, 배열 및 선언하기 (0) | 2023.08.30 |
엑셀 VBA 데이터 타입 정리 (0) | 2023.08.30 |
엑셀 VBA while (0) | 2023.08.30 |
댓글