데이터 관리에서 날짜는 중요한 요소입니다. 특히 상거래에서는 주말(토·일)뿐만 아니라 공휴일 관리가 필수적입니다. 예를 들어, 결혼식 관리 회사에서는 봄·가을 주말에 평균 50건의 업무를 처리하므로, 주말과 임시공휴일을 포함한 휴무일 관리가 매우 중요합니다.
이 프로그램은 조회일로부터 올해와 내년의 휴무일을 추출하여 표시합니다. 아래는 프로그램의 핵심 내용과 코드 설명입니다.
이 코드의 핵심은 2가지 입니다.
대한민국 공휴일 관리는 한국천문연구원_특일 정보(https://www.data.go.kr/data/15012690/openapi.do)에서 합니다.
이곳에서 자신의 api키를 발급받을 수 있습니다. 당연히 무료발급이며 신청하면 바로 발급해 줍니다.
오픈API에서 가져온 데이터 값은 보통 json형식을 가지고 있습니다. 하지만 이런 간단한 데이터는 간단한 형태를 가지고 있기에 jsonconverter를 이용할 필요없습니다.
루핑으로 필요한 데이터를 추출합니다.
생각보다 간단히 임시 공휴일을 포함한 2년간 휴무일을 가져올 수 있습니다.
만약에 데이터 관리가 필요한 업종이라면, 자신이 관리하는 장부의 데이터 셀에 이 정보를 join해서 다음과 같이 휴무일 관리를 하면됩니다.
위 이미지가 공휴일이 적용된 날짜 관리 형식입니다.
평일과 토요일. 일요일 각각의 색으로 표시해서 구분을 합니다. 이는 주말에 결혼식이 이루어지기 때문에 결혼식이 주말이 아닌 경우 재차 확인후 업무를 진행하게 되어 실수를 줄여줍니다.
그리고 5월 5일 어린이날도 평일이 아니기 때문에 날짜를 입력하는 순간 바탕색으로 공휴일을 표시해 줍니다.
참고로, 날짜는 날짜 - 요일 - 시간으로 구분해서 업무 편리를 도왔습니다.
날짜가 생명인 업종에는 꼭 필요한 코드입니다.
(실제로 휴무일 조회한 결과 : 2025.6.3 대통령선거일 임시휴무일도 잘 나옵니다.)
아래는 휴무일 추출 코드입니다. 참고하세요.
Option Explicit
Sub FetchKoreanHolidaysAPI()
Dim http As Object
Dim url As String
Dim jsonResponse As String
Dim json As Object
Dim i As Integer
Dim xmlDoc As Object
Dim items As Object
Dim item As Object
' Holiday 시트 설정
Dim iws As Worksheet: Set iws = ThisWorkbook.Sheets("License")
Dim i_cell As Range: Set i_cell = iws.Cells(6, 11)
Dim i_range As Range: Set i_range = Range(i_cell.Offset(1), iws.Cells(iws.Rows.Count, i_cell.Column).End(xlUp))
i_range.Resize(i_range.Rows.Count, 4).ClearContents
' HTTP 객체 생성 Cells(Rows.Count, i_cell.Column).End(xlUp)
Set http = CreateObject("MSXML2.XMLHTTP")
' API URL ()
Dim i_key As String: i_key = "공공데이터포털에서 발급받은 키를 넣으세요"
Dim year_cnt As Long, i_year As String
For year_cnt = 0 To 1
i_year = CStr(Year(DateAdd("yyyy", year_cnt, Now())))
Debug.Print i_year
url = "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getHoliDeInfo?solYear=" & i_year & "&ServiceKey=" & i_key & "&numOfRows=100"
' API 요청
http.Open "GET", url, False
http.send
' 응답 받기
jsonResponse = http.responseText
' XML 파싱 객체 생성
Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.async = False
xmlDoc.LoadXML jsonResponse ' 실제로는 http.responseText 사용
' 파싱 오류 확인
If xmlDoc.parseError.ErrorCode <> 0 Then
MsgBox "XML 파싱 오류: " & xmlDoc.parseError.reason, vbCritical
Exit Sub
End If
' <item> 노드 가져오기
Set items = xmlDoc.SelectNodes("//items/item")
Dim i_date As String
Dim j As Long: j = 0
For Each item In items
i_date = item.SelectSingleNode("locdate").Text ' 날짜 (YYYYMMDD)
i_cell.Offset(i, j).value = Left(i_date, 4) & "-" & Mid(i_date, 5, 2) & "-" & Mid(i_date, 7)
i_cell.Offset(i, j + 1).value = item.SelectSingleNode("dateName").Text ' 휴일명
i_cell.Offset(i, j + 2).value = item.SelectSingleNode("isHoliday").Text ' 공휴일 여부 (Y/N)
i_cell.Offset(i, j + 3).value = Format(i_cell.Offset(i, j).value, "aaa")
i = i + 1
Next item
Next
i_cell.Offset(-3, 3) = Format(Now(), "yyyy-mm-dd hh:mm:ss")
End Sub