【MOS】【Microsoft Office Excel】【マクロ/VBA】ExcelのリストをJSONに変換するマクロ
- 2021/10/21 19:24
- JSON
- Closeメソッド
- Killメソッド
- SaveToFileメソッド
- WriteTextメソッド
- 5
JSONとはJavaScript Object Notationの略で、配列で書かれたテキスト形式のファイルです。
JSONファイルをサーバーに上げるとHTMLに出力することもできるので、HTMLタグを知らない人でもJSONファイルを変更できれば簡単にサイトを更新することができます。
JSONファイルには決まった書式ルールがあるので、不慣れな人が作成するのは少し難しいかもしれません。
今回はExcelのリストからJSONファイルを生成するマクロを作成してみました。
Excelリスト例
たとえばこんなリストがあるとします。
このリストをJSONに生成するマクロは下記の通りです。
VBA例
Sub make_json() ThisWorkbook.Activate '変数定義 Const adTypeBinary = 1 Const adTypeText = 2 Const adSaveCreateOverWrite = 2 Dim fileName, fileFolder, fileFile As String Dim isFirstRow As Boolean Dim i, u As Long '最終行取得 Dim maxRow, maxCol As Long If Len(ActiveSheet.Range("A2").Value) = 0 Then maxRow = 0 ElseIf Len(ActiveSheet.Range("A3").Value) = 0 Then maxRow = 1 Else maxRow = ActiveSheet.Range("A1").End(xlDown).Row End If '最終列取得 maxCol = Range("A1").End(xlToRight).Column 'JSONファイル定義 fileName = ActiveSheet.Name 'JSONファイル名を指定 fileFolder = ThisWorkbook.Path '新しいファイルの保存先フォルダ名 fileFile = fileFolder & "\" & fileName '新しいファイルをフルパスで定義 '同名のJSONファイルが既にある場合は削除する If Dir(fileFile) <> "" Then Kill fileFile End If 'JSON作成 'オブジェクトを用意する Dim txt As Object Set txt = CreateObject("ADODB.Stream") txt.Charset = "UTF-8" txt.Open 'JSON開始タグ isFirstRow = True txt.Writetext "[" & vbCrLf, adWriteLine 'リストをオブジェクトに書き込む For i = 2 To maxRow '1行目か確認して2行目以降の場合は行頭に","を挿入 If isFirstRow = True Then isFirstRow = False Else txt.Writetext "," & vbCrLf, adWriteLine End If '行の開始タグを挿入 txt.Writetext vbTab & "{" & vbCrLf, adWriteLine For u = 1 To maxCol '最終列でない場合は","を挿入 If u = maxCol Then txt.Writetext vbTab & vbTab & """" & Cells(1, u).Value & """" & ":" & """" & Cells(i, u).Value & """" & vbCrLf, adWriteLine Else txt.Writetext vbTab & vbTab & """" & Cells(1, u).Value & """" & ":" & """" & Cells(i, u).Value & """" & "," & vbCrLf, adWriteLine End If Next u '行の閉じタグを挿入 txt.Writetext vbTab & "}", adWriteLine Next 'JSON終了タグ txt.Writetext vbCrLf, adWriteLine txt.Writetext "]" & vbCrLf, adWriteLine 'BOMを削除する txt.Position = 0 txt.Type = adTypeBinary txt.Position = 3 Dim tmp() As Byte tmp = txt.Read txt.Close txt.Open txt.Write tmp 'オブジェクトの内容をファイルに保存 txt.SaveToFile fileFile, adSaveCreateOverWrite 'オブジェクトを閉じる txt.Close MsgBox ("ファイルを生成しました。") End Sub
最終行と最終列を自動取得し、JSONを生成します。
JSONのファイル名はシート名を取得して作成します。
例えば「list.json」という名前のjsonにしたい場合、シート名を「list.json」という名前にしてください。
同名のファイルがある場合は削除して新規に保存します。
項目名として利用するため、リストシートの1行目にはそれぞれの項目名を入力してください。
ワンポイント
上記コードを利用するとjsonはUTF8のBOM無しで生成されます。
BOM有りのファイルはプログラムでの読み込み時にエラーになる場合があるので、BOM無しに設定しています。
JSON生成
上記のマクロを実行すると、下記のようなJSONが生成されます。
[ { "num":"1", "name":"イチゴ", "url":"http://hoge.net" }, { "num":"2", "name":"リンゴ", "url":"" }, { "num":"3", "name":"バナナ", "url":"http://hoge.com" } ]
まとめ
閉じタグの位置や区切り文字の位置・有無など、ルールに沿った書き方をしないといけないので、不慣れな人が触る場合は、このように自動生成するマクロなどを活用するといいかもしれません。
toorisugari
adWriteLineが未定義というエラーが出るので、初期に変数設定してあげる必要がありそうです。
それ以外は完璧です。