참고: 지식인 질문글

 

화면 및 주요 코드:

 

실행 결과:

 

 

질문자가 원하는 결과 문자열이 JSON 문자열과 거의 흡사하기 때문에

VBAJSON 라이브러리를 활용하였습니다.

엑셀 데이터의 첫번째 행은 카테고리로 읽어들이고

나머지 행은 Dictionary 구조를 이용해서 데이터 구조를 만들어서

최종적으로 ConvertToJson 함수를 이용해서 items 배열(컬렉션)을 Json 문자열로 변환합니다.

원래 JSON데이터는 카테고리명의 양쪽에 따옴표가 있는데 삭제시켰습니다. 

따옴표를 원래대로 놔두려면 해당 부분(따옴표를 제거하는 for 문 부분)을 주석처리하면 됩니다.

 

더보기
'Add Reference to Microsoft Scripting Runtime Library

Sub Convert()

    Dim sht As Worksheet
    Dim rng As Range
    Dim items As New Collection
    Dim item As New Dictionary
    Dim r As Long, c As Integer
    Dim cat() As Variant
    Dim fname As String
    Dim handle As Integer
    Dim Json As String
    
    'Set sht = ThisWorkbook.ActiveSheet
    Set sht = ThisWorkbook.Worksheets("info")
    
    '//첫 행(카테고리)
    cat = sht.UsedRange.Rows(1).Value
    
    '//1열 셀 순환
    For Each rng In sht.UsedRange.Columns(1).Cells
        If rng.Row > 1 Then '2행부터
            r = r + 1
            For c = 1 To UBound(cat, 2)
                '//각 행을 item Dictionary에 추가
                item(cat(1, c)) = rng.Offset(, c - 1).Value
            Next c
            
            '//각 행Dictionary 를 items Collection에 추가
            items.Add item
            Set item = Nothing 'Collection 초기화
        End If
    Next rng
    
    '//Items를 Json 문자열로 변환
    Json = JsonConverter.ConvertToJson(items, Whitespace:=4)
    '카테고리 이름에 따옴표 제거
    For c = 1 To UBound(cat, 2)
        Json = Replace(Json, """" & cat(1, c) & """:", cat(1, c) & ":")
    Next c
    '//텍스트 파일에 저장
    fname = Application.GetSaveAsFilename(InitialFileName:= _
        ThisWorkbook.Path & Application.PathSeparator & "Json.txt", FileFilter:="Text file,*.txt")
    If fname = "" Then Exit Sub
    handle = FreeFile
    Open fname For Output As #handle
    Print #handle, Json
    Close #handle
    
End Sub

 

샘플파일 첨부합니다.

Excel2Json1.xlsm
0.08MB

 

참고: https://codingislove.com/excel-json/

 

CSV를 JSON으로 변환할 경우 참고: 기타1, 기타2