먼저 아래에 사이트에 들어가서 JsonConverter.bas 를 다운로드 받아야함. 아님녀 GitHub - VBA-tools/VBA-JSON: JSON conversion and parsing for VBA 의 사이트에 들어가서 Clone 으로 가서 알집으로 다운로드 받아서 처리해도 된다.
VBA-JSON/JsonConverter.bas at master · VBA-tools/VBA-JSON · GitHub
그리고 %appdata% 로 실행해서 microsoft 폴더 내 addins 파일에 해당 알집 및 bas 파일을 저장. 이후에 만들고자 하는 엑셀 파일을 열어서 xlsm 파일로 저장한 이후, 그 다음에 JsonConverter.bas 파일을 가져온다.
이후, JsonConverter.bas 안에서 아래의 코드를 수정해줘야된다.
'Private Function json_ParseObject(json_String As String, ByRef json_Index As Long) As Dictionary
-> Private Function json_ParseObject(json_String As String, ByRef json_Index As Long) As Object
'Set json_ParseObject = New Dictionary
-> Set json_ParseObject = CreateObject("Scripting.Dictionary")
이렇게만 수정해두면 miscrosoft scripting runtime 을 수동 참조하지 않고 바로 json 을 활용하여 쓸 수있다. 일단 아래와 같은 테스트로 진행시 바로 정상 작동된다.
아래는 정상적으로 실행되는지를 확인하는 예시 코드 및 xlsm 파일임.
Sub json_text()
' VBA JSON 변환 예제
' JSONConverter를 사용하여 JSON 문자열을 파싱하고 다루는 방법을 보여줍니다.
' 참고: 이 예제를 실행하기 전에 JSONConverter 라이브러리를 추가해야 합니다.
Dim json As Object
Dim jsonString As String
Dim item As Variant
' JSON 문자열 예제
jsonString = "{""이름"":""홍길동"",""나이"":30,""기술"":[""Excel"",""VBA""]}"
' JSON 문자열 파싱
Set json = JsonConverter.ParseJson(jsonString)
' 결과 출력
Debug.Print "이름: " & json("이름")
Debug.Print "나이: " & json("나이")
Debug.Print "기술:"
For Each item In json("기술")
Debug.Print " - " & item
Next item
' 오류 처리
On Error GoTo ErrHandler
' 추가적인 처리 로직...
Exit Sub
ErrHandler:
Debug.Print "오류 발생: " & Err.Description
End Sub
**추가, Dart 내에 감사보고서 중, 'self' 의 객체 내 모든 key 와 value 값 출력하는 코드
Sub GetReportJson()
' DART 보고서 정보를 JSON 형태로 가져오는 VBA 예제입니다.
' 참고: 이 코드를 실행하기 전에 Microsoft XML, v6.0 및 JSONConverter 라이브러리가 참조에 추가되어 있어야 합니다.
' 변수 선언
Dim httpRequest As Object
Dim json As Object
Dim rcpNo As String
Dim responseText As String
' 오류 처리 시작
On Error GoTo ErrorHandler
' 예제로 사용할 보고서 번호 설정
rcpNo = "20230410002697"
' httpRequest 객체 생성
Set httpRequest = CreateObject("MSXML2.XMLHTTP")
' HTTP 요청 설정 및 전송
httpRequest.Open "GET", "https://dart.fss.or.kr/dsaf001/mainJson.do?rcpNo=" & rcpNo, False
httpRequest.send
' 응답 텍스트 저장
responseText = httpRequest.responseText
'Debug.Print responseText
' JSON 파싱
Set json = jsonConverter.ParseJson(responseText)
' 결과 출력 또는 추가 처리
' 예시) "self" 객체 내의 모든 키와 해당 값을 출력합니다.
Dim key As Variant
For Each key In json("self").Keys
Debug.Print key & ": " & json("self")(key)
Next key
' 정상 종료
Exit Sub
' 오류 처리
ErrorHandler:
Debug.Print "오류 발생: " & Err.Description
End Sub
**** 또 추가 내용, Dart 내에 감사보고서의 정보를 json 으로 가져오는 내용. toc 의 항목을 가져오거나, 특정 toc 내에 모든 항목을 출력하여 볼 수 있도록 하는 내용을 추가함.
Sub GetReportJson2()
' DART 보고서 정보를 JSON 형태로 가져오는 VBA 예제입니다.
' 참고: 이 코드를 실행하기 전에 Microsoft XML, v6.0 및 JSONConverter 라이브러리가 참조에 추가되어 있어야 합니다.
' 변수 선언
Dim httpRequest As Object
Dim json As Object
Dim rcpNo As String
Dim responseText As String
Dim item As Variant
Dim key As Variant
' 오류 처리 시작
On Error GoTo ErrorHandler
' 예제로 사용할 보고서 번호 설정
rcpNo = "20230410002697"
' httpRequest 객체 생성
Set httpRequest = CreateObject("MSXML2.XMLHTTP")
' HTTP 요청 설정 및 전송
httpRequest.Open "GET", "https://dart.fss.or.kr/dsaf001/mainJson.do?rcpNo=" & rcpNo, False
httpRequest.send
' 응답 텍스트 저장
responseText = httpRequest.responseText
' JSON 파싱
Set json = jsonConverter.ParseJson(responseText)
' "toc"의 첫 번째 내용 출력
Debug.Print "toc의 첫 번째 항목: " & json("toc")(1)("tocText")
' "toc" 내의 모든 항목 순회
For Each item In json("toc")
Debug.Print "tocText: " & item("tocText")
Next item
' "toc" 내의 모든 항목 순회 및 각 항목의 모든 키와 값 출력
For Each item In json("toc")
For Each key In item.Keys
On Error Resume Next ' 오류가 발생해도 다음 줄로 진행
Debug.Print key & ": " & item(key)
If Err.Number <> 0 Then
Debug.Print "오류 발생: "; Err.Description ' 오류 메시지 출력
Err.Clear ' 오류 상태를 초기화
End If
On Error GoTo 0 ' 기본 오류 처리로 복귀
Next key
Debug.Print "------------------"
Next item
' 정상 종료
Exit Sub
' 오류 처리
ErrorHandler:
Debug.Print "오류 발생: " & Err.Description
End Sub
전반적으로 사용헀을 때의 느낀 점이라면.. 일정 단순한 json 으로 파싱해서 내용을 찾는다고 하면 꽤 괜찮은 라이브러리인 듯 하다. 그러나, 만일 복잡한 json 을 통한 파싱이 문제라면 VBA 가 아니라 파이썬 등을 통한 외부 설정으로 가져오서 최종 df 형식으로 데이터를 불러오는게 더 현명할 듯 싶다.. VBA 는 너무 오래돼서 사실상 힘들어보임.
댓글