Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

Working With Dates and Times_1
|DateSerial()|DateValue()|Day()|Month()|Year()|
|DateDiff()|Now()|Date()|Time()|Format()|
|FormatDateTime()|

컴퓨터프로그래밍에서 날자에 대한 관심이 없다면
분석은 날샌것이다
왜냐하면 대개의 분석은 일별,월별,분기별,년별등으로
제일 먼저 알고 싶어하는것을 만족시켜 주어야 한다
그런데 날짜나 시간의 개념이 없다면..문제다!!
엑셀을 한다고 하는 분들의 워크시트를 볼때
날짜를 잘 다루고 있는지를 먼저 보면 어느 정도인지 알수 있다

현재시간과 현재날자를 얻어내기

기본적으로 날자를 얻어 내는 함수는
Now함수
Date함수
Time함수
이것은 엑셀의 워크시트함수의 Now,Time,Today함수에 해당한다
Now함수는 시간과 날자를 모두 돌려주고
Date함수는 날자만,Time은 시간부분만 돌려준다
직접실행창에서 실행해보면 아래와 같겠고..
직접실행창은 디버깅도구로도 좋지만 학습을 할때도 유용하니 잘활용하시기 바란다



변수의 선언은 아래와 같이 Date타입변수를
선언하고 사용한다

Dim datX As Date

이 Data타입은 사이즈가 8바이트이고
소수점이하의 값(Floating-Point Value)도 담는다
그래서 100년1월1일서 부터 9999년1월1월까지를 담을수 있다
엑셀의 워크시트의 셀에서 1에 해당하는 날자는 1900년1월1일에
비하면 더 많은 날자를 처리하는 셈이다

날자의 서식/Formatting Date,Time

엑셀워크시트함수에서 Text함수로 서식을 했었다
VB에서는 두가지 함수가 있다
하나는 오래전부터 있던 Format()함수이고
최근버전부터는 FormatDateTime()함수가 추가 되었다
엑셀프로그래밍을 할때는 실은 위의 함수가 필요없다
엑셀시트상의 셀의 서식을 해주는것이 바람직하다
그런데 무엇때문에 이따위 함수들이 필요할까??
VB는 엑셀에서만 사용하는것이 아니고
다양한 프렛폼(워드,억세스,파워포인트등..)에서
작업을 하는것이기 때문에 그럴때 필요한것이다
그래서 알아 두어도 손해볼것 하나도 없다
그래서 엑셀이 좋고,VB가 좋은것이다

FormatDateTime함수의 각각의 인수에 따른 결과값을 보고 싶으면
아래의 프로시져를 편집기내에 붙여넣고 직접실행창을 열어놓은 상태에서
실행시켜보시면 볼수 있다

또한 배열을 순환할때
For Each ~ Next문이 유용하다
이때 배열의 요소하나하나를 순환하는 변수는 반드시 Variant타입임을
잊지 마시고

Sub useFormat()
Dim lType As Variant, datX As Date, vX As Variant
datX = Now
lType = Array(vbGeneralDate, vbLongDate, vbShortDate, vbLongTime, vbShortTime)
For Each vX In lType
     Debug.Print FormatDateTime(datX, vX)
Next
End Sub

배열을 잡아넣기 위하여 Array함수를 위와 같이 활용하면 효율적인것이다
Array 함수없이 배열에 잡아 넣으려면 피곤하다
배열은 FormatDateTime함수의 두번째 인수 서식타입을 지정하는 상수이다



그리고 Array함수에서 만들어낸 배열은 반드시 Variant타입변수에
담아야 된다는 점 잊지 마시고

그리고 직접실행창을 잘 활용하시면 위와 같은 배열에서
쏟아내는 각각의 값을 쉽게 테스트해볼수 있다는 점도
잘 챙기시고..

Format함수는 워크시트함수인 Text함수와 같다고 보시면 된다
Format(날자값,""yyyy년mm월dd일 dddd"")
라고 하면
2005년03월01일 Tuesday
와 같이 나온다
이것도 각자가 직접실행창에서 실행해 보시기 바란다

두날자의 사이의 계산

