ToLunar와 ToSolar 함수를 EGTools에 추가하면서
실제 변환이 정확한지 확인하는 것을 천문연구원에서 제공하는 API를 이용해서 확인을 했었는데,
여기에 사용한 코드입니다.
천문연구원에서는 양력기준으로 기원전 59년 2월 13일부터 2050년 12월 31일까지의 양력/음력 날짜를 제공합니다.
양력 달력을 이용하기 위한 API를 주소는 https://astro.kasi.re.kr/life/solc? 이며 yyyy, mm, dd 3가지를 양력으로 입력합니다.
조회 결과는 아래와 같은 형태로 반환됩니다.
{"SOLC_WEEK":"토","SOLC_DD":"01","SOLC_LEAP_YYYY":"평","JULIAN_DD":"18","JULIAN_YYYY":"2017","LUNC_YYYY":"2017","LUNC_AGE":7.4,"LUNC_EN_DD":"29","LUNC_WLGN":"","SOLC_MM":"07","JULIAN_LeapYear":"평","SOLC_JD":"2457936","LUNC_ILJIN":"기축(己丑)","LUNC_MM":"05","LUNC_DD":"08","LUNC_PRCN":"정유(丁酉)","JULIAN_MM":"06","SOLC_YYYY":"2017","LUNC_LEAP_MM":"윤"}
여기서 필드명으로 값을 추출하는 getValue() 함수를 사용합니다.
함수의 반환결과가 String인 이유는
음력날짜중에 양력에 없는 날짜 (음력 2월 30일)가 있고 윤달이 있기 때문입니다.
EGTools의 ToLunar 함수는 인터넷 연결이 없는 상태에서도 결과 값을 내야 하기 때문에
아래 코드를 사용하지 않고 별도로 기준일자로부터 날짜를 세는 방법을 적용하였습니다.
Function getLunarDate(argDate As Date) As String
Dim msXML As Object: Set msXML = CreateObject("MSXML2.XMLHTTP.6.0")
Dim result As String
With msXML
'// <음력>기원전59년 1월 1일부터 <음력>2050년11월18일까지
'// <양력>기원전59년 2월13일부터 <양력>2050년12월31일까지
.Open "GET", "https://astro.kasi.re.kr/life/solc?yyyy=" & Year(argDate) & "&mm=" & Format(Month(argDate), "00") & "&dd=" & Format(Day(argDate), "00")
.send
Sleep 10
Do While .Status <> 200
Sleep 10
Loop
result = .ResponseText
'// {"SOLC_WEEK":"토","SOLC_DD":"01","SOLC_LEAP_YYYY":"평","JULIAN_DD":"18","JULIAN_YYYY":"2017","LUNC_YYYY":"2017","LUNC_AGE":7.4,"LUNC_EN_DD":"29","LUNC_WLGN":"","SOLC_MM":"07","JULIAN_LeapYear":"평","SOLC_JD":"2457936","LUNC_ILJIN":"기축(己丑)","LUNC_MM":"05","LUNC_DD":"08","LUNC_PRCN":"정유(丁酉)","JULIAN_MM":"06","SOLC_YYYY":"2017","LUNC_LEAP_MM":"윤"}
getLunarDate = getLunarDate & getValue(result, "LUNC_YYYY") & "-" _
& getLunarDate & getValue(result, "LUNC_MM") & "-" _
& getLunarDate & getValue(result, "LUNC_DD") _
& Replace(getLunarDate & "(" & Replace(getValue(result, "LUNC_LEAP_MM"), "}", vbNullString) & ")", "(평)", vbNullString)
End With
End Function
Function getValue(argResult As String, fieldName As String)
Dim vResult As Variant, sDelimiter As String
sDelimiter = """" & fieldName & """:"
vResult = Split(argResult, sDelimiter)
vResult = Split(vResult(1), ",")(0)
vResult = Replace(vResult, """", vbNullString)
getValue = vResult
End Function
'Excel - VBA' 카테고리의 다른 글
Barcode Font와 VBA 코드 (0) | 2023.02.20 |
---|---|
범위내의 그림/사진의 숫자를 가져오기 (0) | 2023.02.18 |
Macro 실행 시간 측정하기 (0) | 2023.01.18 |
VBA UDF 결과 배열을 Sheet에 출력하기 (0) | 2023.01.17 |
IsTime() 셀 값이 시간 값인지 어떻게 확인할 수 있을까? (0) | 2023.01.11 |