見出し画像

[Excel VBA] JSON用Class : cJobject.cls

Overview

- Excel VBAでjsonを操作する外部モジュールとして、2つのクラスが配付されている。

① JsonConverter.bas
  - https://github.com/VBA-tools/VBA-JSON

② cJobject.cls
  - https://ramblings.mcpher.com/excel-to-json-and-back/

JsonConverter.basは、以下で、Jsonとマッピングする。
  - VBAのDictionaryクラス =>Jsonのkey-valueオブジェクト
  - VBAのCollectionクラス=>JsonのArrayオブジェクト

VBAの操作の中で、Dictionaryクラス、Collectionクラスをもとに、Objectを生成する場合に、JsonConverter.basは利用できる。が、今回、YAMLフォーマットでExcel上に記述した情報を、YAML=>Jsonに変換する必要があった。この際、Dictionary/Collectionで、情報を構造化して、YAML=>Json変換をするロジックが難しい。ので、cJObject.clsを使ってみた。

cJObject.cls

cJObject.clsは、YAMLのような対象オブジェクトが、木構造で構成されるObjectをVBA上で扱うのに適したClassと思われる。

Sub SampleOperationOfYaml()
'''' ************************************************
''
Dim jObj As cJobject
Set jObj = New cJobject
''
Call jObj.init(Nothing)
''
With jObj
   .add "martin", ""
   .add "martin.name", "Martin D'veloper"
   .add "martin.job", "Developer"
   With .add("martin.skills").addArray
       .add , "python"
       .add , "perl"
       .add , "pascal"
   End With
   .add "tabatha", ""
   .add "tabatha.name", "Tabatha Cord"
   .add "tabatha.job", "Corder"
   With .add("tabatha.skills").addArray
       .add , "fortran"
       .add , "lisp"
       .add , "erlang"
   End With
End With

Console.info jObj.stringify
Console.info jObj.formatData
''
End Sub

以下、Immediate Window 出力結果。

1                     
1.martin              Developer
1.martin.name         Martin D'veloper
1.martin.job          Developer
1.martin.skills       
1.martin.skills.1     python
1.martin.skills.2     perl
1.martin.skills.3     pascal
1.tabatha             Corder
1.tabatha.name        Tabatha Cord
1.tabatha.job         Corder
1.tabatha.skills      
1.tabatha.skills.1    fortran
1.tabatha.skills.2    lisp
1.tabatha.skills.3    erlang

以下、Jsonにserializeした内容

{
 "martin": {
   "name": "Martin D'veloper",
   "job": "Developer",
   "skills": ["python", "perl", "pascal"]
 },
 "tabatha": {
   "name": "Tabatha Cord",
   "job": "Corder",
   "skills": ["fortran", "lisp", "erlang"]
 }
}

上記のように、ツリーの構造のオブジェクトを生成して、Jsonにserializeすることが可能となる。

cJObject.clsは、当該のサイトが提供しているData Manipulate Toolの一部であり、動作させるには、以下のモジュールも必要となる。

- cJobject.cls
- cregXLib.cls
- cStringChunker.cls
- regxLib
- usefulcJobject
- usefulStuff  

また、以下のReference設定を行う必要がある。
- Microsoft XML, v6.0 (msxml6.dll)
- Microsoft VBScript Regular Expressions 5.5 (vbscript.dll\3?)
- Microsoft Scripting Runtime (scrrun.dll)

cJObject.clsの構造

本クラスのメソッドやプロパティについての明示的に説明しているヘルプサイトがない。以下に、簡単な説明がある。


上記のサイトに、cJObjectの構造について、説明がある。以下、意訳でcJObjectの構造を説明する。

- cJObjectを構成する要素 (Element)は、Key(明示的なkeyと暗黙なkey)とValueを持つ。同じ階層の要素は、Collection要素となる。
- 明示的なKeyは、ユーザが明示的に指定することで付与される。明示的なKeyは、文字列型かVariant型となる。
- 暗黙なKeyは、Index (数字の文字型) を1から自動で付与する。暗黙的なkeyをChildIndexと呼ぶ。
- また、ユーザが明示的にValueを指定する。Valueを明示的に指定しなかった場合は、ValueにEmptyが自動で設定される。
- 同じ階層の要素は、Collection要素となる。当該の要素が、Key-Value要素の場合は、明示的なkeyが設定することで定義できる。当該の要素が、配列要素の場合は、暗黙的なKey(ChildIndex)を設定することで定義できる。

主要なMethods And Properties

以下のMethodがある。

Factory for Object
- cJobject.init
- cJobject.tearDown

CRUD for Element
- cJobject.add
- cJobject.addArray
- cJobject.remove
- cJobject.insert
- cJobject.append
- cJobject.arrayAppend
- cJobject.merge
- cJobject.clone

serialize / deserialize
- cJobject.stringify / cJobject.serialize
- cJobject.formatData
- JSONParse(str)

Operating Elements of Child
- cJobject.children As Collection
- cJobject.childIndex As Long
- cJobject.depth As Long
- cJobject.getObject(shildName As String) As Object
- cJobject.childExists As cJobject
- cJobject.hasChildren As Boolean
- cJobject.isRoot As Boolean
- cJobject.isArrayRoot As Boolean
- cJobject.isArrayMember As Boolean
- cJobject.isObjValue As Boolean
- cJobject.hasKey As Boolean
- cJobject.key As String
- cJobject.fullkey As String
- cJobject.value As Variant
- cJobject.parent As cJobject
- cJobject.root As cJobject
- cJobject.clearParent
- cJobject.deleteChild As cJobject
- cJobject.convertToArray As cJobject
- cJobject.find(str) As cJobject
- cJobject.findByValue(str) As cJobject
- cJobject.findInArray(str) As cJobject

より詳細な操作例は、別途、記述する。

以上

System Development業界、Software Engineering、Scriptingについて、発信してます。サポートありがとうございます。