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

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

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

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

JSON

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

Q&A

2回答

973閲覧

vbaでのforループの回し方について(json)

satprogram

総合スコア2

VBA

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

JSON

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

0グッド

0クリップ

投稿2023/01/29 02:59

前提

vbaでjson出力を実現しようとすると、共通部分のオブジェクト定義の箇所でエラーが出ます。

実現したいこと

json出力をvbaで実現させたい

発生している問題・エラーメッセージ

このキーは既にこのコレクションの要素に割り当てられています。

実現させたいjson

{ "A": { "a": "num" }, "B": { "a": "num", "b": ["bStr1", "bStr2"], //"b"と"c"の要素数は同じです "c": ["cStr1", "cStr2"], "d": "dStr" }, "C": { "a": "num", "b": ["bStr1", "bStr2", "bStr3"], "c": ["cStr1", "cStr2", "cStr3"], "d": "dStr" }, "D": { "a": "num", "b": ["bStr1"], "c": ["cStr1"], "d": "dStr" } }

試したこと

keyが"B","C","D"については、valueのオブジェクトが共通しているのでforループで回したいが、keyが"B"のvalueを定義した後に、"C"のvalueを定義しようとすると、"a","b","c","d"の部分で上記エラーが出ます。
※下記コードの~部分は省略しています。

//大元のオブジェクトを定義 Dim Dic1 As New Dictionary //共通部分のオブジェクトを定義 Dim Di2 As New Dictionary Dic2.Add "a", ~ Dic2.Add "b", ~ Dic2.Add "c", ~ Dic2.Add "d", ~ Dic1.Add "A", Dic2 Dic2.Add "a", ~ Dic2.Add "b", ~ Dic2.Add "c", ~ Dic2.Add "d", ~ Dic1.Add "B", Dic2 Dic2.Add "a", ~ Dic2.Add "b", ~ Dic2.Add "c", ~ Dic2.Add "d", ~ Dic1.Add "C", Dic2 Dic2.Add "a", ~ Dic2.Add "b", ~ Dic2.Add "c", ~ Dic2.Add "d", ~ Dic1.Add "D", Dic2

ご回答のほど、何卒よろしくお願いいたします。

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

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

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

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

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

otn

2023/01/29 03:14

エラーの意味は理解していますか?
satprogram

2023/01/29 03:19

同じキー、つまり"a", "b", "c", "d"をDic2に割り当てようとしているため、エラーが出ていると認識しています。しかし、出力したいjsonを実現する上で他の方法がまだ分かっていないです、、、、
otn

2023/01/29 10:44

1つのDictionaryに同じキーは1つしか存在できないので、同じキーをaddしては駄目だと言うことはわかりますか? 1つのDictionaryを更新したいのか、それぞれ別のDictionaryにしたいのか、どちらなのでしょう?
guest

回答2

0

Dic1に追加するDictionaryをそれぞれ別のオブジェクトとしたいのなら、それぞれ別に生成(New)する必要があります。

vba

1 Dim Dic1 As Dictionary 2 Dim Dic2 As Dictionary 3 4 Set Dic1 = New Dictionary 5 6 Set Dic2 = New Dictionary 7 Dic2.Add "a", "num" 8 Dic1.Add "A", Dic2 9 10 Set Dic2 = New Dictionary 11 Dic2.Add "a", "num" 12 Dic2.Add "b", Array("bStr1", "bStr2") 13 Dic2.Add "c", Array("cStr1", "cStr2") 14 Dic2.Add "d", "dStr" 15 Dic1.Add "B", Dic2 16 17 Set Dic2 = New Dictionary 18 Dic2.Add "a", "num" 19 Dic2.Add "b", Array("bStr1", "bStr2", "bStr3") 20 Dic2.Add "c", Array("cStr1", "cStr2", "cStr3") 21 Dic2.Add "d", "dStr" 22 Dic1.Add "C", Dic2 23 24 Set Dic2 = New Dictionary 25 Dic2.Add "a", "num" 26 Dic2.Add "b", Array("bStr1", "bStr2") 27 Dic2.Add "c", Array("cStr1", "cStr2") 28 Dic2.Add "d", "dStr" 29 Dic1.Add "D", Dic2 30 31 'Dictionaryの中身の確認 32 Dim key1, key2 33 For Each key1 In Dic1.keys 34 Debug.Print key1 & ":" 35 For Each key2 In Dic1(key1) 36 If IsArray(Dic2(key2)) Then 37 Debug.Print vbTab & key2 & ": " & Join(Dic2(key2), ",") 38 Else 39 Debug.Print vbTab & key2 & ": " & Dic2(key2) 40 End If 41 Next 42 Next 43

投稿2023/01/29 06:00

hatena19

総合スコア33620

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

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

0

提示コードをみるかぎり、Addで要素(アイテム)を常に追加しているので提示エラーが発生していると思われます。
よってキーが存在していれば値の更新を行うようにすればよいかと思います。
参考:【VBA】Dictionaryのアイテムの値を変更する方法【検索して値を入力する】

投稿2023/01/29 03:17

can110

総合スコア38233

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

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

satprogram

2023/01/29 03:37

「キーが存在していれば値の更新を行う」について、"B", "C", "D"に追加したいオブジェクトは形は同じですが、別物として扱いたい場合、「キーが存在していれば値の更新を行う」ことで実現できるのでしょうか? vba初学なもので、ご教示お願いいたします、、、
can110

2023/01/29 03:43

私もVBAほとんど触ったことないのですが 別物として扱いたいものが値なのであれば実現できるはずです。
satprogram

2023/01/29 03:56

承知しました。有難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問