본문 바로가기
카테고리 없음

Excel VBA 에서 JsonConverter 모듈을 활용한 감사보고서 데이터 출력

by 퍼포먼스마케팅코더 2024. 3. 28.
반응형

먼저 아래에 사이트에 들어가서 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

 

VBA-JSON/JsonConverter.bas at master · VBA-tools/VBA-JSON

JSON conversion and parsing for VBA. Contribute to VBA-tools/VBA-JSON development by creating an account on GitHub.

github.com

 

그리고 %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

 

jsonconverter_test.xlsm
0.06MB

 

 

 

 

**추가, 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 는 너무 오래돼서 사실상 힘들어보임.

반응형

댓글