- 최초 작성일: 2007-08-02
- 최종 수정일: 2026-09-30
- 조회수: 14 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 특정한 주의 날짜 알아내기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
PC도 더위를 타는지 집 PC가 이맘 때면 말썽을 부리곤 하였습니다. 각종 유틸리티를 새로 깔아보기도 하고 하드를 아예 밀고 새로 셋업도 해 보았지만 시원찮아서 화끈하게(?) 새로운 PC를 장만하였습니다.
인텔 코어2 듀오 E4400 CPU에, 2GB RAM, 2M 캐시, 320GB HDD … 아주 마음에 드는군요. PC 교체하고 맨 처음으로 쓰는 강좌입니다.
특정한 주의 날짜 알아내기
핵심 요약: 몇째 주의 날짜 범위 구하기
연도와 주차를 넣으면 그 주가 몇 월 며칠부터 며칠까지인지 알려 주는 WhatWeek 함수입니다. 내장 함수로는 어렵지만 DatePart를 활용하면 간단히 만들 수 있습니다.
- 1단계: DateSerial로 해당 연도의 1월 1일부터 12월 31일까지 순환합니다.
- 2단계: DatePart("ww")가 지정한 주차와 같은 첫 날짜를 찾습니다.
- 3단계: 그 날짜와 6일 뒤 날짜를 문자열로 돌려줍니다.
Step 1: 어떤 질문이었을까요?
질문 하나
몇주째인지 날짜를 알 수 있는 방법? 제목과 같이 만약 50번째 주면 몇월 몇일부터 몇일까지인지 알 수 있는 방법은 없는지요? 매일 구경만 해서 죄송하지만, 답변 좀 부탁드립니다.
구경만 한다고 해서 너무 죄송해 하실 것 까지는 없습니다. 언젠가는 다른 사람들을 위해 답변을 달게 될 기회가 올 것이며, 그 동안은 열심히, 부담없이 둘러보세요.
이에 더하여, 아직 VBA가 얼마나 파워풀하고 쓸데 많은(?) 것인지 잘 모르는 주변 사람들에게 열심히 계몽을 해 주시면 됩니다(자아~ 약속~~!!).
이런 경우에는 엑셀의 내장 함수로는 해결하기 어려우나 사용자 정의 함수를 만들면 간단하게 해결할 수 있습니다.
| 항목 | 값 | 설명 |
|---|---|---|
| 연도 선택 | 2007 | 1900~2999년 중 선택 |
| 몇째 주? | 30 | 1~52 중 선택 |
| 해당 주간 | 2007-07-22 ~ 2007-07-28 | =WhatWeek(C33, C34) |
위의 해당 주간 부분에는 =WhatWeek(C33,C34)라는 수식이 들어 있습니다. 이 때 WhatWeek는 사용자 정의 함수로 코드의 내용은 다음과 같습니다.
원문 오류 수정: 원본에는 수식이 =whatweek(C25,C26)으로 적혀 있었으나, 예제에서 연도와 주차가 입력된 셀은 각각 C33과 C34이므로 =WhatWeek(C33,C34)로 바로잡았습니다.
Step 2: 코드 살펴보기
Function WhatWeek(Year, Week) As String
'연도와 몇째 주를 표시할 것인지에 대한 정보를 파라미터(parameter) 정보로 넘겨 받습니다.
Dim lngNum As Long
Dim blnOK As Boolean
For lngNum = DateSerial(Year, 1, 1) To DateSerial(Year + 1, 1, 0)
'DateSerial은 '지정한 년/월/일에 해당하는 날짜값을 반환하는 VBA 함수'입니다.
'지정한 연도의 1월 1일부터 12월 31일까지 순환하면서 무언가 작업을 하기 위해 이런
'조건을 주었습니다.
If DatePart("ww", CDate(lngNum)) = Week Then
'DatePart라는 새로운 함수가 나왔군요. 이것은 '해당 날짜의 주어진 부분을 포함하는
'Variant 값을 반환하는 VBA 함수'입니다.
'
'그것이 도대체 무슨 소리냐구요?
'예를 들어, '? DatePart("q", "2007/8/2")'라고 하면 오늘날짜가 포함된 분기가 몇분기인지
'알려준다는 의미입니다. 답은 '3'입니다. 왜?? 8월은 3분기이니까…
'DatePart 함수의 인수로 "ww"를 지정하면 해당 날짜의 주(Week)를 구해 줍니다.
'이 함수의 다양한 인수에 대해서는 도움말을 참고하시기 바랍니다.
WhatWeek = CDate(lngNum) & " ~ " & CDate(lngNum) + 6
'지정한 주와 일치하는 날짜 및 그 날짜에서 6을 더한 날짜를 결과값으로 리턴합니다.
blnOK = True
Exit For
End If
Next lngNum
If blnOK = False Then WhatWeek = "날짜 오류"
'만약 오류값이 발생하면 '날짜 오류'라는 문자열을 결과값으로 돌려줍니다.
End Function
이 함수의 "주" 기준: DatePart("ww", …)는 기본적으로 일요일을 한 주의 시작으로 보고, 1월 1일이 포함된 주를 첫째 주로 계산합니다. 그래서 위 함수는 해당 주차에 처음 해당하는 날짜부터 6일 뒤까지를 돌려줍니다. 1월 1일이 일요일이 아니라면 첫째 주는 1월 1일부터 시작하는 것으로 표시되고, 마지막 주는 다음 해 날짜에 걸칠 수 있습니다. 월요일 시작이나 ISO 주 번호 기준이 필요하다면 DatePart의 세 번째, 네 번째 인수(firstdayofweek, firstweekofyear)를 조정하세요.
DatePart라는 VBA 함수를 잘 이용하면 해결할 수 있는 문제였습니다.
다음 시간에 또…
정리 — WhatWeek 함수 코드 핵심
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| 날짜 순환 | For lngNum = DateSerial(Year, 1, 1) To DateSerial(Year + 1, 1, 0) | 해당 연도 1월 1일부터 12월 31일까지 |
| 주차 계산 | DatePart("ww", CDate(lngNum)) | 날짜가 몇째 주인지 반환 |
| 결과 반환 | CDate(lngNum) & " ~ " & CDate(lngNum) + 6 | 시작일과 6일 뒤 날짜 |
| 오류 처리 | If blnOK = False Then WhatWeek = "날짜 오류" | 해당 주차가 없으면 오류 문자열 |
자주 묻는 질문 (FAQ)
Q1. DatePart 함수는 무엇을 돌려주나요?
날짜에서 지정한 부분(연, 분기, 월, 주 등)을 숫자로 돌려주는 VBA 함수입니다. 예를 들어 DatePart("q", "2007/8/2")는 3분기이므로 3을 반환하고, "ww"를 지정하면 몇째 주인지를 반환합니다.
Q2. 왜 워크시트 함수가 아닌 사용자 정의 함수로 만들었나요?
몇째 주라는 정보만으로 날짜 범위를 구하는 내장 함수가 없기 때문입니다. 사용자 정의 함수를 만들면 다른 워크시트 함수처럼 셀에서 바로 사용할 수 있습니다.
Q3. 월요일부터 시작하는 주로 계산하려면 어떻게 하나요?
DatePart의 세 번째 인수 firstdayofweek에 vbMonday를 지정하면 월요일을 한 주의 시작으로 계산할 수 있습니다. 필요에 따라 firstweekofyear 인수도 함께 지정하세요.
마치며
DatePart라는 VBA 함수를 잘 이용하면 해결할 수 있는 문제였습니다. 사용자 정의 함수로 만들어 두면 워크시트에서 바로 활용할 수 있습니다.