0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Excel の表から Json を出力する関数

Last updated at Posted at 2021-04-21

つまり

ID NumberProp ArrayProp StrArrayProp BoolProp
Areare 1 [1,2,3] ["aaa", "bbb"] TRUE
Hugahuga 2 [4,5,6,7] ["ccc", "ddd", "eee"] FALSE

こんな表を

[
  {
    "ID": "Areare",
    "NumberProp": 1,
    "ArrayProp": [1,2,3],
    "StrArrayProp": ["aaa", "bbb"],
    "BoolProp": true
  },
  {
    "ID": "Hugahuga",
    "NumberProp": 2,
    "ArrayProp": [4,5,6,7],
    "StrArrayProp": ["ccc", "ddd", "eee"],
    "BoolProp": false
  }
]

こうしたい。
関数として独立した処理にしましょうね。責任分界点はちゃんとしようね。シートの中でも使えるよ。

ほかに試した方法

Excel から CSV を出力してそれを Json にする

値がぜーんぶ文字列になる。そらそうだ。 CSV 上じゃ数字も真偽値も全部文字列だ。

コード

  • 上に書いたみたいなフラットなJsonしか出てこないよ
  • ファイルに出力したい時とかはこれ挟んだマクロまた書いてね
  • [ で始まる文字列として扱いたいもの」が来たらアウトだね。そもそも DynamoDB の設定ファイル量産するためのマクロだから、多少はね。
Function rangeToJsonString(rangeP)
    '入力は二次元配列とかセル範囲とか行けるはず
    Dim range
    range = rangeP 'なんかこうするとセル範囲オブジェクトが渡ってきた時に .Value2 がいいかんじに入ってくれる。
    
    len_row = UBound(range, 1) '行数
    len_col = UBound(range, 2) '列数

    ReDim heads(len_col - 1) '見出し、0から列数-1まで
    ReDim recs(len_row - 2) 'レコード、0から行数-2まで
   
    'データの取得とJSONの生成
    For c = 1 To len_col
        '1行目の各セルを見出しとして取得。
        heads(c - 1) = range(1, c)
    Next c
    For r = 2 To len_row
        '2行目から最下行まで処理。
        ReDim temps(len_col - 1) '0から列数-1まで
        For c = 1 To len_col
            cellData = range(r, c)
            dataStr = ""
            'データ種別の判定
            dataKind = VarType(cellData)
            Select Case dataKind
                Case 8 'Stringの時
                    If Left(cellData, 1) = "[" Then '配列ならそのまま
                        dataStr = cellData
                    Else
                        dataStr = Chr(34) & cellData & Chr(34) '文字列ならダブルクォーテーションをつける
                    End If
                Case 11 'bool
                    If cellData Then
                        dataStr = "true"
                    Else
                        dataStr = "false"
                    End If
                Case Else 'そのほかはそのまま
                    dataStr = cellData
            End Select
            
            '各行の各セルを取得し見出しと組み合わせる。
            temps(c - 1) = "    " & Chr(34) & heads(c - 1) & Chr(34) & ": " & dataStr
        Next c
        recs(r - 2) = "  {" & vbCrLf & Join(temps, "," & vbCrLf) & vbCrLf & "  }"
    Next r
    rangeToJsonString = "[" & vbCrLf & Join(recs, "," & vbCrLf) & vbCrLf & "]"
   

End Function

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?