Working With Dates and Times_2
|DateSerial()|Year()|Now()|Month()|Weekday()|
|WeekDayName()|Array()|DateDiff()|Application|
|WorkSheetFunction|DateAdd()|
날자와 시간은 프로그래밍에 있어서 아주 중요한 부분이다
특히 DateSerial함수같은것은 자유스롭게 활용할수 있어야 한다
몇가지 예를 보도록 하자
주어진 날자의 해당월에서 첫째날자 찾기
이런 소리를 하면 초보님들은 ..뭔소리야??!@#헷갈려한다
카렌다를 보면 되지??무얼 하려고 찾아??
이런 의아함을 갖는다!!
프로그래밍은 모든 필요한 정보를 컴퓨터가
스스로 만들어 나가도록 하는것이다..
물론 몇개의 정보를 준후..
직접실행창에 아래와 같이 입력후 엔터키를 치면
?DateSerial(Year(Now()),Month(Now()),1)
현재 날자가 해당하는 달의 첫째날자를 얻어낸다
또 위의 날자가 무슨 요일인지 알고 싶다면
?weekday(DateSerial(Year(Now()),Month(Now()),1))
라고 하면 요일에 해당하는 숫자가 나타난다..
WeekDay함수는 날자를 받아서 해당하는 날자의 몇번째요일인가??
숫자값을 준다..
알고 싶은것은 일요일,월요일같은 문자열인데..
그렇다면 또 다른 함수가 준비 되어있다..아래와 같이 실행보시면
?weekdayname(weekday(DateSerial(Year(Now()),Month(Now()),1)))
이런 식으로 함수를 적절히 확장응용하는것이 프로그래밍이기도 하다
또 WeekDayName에서 얻어지는 요일을 나타내는 문자열이 마음에 안든다면
이렇게 만들어서 사용하면 된다
Dim sWeek As Variant,sWeekName As String
sWeek=Array("SUN","MON","TUE","WEN","THR","FRI","SAT")
sWeekName=sWeek(weekday(DateSerial(Year(Now()),Month(Now()),1)))
라고 하면 배열에 설정된 표현하고 싶은 요일의 문자열을
sWeekName변수에 전달되게 되는것이다
초보님들은 위의 중첩된 표현식을 보면 공포에 떤다
그렇다면 차분하게 하나씩 아래와 같이 처리해도 된다
Dim sWeek As Variant,sWeekName As String
Dim iYear As Integer,iMonth As Integer,datNow As Date
Dim iWeekNum As Integer
sWeek=Array("SUN","MON","TUE","WEN","THR","FRI","SAT")
datNow=Now()
iMonth=Month(datNow)
iYear=Year(datNow)
datNow=DateSerial(iYear,iMonth,1)
iWeekNum=WeekDay(datNow)
sWeekName=sWeek(iWeekNum)
그러나 ..이렇게 작성할 만큼 머리가 헷갈려 한다면 곤란하겠지
변수는 같은 값을 여러번 사용하여야 하는 경우 사용하는것이 좋은것이다
자꾸 숙달이 되어서 아주 깊숙히 중첩된 수식도 한눈에 처~억
들어올때까지 이 페이지가 닳아 떨어질때까지 보시고 숙달시키시기 바란다
날자함수를 응용하여 정확한 날자를 계산해 보자
워크시트함수를 이용하여 정확한 기간을
몇년몇개월몇일을 계산할수 있을것이다
A1셀에 입사일자를 입력하고 오늘날자(Today())
입사기간이
몇년몇개월몇일은 아래와 같이
계산할수 있을것이다
=DATEDIF(A1,Today(),"y") & "년" & DATEDIF(A1,Today(),"ym") & "개월" & DATEDIF(A1,Today(),"md") & "일"
이것을 VB에서 만들어 보자
아쉽게도 VB의 DateDiff함수는 DateDif함수의 두번째인수인
년도를 뺀후의 남는 일자에서 개월을 계산하라는 ym
개월을 뺀후의 남는 일자에서 일수를 계산하라는 md
같은것을 지원하지 않는다
아래의 화일에 VB로 사용자정의함수를 하나 만들어 보자
이미 워크시트함수에서 제공하는 기능은 그냥 응용을 하면
되는것이라서 필요없는 짓이지만
Application.WorkSheetFunction.워크시트함수이름()
로 VB에서 호출하여 사용하면 된다
혹은 WorksheetFunction을 생략하고 아래와 같이 호출하여도 된다
Application.워크시트함수이름()
그러나,프로그래밍에 있어서 날자에 대한 감각은 절대적으로 필요한것이다,
Handle Date Time Data
날자에 날자를 더하고 빼기
몇일날자에 몇일이 지난후의 날자를 얻고 싶을때가 있기도 하고
오늘날자에서 몇일전의 날자를 얻고 싶기도 할것이다
워크시트함수에서는 그냥 날자에 숫자를 더하면 되었고
VB에서도 그냥 날자에 +몇일 ,-몇일 하면 된다
그러나 오늘날자에서 3개월전의 날자를 원한다고 하면
예를 들어서 갑돌이가 갑순이를 처음 만난것이
2005년10월10일인데..100일이 되는 날 커플링을 하나씩
끼기로 하였다
그날자가 몇일이고 무슨요일인지 알고 싶은것이다
Dim datFirstMeet As Date,sWeek As String
Dim dat100SinceFirst As Date
datFirstMeet=#2005/10/10#
dat100SinceFirt=DateAdd("d",100,datFirstMeet)
sWeek=WeekDayName(WeekDay(dat100SinceFirst))
원하는 값을 dat100SinceFirst변수에 날자를
sWeek변수에는 해당날자의 요일을 얻게 된다
아주 유용한 함수이므로 잘 활용하셔야 할것이다
중요한것은 첫번째인수를 일자를 증감시킬것인지..
아니면 년도를 증감시킬것인지를 아래의 표를 참조하시면 된다
설정 | 설명 |
yyyy | 연도 |
q | 분기 |
m | 월 |
y | 일(일년 기준) |
d | 일 |
w | 요일 |
ww | 주 |
h | 시간 |
n | 분 |
s | 초 |
이렇게 함수들은
다양하게 프로그래밍을 하는데 필요한 역할을 해준다
워크시트함수가 워크시트의 수식을 화려하게 해주듯이
VB를 사용한 프로그래밍에서도 VB함수들이 화려함을 도와준다
앞으로 진행하면서 계속 반복하여 나올것이고..
위의 정도가 기본적으로 알아야 할 날자와 시간함수인것이다