質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

3回答

6817閲覧

VBAの連想配列のJSONの作成方法

first_php

総合スコア20

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

1クリップ

投稿2019/01/03 06:29

VBAをはじめて見たのですが、
VBA-JSONを用いて連想配列が作れなかった為
ご質問させてください。

作成したいJSONファイル

{ "id" : 1, "shipTo" : { "name" : "テスト1", "address" : "東京", "zip" : "150-0001" }, { "name" : "テスト2", "address" : "大阪", "zip" : "563-0000" } }

サイト:
https://doruby.jp/users/ookouchi/entries/201708-EXCEL-VBA-JSON-API-MSXML2-XMLHTTP

上記のサイトを参考に
idに1をセットし,shiptoにname,address,zipをセット出来たのですが
その後ろに新たにテスト2を作りたいのですが、どのようにセットをすればいいでしょうか?

JsonObject.Add "data", New Collection
JsonObject.Add "contents", New Dictionary

のようにCollectionのなかにDictionaryを入れようとしたのですが
うまくいかなかったのでご教授ください。

![イメージ説明

試し中のソースコード

VBA

1Option Explicit 2 3Public Sub create_account() 4 Dim company_name As String 5 Dim confirm_key As String 6 Dim contents As String 7 Dim contents_body As String 8 Dim JsonObject As Dictionary 9 Dim json_data As String 10 Dim account_txt As String 11 Dim collumn_count As Long 12 Dim record_count As Long 13 Dim i As Long 14 Dim j As Long 15 16 collumn_count = Range("A1").End(xlToRight).Column ' 列数をチェックする 17 record_count = Range("A65536").End(xlUp).Row ' 行数をチェックする 18 19 Set JsonObject = CreateObject("Scripting.Dictionary") 20 JsonObject.Add "data", New Collection 21 JsonObject.Add "contents", New Dictionary 22 23 For j = 1 To collumn_count 24 For i = 1 To record_count 25 JsonObject("contents").Add Cells(5, j), Cells(i, j) 26 Next i 27 JsonObject("data").Add JsonObject("contents") 28 Next j 29 30 json_data = JsonConverter.ConvertToJson(JsonObject, Whitespace:=2) 31 MsgBox (json_data) 32exit sub

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Sub main() Dim JsonObject As Object Dim JsonItem As Object Set JsonObject = New Dictionary JsonObject.Add "id", 1 JsonObject.Add "shipTo", New Collection For i = 2 To 3 Set JsonItem = New Dictionary JsonItem.Add "name", Cells(i, 1).Value JsonItem.Add "address", Cells(i, 2).Value JsonItem.Add "zip", Cells(i, 3).Value JsonObject("shipTo").Add JsonItem Next ' イミディエイトウィンドウで確認(デバック用) Debug.Print JsonConverter.ConvertToJson(JsonObject, Whitespace:=2) End Sub

出力結果

{ "id": 1, "shipTo": [ { "name": "\u30C6\u30B9\u30C81", "address": "\u6771\u4EAC", "zip": "150-0001" }, { "name": "\u30C6\u30B9\u30C82", "address": "\u5927\u962A", "zip": "563-0000" } ] }

投稿2019/01/03 09:25

編集2019/01/03 09:41
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

first_php

2019/01/03 09:36

ありがとうございます! ベストアンサーが1人にしか上げれないのが悔やまれます・・・
TanakaHiroaki

2019/01/03 09:41

大変勉強になる回答です。ありがとうございました。
guest

0

ベストアンサー

VBAにて「CollectionのなかにDictionaryを入れる」を実現してみました。
なお、JsonConvertのテストは行っていないことをご承知おきください。
<追記>
Dic.RemoveAll が空欄の原因となっていましたのでコードを修正しました。
JsonConvertのテストも実施済みです。

VBA

1Sub create_account2() 2 3 Dim company_name As String 4 Dim confirm_key As String 5 Dim contents As String 6 Dim contents_body As String 7 Dim JsonObject As Dictionary 8 Dim json_data As String 9 Dim account_txt As String 10 Dim collumn_count As Long 11 Dim record_count As Long 12 Dim i As Long 13 Dim j As Long 14 15 collumn_count = Range("A1").End(xlToRight).Column ' 列数をチェックする 16 record_count = Range("A65536").End(xlUp).Row ' 行数をチェックする 17 18 Set JsonObject = CreateObject("Scripting.Dictionary") 19 20'==ここから修正 21 'Dictionaryの定義(配列を用いた) 22 Dim Dic(1 To 2) As Object 23 Set Dic(1) = CreateObject("Scripting.Dictionary") 24 Set Dic(2) = CreateObject("Scripting.Dictionary") 25 26 'Collectionの定義 27 Dim Col As Collection 28 Set Col = New Collection 29 30 For i = 2 To record_count 'record_count =3 31 For j = 1 To collumn_count 'collumn_count=3 32 'Dictionaryにレコードを入れる 33 Dic(i - 1).Add Cells(1, j).Value, Cells(i, j).Value 34 Next j 35 'CollectionにDictionaryオブジェクトを入れる 36 Col.Add Dic(i - 1) 37 Next i 38 39 JsonObject.Add "id", 1 40 JsonObject.Add "shipTo", Col 41 42 Set Col = Nothing 43'==ここまで修正 44 45 json_data = JsonConverter.ConvertToJson(JsonObject, Whitespace:=2) 46 MsgBox (json_data) 47 48End Sub

投稿2019/01/03 08:52

編集2019/01/03 09:25
TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

first_php

2019/01/03 09:08

3が日にわざわざ回答くださってありがとうございます! おかげさまで、あともう一歩のところまで来ました! 出力結果が { "id": 1, "shipTo": [ { }, { } ] } となっていたので、 Dic.RemoveAllをすると collectionに格納したobjectが消えてしまったのかと 思って色々調べ中です!
TanakaHiroaki

2019/01/03 09:29 編集

Dic.RemoveAll が空欄の原因となっていました。 コードを書き換えました。
first_php

2019/01/03 09:37

おかげさまで、解決いたしました! わざわざ書き換えまでしていただきありがとうございました!
guest

0

user1さんのコードはすごいです。
お見事としか言いようがありません。

投稿2019/01/03 09:34

編集2019/01/03 09:36
TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問