1. 정의
워크시트의 edate함수는 지정된 월만큼 떨어진 날짜를 반환해 주는데,
이것도 비슷하면서 훨씬 다양한 기간을 지정할 수 있는 VBA의 함수가 DateAdd 함수입니다.
2. 구문
DateAdd(간격, 숫자, 날짜)
- 간격(interval) : VBA DateDiff함수에서 사용되는 interval과 같습니다.
Setting | Description |
yyyy | Year (연) |
q | Quarter (분기) |
m | Month (월) |
y | Day of year (몇번째 날) |
d | Day (일) |
w | Weekday (같은 요일에 해당하는 주의 수) |
ww | Week (firstdayofweek 설정에 따라 일요일인 경우는 일요일부터 일요일까지의 주의 수) |
h | Hour (시) |
n | Minute (분) |
s | Second (초) |
- w와 ww의 차이점
간격이 요일(weekday, "w")인 경우 DateDiff는 두 날짜 사이의 주 수를 반환합니다. date1이 월요일이면 DateDiff는 date2까지의 월요일 수를 계산합니다. date2는 계산하지만 date1은 계산하지 않습니다. 그러나 간격이 주(week, "ww")인 경우 DateDiff 함수는 firstdayofweek 설정에 따라 달력을 기준으로 두 날짜 사이의 주 수를 반환합니다. firstdayofweek 설정이 vbSunday이거나 지정하지 않으면, date1과 date2 사이의 일요일 수를 계산합니다. DateDiff는 date2가 일요일이면 계산하며, date1이 일요일이더라도 date1은 계산되지 않습니다. |
- 숫자 : 정수로 지정하는데, 소수점이하 자릿수가 있으면 dateadd를 계산하기 전에 양수는 반올림, 음수는 가장 가까운 정수로 올림 됩니다.
다시 설명하면, 양수일 경우는 반올림되므로 간단한데,
음수일 때는 반올림을 하는 것이 아니라 0에 가까운 정수로 반환된다는 것입니다. 다시 말해 -3.2가 -3이 되는 것은 round함수를 사용했을 때나 ceiling함수를 사용했을 때나 같은데, -3.6일 때는 5보다 크므로 반올림 처리 대상이 되는데, round함수를 사용하면 -4가 되고, ceiling함수를 사용하면 -3이 됩니다.
나중에 사례를 살펴볼 때 다시 한번 더 검증하도록 하겠습니다.
- 날짜 : 날짜입니다. 숫자 또는 날짜 형식으로 입력하는데, 큰따옴표 안에 텍스트 형식으로 넣어도 됩니다.
3. 준비
(1) 간격에 해당하는 문자를 J2셀부터 J11셀까지 입력합니다.
(2) E2셀부터 E5셀에 데이터 유효성 검사 기능을 이용해 목록을 만듭니다.
① E2셀부터 E5셀을 선택한 다음 데이터 탭 > 데이터 도구 그룹에서 데이터 유효성 검사 명령을 누릅니다.
② 아래와 같이 데이터 유효성 창이 표시되는데, 제한 대상의 모든 값을 클릭한 다음
③ 목록을 선택합니다. 그리고 원본 아래 입력 칸을 클릭한 후
④ 마우스로 J2셀부터 J11셀까지 끕니다. 그리고, 아래 확인 버튼을 누릅니다.
⑤ 그러면 E2셀에 콤보 상자 버튼이 생깁니다.
콤보상자 버튼을 누르면 그러면 목록으로 지정된 yyyy, q, m 등이 표시됩니다.
⑥ 숫자란에 A2셀부터 A5셀이 표시되도록
F2셀에 =A2라고 입력하고, F2셀의 채우기 핸들을 F5셀까지 끌어 수식을 복사합니다.
4. EDate함수로 몇 개월 전후의 날짜 구하기
G2셀에 =edate("2023-04-18",f2) 라고 입력합니다. 그러면 45125라고 표시되는데,
홈 탭 > 표시형식 그룹에서 표시 형식을 간단한 날짜로 변경하면
3개월 후인 2023-07-18이 구해집니다.
G2셀의 채우기 핸들을 더블 클릭해서 G5셀까지 수식을 복사합니다.
그러면 G2셀과 G3셀은 3개월 후, G4셀과 G5셀은 3개월 전 날짜를 구해줍니다.
5. VBA로 DateAdd함수 적용하기
가. 코드 작성
먼저 개발도구 - Visual Basic을 클릭해서 VB Editor로 들어간 다음
왼쪽 탐색기 창에서 dateadd.xlsx 파일을 클릭한 후 삽입 메뉴에서 모듈을 눌러 모듈을 추가합니다.
그리고, 모듈 아래 Module1을 더블 클릭한 후 오른쪽 에디터 창에 아래와 같이 코드를 추가합니다.
Dim i As Integer
Sub dateadd1()
For i = 2 To 5
Range("h" & i) = DateAdd(Range("e" & i), Range("f" & i), Now())
Next
End Sub
나. 코드 설명
Dim i As Integer : i변수를 정수 형식을 선언합니다. sub 프러시저 dateadd1의 밖에 둬서 모듈에 모두 적용되는 전역변수로 선언했습니다.
Sub dateadd1() End Sub |
sub 프로시저의 이름은 dateadd1이며, End Sub로 끝납니다.
For i = 2 To 5 Range("h" & i) = DateAdd(Range("e" & i), Range("f" & i), Now()) Next |
For 반복문으로 Next와 사이의 구문이 i값이 2에서 5까지 변하는 동안 반복 실행됩니다.
Range("h" & i) = DateAdd(Range("e" & i), Range("f" & i), Now()) : h열 i행에 DateAdd함수로 계산한 값을 대입합니다.
DateAdd의 인수는 간격, 숫자, 날짜인데, 간격은 E열에서 가져오고, 숫자는 F열, 그리고 날짜는 지금으로 지정합니다.
다. 코드 실행
에디터에서 파일 메뉴 "엑셀로 돌아가가"를 눌러 엑셀로 돌아갑니다.
매크로 실행 전 간격 값을 설정해야 하므로, 모두 연 단위로 지정하기 위해 E2셀부터 E5셀까지 yyyy를 선택합니다
간격 값을 선택할 때 콤보 상자 버튼을 누를 필요 없이 Alt + ↓ 키를 누른 다음 선택할 수도 있습니다.
이제 개발도구 - 매크로 메뉴를 누른 다음 매크로 이름 목록에서 dateadd1을 클릭하고, 오른쪽 실행 버튼을 누릅니다.
그러면 H2셀과 H3셀은 3년 후 지금 날짜와 시간이 표시되고, H4셀과 H5셀은 3년 전 지금 날짜와 시간이 표시됩니다.
라. Edate값과의 비교
G열의 EDate함숫값을 구할 때 3개월 전후로 구해졌는데, F열의 값에 12를 곱해서 3년 전후의 값을 구해보도록 하겠습니다.
수식에서 F2라고 되어 있는 부분을 F2*12로 바꾸고, 채우기 핸들을 더블 클릭하면 됩니다.
그러면 3년 전후의 날짜가 구해지지 않습니다.
G2셀의 값을 2023-04-18과 비교해 보니 2개월이 더 많아서 38개월이 됩니다.
생각해 보니 3.2*12 해서 38이 된 것입니다.
DateAdd함수를 적용할 때는 소수가 있을 경우 반올림 또는 Ceiling함수를 적용해서 소수점이하 숫자를 없애고 전후의 날짜를 구하는 것과 다른 점입니다.
마. 매크로가 포함된 엑셀 파일 저장
매크로가 포함된 엑셀 파일을 저장하려고 하면 아래와 같이 매크로 사용 파일 형식으로 저장하라고 하므로, 아니요 버튼을 누른 후
파일 형식을 Exel 매크로 사용 통합 문서를 선택한 다음 저장합니다.
그러면 확장자가 xlsx에서 xlsm으로 바뀝니다.
바. VBA의 한계
간격 값을 yyyy에서 m으로 바꿔도 H열의 값이 자동으로 바뀌지 않습니다.
이것에 대한 해결책은 다음 편에서 다루도록 하겠습니다.
'EXCEL - VBA' 카테고리의 다른 글
두 문장의 같은 단어 비교(1) - 매크로 작성 (3) | 2023.05.08 |
---|---|
DateAdd함수 - 지정된 기간만큼 떨어진 날짜를 반환(2) - 값 자동 변경 (0) | 2023.04.19 |
날짜간의 차이 계산(4) - VBA DateDiff 함수 (0) | 2023.04.10 |
일정한 간격으로 된 값 합계 구하기 - 매크로 (2) | 2023.03.21 |
일정한 간격으로 된 값 합계 구하기 - 사용자 정의 함수 (2) | 2023.03.20 |