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

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

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

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

JSON

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1660閲覧

【VBA-JSONについて】

TatsukiKumagai

総合スコア1

VBA

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

JSON

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/11/18 18:28

お世話になります。
VBA-JSONにてパース処理を行っておりますが、
読み込みたい値が取得できず困っております。

【Jsonコード】
[
{
"id": "aaaa",
"name": "あ",
"labels": []
},
{
"id": "bbbb",
"name": "い",
"labels": [
{
"id": "62838f56463b8c51453caaa",
"idBoard": "62838f562b010768dadai",
"name": "バッテリー",
"color": "yellow"
}
]
},
{
"id": "cccc",
"name": "う",
"labels": []
}
]

=================================
このようなjsonからvbaの連想配列へ以下のようにfor文で格納していきたいのですが、2つ目以降の、"name(key) | id"をどう取得すればよいのかがわかりません。
name(key) | id
あ | aaaa
い | bbbb
う | cccc

=================================
【VBA】(テストとしてforは使わず1行のみ取得)
dim jsonObj

docObj = JsonConverter.ParseJson(上記のjson)

Debug.Print docObj("name") '1行目のnameは取得できた

=================================
2行目以降取得で
Debug.Print docObj(2)("name")と書いても
Debug.Print docObj("name")(2)と書いてみても
プロパティエラーになってしまいます。。
どこにインデックス指定をしてあげたらいいのかが不明です。。

どなたかご教授頂けると嬉しいです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/11/19 00:38

JSON 及びコードの部分は上下を ``` と ``` で囲ってください。インデントされて読みやすくなるので。
guest

回答1

0

ベストアンサー

提示のJSONでテストしましたが、下記でうまく行きました。

vba

1Private Sub VBA_JSON_TEST() 2 Dim JSON As String 3 Dim docObj As Object 4 JSON = Cells(1).Text 5 Set docObj = JsonConverter.ParseJson(JSON) 6 7 Debug.Print docObj(1)("name") 8 Debug.Print docObj(2)("name") 9End Sub

セルにJSONを入力してテストしました。
イメージ説明
JSON文字列の読み込みに失敗しているのではないでしょうか。

'連想配列に格納するサンプルコード

vba

1Private Sub VBA_JSON_TEST2() 2 Dim JSON As String 3 Dim docObj As Object 4 JSON = Cells(1).Text 5 Set docObj = JsonConverter.ParseJson(JSON) 6 7 Dim name As Object 8 Set name = New Dictionary 9 10 '連想配列 name にJSONの name, id を格納 11 Dim i As Variant 12 For Each i In docObj 13 name.Add i("name"), i("id") 14 Next 15 16 'nameの中身の確認 17 Dim k As Variant 18 Debug.Print "name", "id" 19 For Each k In name.Keys 20 Debug.Print k, name(k) 21 Next 22End Sub

イミディエイトウィンドウへの出力結果

name id あ aaaa い bbbb う cccc

投稿2022/11/19 00:37

hatena19

総合スコア33715

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

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

TatsukiKumagai

2022/11/19 01:00

なんと!!!! 早急なご回答ありがとうございます。 すぐにでも試したいですが、現在出先のため楽しみにしておきます。 また不明な点出てきた場合よろしくお願いします。 ありがとうございます!
TatsukiKumagai

2022/11/19 21:53

お世話になっております。 hatena19 様 正常に動作する事確認できました。。 どうやら、デバック中にapiからJsonを受け取る手間を省くため、セルからjson読み込むようにしておりましたが、セルのjson改行がされておらず、うまく認識できていなかったようです。 とんだ初歩的ミスによりお手数おかけしまして申し訳ございませんでした。。 連想配列に格納するサンプルのご提示までありがとうございます。 VBA-JSONに関しての情報が多くはないので大変勉強になります。 今回のjsonファイルはテストのため "id" "name"の2点になりましたが、 実装時にはキーから複数項目へ検索かけれるように実装したいと考えております。 連想配列のアイテムを連番にし、配列に各項目の値を格納して、値を割り出す(https://www.youtube.com/watch?v=DRG9_mhLV0E&t=284s&ab_channel=%E5%A4%A7%E4%BD%93%E3%81%A7IT)というような 格納の仕方もVBA-jsonで実装可能でしょうか? 本題の質問とは追記事項になってしまうため、よろしければのご回答で構いません。 解決本当に、ありがとうございました。
TatsukiKumagai

2022/11/20 07:31

お世話になります。上記はご放念ください。 本件に関する質問になりますが、 labelsの中のnameを取得するには、どう書けばよろしいでしょうか。。 debug.print docObj.Exists(2)("labels")(2)("name") debug.print docObj.Exists(2)("labels")("name") どちらもプロパティエラーとなってしまいます。
TatsukiKumagai

2022/11/20 07:35

訂正失礼します. 4行目 debug.print docObj(2)("labels")(2)("name") debug.print docObj(2)("labels")("name")
hatena19

2022/11/21 05:25

下記で2つめの要素のlabelsの中のnameを取得します。結果は、「バッテリー」となります。 Debug.Print docObj(2)("labels")(1)("name") []で囲まれた要素は、Collectionに格納されます。参照するときは、インデックスで参照します。2番目の要素は、docObj(2) というように。 {}で囲まれた部分は、Dictionaryに格納されます。変数名(:の前) はkey、値(:の後)にItemに格納されます。 参照するときは変数名で参照します。 docObj(2)の labels の値は docObj(2)("labels") となります。labels の値は [] で囲まれてますので、インデックスで参照します。docObj(2)("labels") 内の要素は一つしかないので、docObj(2)("labels")(1) とします。 その中の name なので、docObj(2)("labels")(1)("name")で「バッテリー」が参照できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問