• 최초 작성일: 2007-08-02
  • 최종 수정일: 2026-09-30
  • 조회수: 14 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 특정한 주의 날짜 알아내기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

PC도 더위를 타는지 집 PC가 이맘 때면 말썽을 부리곤 하였습니다. 각종 유틸리티를 새로 깔아보기도 하고 하드를 아예 밀고 새로 셋업도 해 보았지만 시원찮아서 화끈하게(?) 새로운 PC를 장만하였습니다.

인텔 코어2 듀오 E4400 CPU에, 2GB RAM, 2M 캐시, 320GB HDD … 아주 마음에 드는군요. PC 교체하고 맨 처음으로 쓰는 강좌입니다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

특정한 주의 날짜 알아내기

핵심 요약: 몇째 주의 날짜 범위 구하기

연도와 주차를 넣으면 그 주가 몇 월 며칠부터 며칠까지인지 알려 주는 WhatWeek 함수입니다. 내장 함수로는 어렵지만 DatePart를 활용하면 간단히 만들 수 있습니다.

  • 1단계: DateSerial로 해당 연도의 1월 1일부터 12월 31일까지 순환합니다.
  • 2단계: DatePart("ww")가 지정한 주차와 같은 첫 날짜를 찾습니다.
  • 3단계: 그 날짜와 6일 뒤 날짜를 문자열로 돌려줍니다.

Step 1: 어떤 질문이었을까요?

질문 하나

몇주째인지 날짜를 알 수 있는 방법? 제목과 같이 만약 50번째 주면 몇월 몇일부터 몇일까지인지 알 수 있는 방법은 없는지요? 매일 구경만 해서 죄송하지만, 답변 좀 부탁드립니다.

구경만 한다고 해서 너무 죄송해 하실 것 까지는 없습니다. 언젠가는 다른 사람들을 위해 답변을 달게 될 기회가 올 것이며, 그 동안은 열심히, 부담없이 둘러보세요.

이에 더하여, 아직 VBA가 얼마나 파워풀하고 쓸데 많은(?) 것인지 잘 모르는 주변 사람들에게 열심히 계몽을 해 주시면 됩니다(자아~ 약속~~!!).

이런 경우에는 엑셀의 내장 함수로는 해결하기 어려우나 사용자 정의 함수를 만들면 간단하게 해결할 수 있습니다.

항목값설명
연도 선택20071900~2999년 중 선택
몇째 주?301~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 함수를 잘 이용하면 해결할 수 있는 문제였습니다. 사용자 정의 함수로 만들어 두면 워크시트에서 바로 활용할 수 있습니다.