rand(life)

[vba] 날짜, 시간 관련 함수 본문

컴퓨터/엑셀

[vba] 날짜, 시간 관련 함수

flogsta 2017. 7. 16. 15:45

now 현재의 날짜와 시간 (ex: 2017-07-16 오후 3:17:23)

date 현재의 날짜만 (ex: 2017-07-16)

time 현재의 시간만 (ex: 오후 3:17:59 )

weekday(날짜, 옵션) 요일

      옵션: 주의 첫요일 설정한다.

      상수: 1 일요일, 2 월요일 3, 화요일...

     결과값: 1~7의 숫자로 나옴

예를 들어, weekday(date, vbmonday) 라고하면 오늘 날짜가 무슨 요일인지를 월요일을 1로 해서 숫자로 알려준다. 이 글을 쓰는 날은 일요일ㅇ이므로,  7이 나온다.

만약, weekday(date, vbsunday)라고 했다면 1이 나온다.


DatePart (옵션, 날짜/시간): 날짜.시간에서 필요한 부분 추출

옵션: yyyy 년도, q 분기, m 달, y 년 중 몇번째 날, d 날짜, w 요일, ww 년 중 몇번째 주, h 시, n 분, s 초


DateAdd (옵션, 숫자, 날짜/시간): 날짜 덧셈

옵션: 간격의 단위로, DatePart함수의 옵션과 같다.

DateAdd("yyyy", 1, now) 오늘로부터 1년 뒤의 날짜를 구한다


DateDiff(옵션, 날짜1, 날짜2, [한주의 시작요일], [일년의 시작주]): 날짜 뺄셈

옵션: 계산의 단위로, DatePart함수의 옵션과 같다.

DateDiff("m", #7/30/98#, #8/1/98#) 98년7월30일과 98년8월1일 사이의 개월 차이 = 1


문자열을 날짜로 바꾸는 함수

DateValue("08 28 98")   '날짜만

DateValue("Aug 28 98")

TimeValue("5:00 PM")  '시간만

TimeValue("17:00")

CDate("Aug 28 98 5:00 PM") '날짜와 시간 모두

[출처] WikiDocs.net


--응용1--

앞의 셀의 날짜 이후로 날짜를 설정하는데, 주말과 공휴일은 제외하고  날짜를 설정하려고 한다.

wsH 시트의 A열에는 공휴일(어린이날, 광복절....)의 날짜를 적어둔다.

dd = r.Value  '앞 셀의 날짜  

Do
    dd = dd + 1  '그 다음 날짜
    If Weekday(dd, vbMonday) < 6 And _
       WorksheetFunction.CountIf(wsH.Columns(1), dd) = 0 Then Exit Do
    ' 그 다음 날짜가 토,일이 아니고 공휴일 시트의 A열에 없다면 Do 순환문을 빠져나온다
    Loop
rng.Columns(r.Column) = Format(dd, "mm") & "/" & Format(dd, "dd")

'Format("mm/dd")로 하면 10/30 이 아니라 10-30으로 바뀌어져서, 부득이하게 이런 방법을 썼다.


--응용2--

폴더 안에 날짜 형태로 저장된 파일이 있다. (0713.xml, 0714.xml....)

가장 최근 날짜의 다음 날짜로 파일이름을 저장하려고 한다.

위와 마찬가지로, 주말및 공휴일은 제외한다.

sPath = "d:\temp2\" '파일 저장된 폴더
sFname = Dir(sPath & "*.xml") '폴더에서 xml파일 이름 얻기

Do
If Len(sFname) > 0 Then
ReDim Preserve a(i)
a(i) = CLng(Left(sFname, 4)) '날짜 부분을 숫자 형식으로 변환. (뒤에 최대값을 구하기위해)
i = i + 1
End If
sFname = Dir() '폴더에서 다른 xml파일 이름 얻기
Loop Until Len(sFname)=0

stemp = CStr(WorksheetFunction.Max(a)) '최대값을 문자열형식으로 변환 (DateValue함수는 문자열을 인수로 받으므로)
dd = DateValue(Left(stemp, Len(stemp) - 2) & " " & Right(stemp, 2))

'날짜로 변환. 위에서 숫자로 바꾸었기때문에 0730같은 경우 730으로 변환되었으므로, 2가 아니라 Len(stemp) - 2와 같이 처리
Set wsh = Sheets("공휴일")

    Do
    dd = dd + 1  '그 다음 날짜
    If Weekday(dd, vbMonday) < 6 And _
       WorksheetFunction.CountIf(wsh.Columns(1), dd) = 0 Then Exit Do
    ' 그 다음 날짜가 토,일이 아니고 공휴일 시트의 A열에 없다면 Do 순환문을 빠져나온다
    Loop

sFname = Format(dd, "mmdd") '저장할 파일이름 설정