주어진 두날자의 차이를 계산하는것은 프로그래밍의 기본일것이다
엑셀의 워크시트함수에서는 DateDif함수가 있고
=DATEDIF(TODAY(),TODAY()+3,"d")
위의 함수는 참 융통성없이 만들어 졌다..큰날자가 반드시
두번째인수여야 한다는 점..그렇지 않으면 #NUM!에러를 낸다
초보님들이 헷갈려한다..
그러나 또 다른 좋은 점도 있다
다음 페이지에 나온다
VB에서는 스펠이 하나 더 추가된
DATEDIFF()함수가 있다

Dim intDif As Integer
intDif=datediff("d",now()+15,now()+10)

인수의 위치가 워크시트함수와 틀리고
큰날자가 첫번째인수로 오면 음수의 결과값을 준다
워크시트함수보다 훨 융통성이 있다
아무튼 함수들의 성질머리를 잘 알고 상황에 따라서 적절히 활용하면 된다

년도값,월값,일자값을 받아서 날자를 만들고 싶다

워크시트함수의 Date함수와 같은 역할을 한다
이런 함수가 왜 필요할까..??년도값 따로 받고..월값 따로 받고..
일자값을 따로 받을 일이 있을까???
당연하지..!!얼마던지 그런일이 많지!!
아래의 날자를 반복하여 크릭하여 보시기 바란다

2024-05-02

날자가 하루씩 증가함을 보았을것이다

sub increseDay(oX)
dim datX 
	datX=DateValue(oX.innerHTML)
	oX.innerHTML=DateSerial(year(datX),month(datX),day(datX)+1)
end sub

마지막 Day값에서 +1을 한것을 보았을것이다
+1한값을 DateSerial함수의 세번째인수로 주면 해당 날자를 얻어내는것이다
Year함수,Month함수,Day함수는 워크시트함수에서 이미 다 알고 있는것이다

또한 위에서 DateValue함수는 날자를 문자열정보로 받아서 해당날자를 얻어 낸다
이건 또 뭔소린가.."2005/3/3"은 따옴표로 쌓여진 문자열정보이다
날자는 숫자정보인것이니 둘은 모양만 같을뿐이지 종자가 전혀 틀린 녀석들이다

그래서 문자열정보로 날자를 받았다면 날자계산을 위해서는 반드시
DateValue함수에 한번 거쳐서 새로 태어나게 하여야 할것 같고..
그렇지 않으면 Year함수나 Month함수등이 에러가 날것 같으나

Dim sDate As String,iMonth As Integer
sDate="2005/3/5"
iMonth=Month(sDate)----에러발생할것 같지만 그냥 정상처리된다
iMonth=Month(DateValue(sDate))---정상적 처리

와 같이 되는 것이다
실은 문법과 형식이 엄격하지 않은것(다른 언어에 비교하여)이
개인적으로 볼때 오히려 헷갈림이 되기도 한다
엄격한것이 스스로 생각을 많이 하게 만들지만 헐렁하면
알아서 처리해주겠지 하는 게으름이 생긴다
Month,Day,Year함수가 영특해서 문자열정보를 스스로 해석하고
날자로 인식되면 해당 달,월,일자를 내보내준다
테스트해보시기 바란다
DateValue함수도 역시 워크시트함수로서 같은 이름이 있고
기능도 똑같다

또한 날자는 아래와 같이 표현하기도 한다

Dim datX As Date
datX=#2005/3/3#
MsgBox datX+1

을 실행하면 메시지박스에 1이 추가된 날자 2005/3/4을 나타낸다
직접실행창에서 아래와 같이 입력하고 엔터키를 치면

?#2005/3/3#+1

1이 추가된 아래와 같은 결과값을 얻는다
2005-03-04

#으로 둘러쌓주면 그 자체가 날자인것이다

DateSerial함수의 특별히 좋은 점은 달이나 일자가 12월이나 31일을
훨씬 초과해도 스스로 계산해서 달과 년도를 추가변동시켜준다는 점이다
예를 들어 아래와 같은 값은

dateserial(2005,23,34)

2006-12-04 라는 함수의 결과값이 되는것이다

그 반면 DateVale("2005/23/34") 혹은 #2005/23/34#는 에러가 발생하니까
DateSerial함수를 잘 활용하도록 함이 좋을것이다