Open9
VBAでExcelのデータをJson形式で出力するまで
はじめに
タイトルの通りExcelのデータをJsonとして出力したいことがあったので調べた内容ややったことを議事録として残していきます。
筆者の環境
- OS: Windows 10 pro
- Excel: Microsoft 365 Apps for enterprise
Excelに「開発」タブ(リボン)を表示させる
- Excelを開き、
ファイル > その他 > オプション
を開く -
Excelのオプション
が開くので、リボンのユーザー設定
を選択し、右側にある開発
にチェックを入れる - Excelの画面に戻り、上に
開発
というタブが出ていればOK
Visual Basicを開く
- 上で表示させた
開発
タブをクリックし、左上にあるVisual Basic
をクリックする - するとVBE( Visual Basic Editor )というマクロを作成・編集するための専用のエディターが開かれる
使い方は下記サイトが詳しく書かれており、私はこちらのサイトで学習しました。
「Microsoft Scripting Runtime」の参照設定
この後設定するVBA-JSON
で使用するDictionary
型を使えるようにするために設定をします。
設定の仕方は下記サイトがわかりやすかったです。
「VBA-JSON」のインポート
VBA-JSON
はDictionary
型というVBAで使用する型をJson
形式のString
型に変換してくれるものです。
Json
を出力するためには必須です。
- 下記のサイト ( github ) を開く
- 開いたgithubの最下部あたりにある
Installation
のlatest release
をクリック -
Source code (zip)
をクリックしzipファイルをダウンロード - ダウンロードしたzipファイルを解凍する
- 解凍したフォルダの中にある
JsonConverter.bas
をVBEにインポートする
早速出力してみる
- VBEを開いた状態で上のメニュータブから
挿入 > 標準モジュール
をクリック
- 上のコードを入力する窓に下記コードを入力
コード全文
Module1
Sub test()
Dim params As New Dictionary
' keyとvalueを追加
params.Add "key1", "value1"
params.Add "key2", "value2"
params.Add "key3", "value3"
' Dictionaryの入れ子
Dim child As New Dictionary
child.Add "childKey1", "childValue1"
child.Add "childKey2", "childValue2"
child.Add "childKey3", "childValue3"
params.Add "key4", child
' Listを追加
Dim list As New Collection
list.Add "item1"
list.Add "item2"
list.Add "item3"
list.Add "item4"
params.Add "key5", list
' Jsonを作成
Dim json As String
json = JsonConverter.ConvertToJson(params, Whitespace:=4)
' Jsonを出力
With CreateObject("ADODB.Stream")
.Type = 2
.Charset = "utf-8"
.Open
.WriteText json, 1
.SaveToFile ThisWorkbook.Path & "/" & "data.json", 2
.Close
End With
End Sub
- VBEを開いた状態で
F5
を押し、実行する - デスクトップに
data.json
が出力されている
これでJsonファイルの出力ができました。
ちなみに実行したファイルをvscodeで開いたのが下記画像です。
コードにあるJsonConverter.ConvertToJson(params, Whitespace:=4)
のWhitespace:=4
という指定をしているの入れ子ごとにスペース4つ分の間隔があいてます。
日本語を入力すると...
先ほどのコードのValue
部分をすべて日本語に変えてみた。
日本語に変更後のコード全文
Module1
Sub test()
Dim params As New Dictionary
' keyとvalueを追加
params.Add "key1", "あいうえお"
params.Add "key2", "かきくけこ"
params.Add "key3", "さしすせそ"
' Dictionaryの入れ子
Dim child As New Dictionary
child.Add "childKey1", "たちつてと"
child.Add "childKey2", "なにぬねの"
child.Add "childKey3", "はひふへほ"
params.Add "key4", child
' Listを追加
Dim list As New Collection
list.Add "まみむめも"
list.Add "やゆよ"
list.Add "らりるれろ"
list.Add "わをん"
params.Add "key5", list
' Jsonを作成
Dim json As String
json = JsonConverter.ConvertToJson(params, Whitespace:=4)
' Jsonを出力
With CreateObject("ADODB.Stream")
.Type = 2
.Charset = "utf-8"
.Open
.WriteText json, 1
.SaveToFile ThisWorkbook.Path & "/" & "data.json", 2
.Close
End With
End Sub
このコードを実行し、data.json
を確認したところ下記のようにUnicodeの16進数表記になってしまう。
Unicode 16進数表記の改善
- VBEの左側
プロジェクト
の中にあるJsonConverter
をダブルクリックして開く - コード内で
ctrl + F
でVBA.Right$
を検索する - 下記のようにシングルクォーテーションを付け加え、コードを書き換える
JsonConverter
・・・中略
- json_Char = "\u" & VBA.Right$("0000" & VBA.Hex$(json_AscCode), 4)
+ ' json_Char = "\u" & VBA.Right$("0000" & VBA.Hex$(json_AscCode), 4)
・・・中略
- 再び実行してみる
- デスクトップにある
data.json
を確認する
これで直りました!