VBA で kintone 新規レコード作成、json 文字列変換

VBA で kintone の新規レコードオブジェクトを作成し json 文字列に変換する例です。
json 変換に、cJobject ライブラリを使用します。
Access shortcut 機能で、項目値の設定が簡単にできます。

```
    With params.child("record")
        .add "文字列__1行.value", "テスト"
    End With
```

# cjobject ライブラリの準備

cJobject の機能を使うには、下記からexcel ファイルをダウンロードします。
[ダウンロードページ](http://ramblings.mcpher.com/Home/excelquirks/downlable-items) で、Data Manipulation　を展開すると、最後にvanillacJobject.xlsm があります。


今回は、ダウンロードしたファイルに、VBA IDE で、Module を追加して処理を記述します。

# cjobject の使い方

[How to use cJobject](http://ramblings.mcpher.com/Home/excelquirks/json/howcjobject) にサンプルがあります。

オブジェクトと配列を組み立てています。
With だらけですね。

```
Public Sub testcJobject1()
    Dim job As cJobject
    Set job = New cJobject
    
    With job
        .init Nothing, "our first cJobject"
        With .add("bill", "founder")
            With .add("kids")
                With .AddArray
                    .add , "mary"
                    .add , "janet"
                End With
            End With
        End With
    End With
    
    Debug.Print job.Serialize
    Debug.Print job.formatData
End Sub
```

サンプル実行結果

Serialize で、文字列に変換してくれます。

```
{"our first cJobject":{"bill":{"kids":["mary","janet" ]}}}
```

# kintone 新規レコード登録用オブジェクト作成

サンプルを応用して、kintone 新規レコード登録用のオブジェクトを作成します。
項目やテーブルの行数が多いと、With だらけです。
value が配列、サブテーブルの例を入れましたので、他の項目も同様に設定出来ると思います。

```createRecordParams1.vba
Public Sub createRecordParams1()
    Dim params As cJobject
    Set params = New cJobject
    
    With params
        .init Nothing
        With .add("app", "123")
        End With
        With .add("record")
            With .add("文字列__1行")
                With .add("value", "テスト")
                End With
            End With
            With .add("チェックボックス")
                With .add("value")
                    With .addArray
                        .add , "sample1"
                        .add , "sample2"
                    End With
                End With
            End With
            With .add("Table")
                With .add("value")
                    With .addArray
                        With .add
                            With .add("value")
                                With .add("テーブル文字列")
                                    With .add("value", "テスト1")
                                    End With
                                End With
                                With .add("ユーザー選択")
                                    With .add("value")
                                        With .addArray
                                            With .add
                                                With .add("code")
                                                     .add , "test11"
                                                End With
                                            End With
                                            With .add
                                                With .add("code")
                                                     .add , "test12"
                                                End With
                                            End With
                                        End With
                                    End With
                                End With
                            End With
                        End With
                        With .add
                            With .add("value")
                                With .add("テーブル文字列")
                                    With .add("value", "テスト2")
                                    End With
                                End With
                                With .add("ユーザー選択")
                                    With .add("value")
                                        With .addArray
                                            With .add
                                                With .add("code")
                                                     .add , "test21"
                                                End With
                                            End With
                                            With .add
                                                With .add("code")
                                                     .add , "test22"
                                                End With
                                            End With
                                        End With
                                    End With
                                End With
                            End With
                        End With
                    End With
                End With
            End With
        
        End With
    End With
    
    Debug.Print params.serialize
    
End Sub
```

# 実行結果

イミディエイトウィンドウの表示です。

```
{"app":"123","record":{"文字列__1行":{"value":"テスト"},"チェックボックス":{"value":["sample1","sample2" ]},"Table":{"value":[{"value":{"テーブル文字列":{"value":"テスト1"},"ユーザー選択":{"value":[{"code":"test11"},{"code":"test12"} ]}}},{"value":{"テーブル文字列":{"value":"テスト2"},"ユーザー選択":{"value":[{"code":"test21"},{"code":"test22"} ]}}} ]}}}

```


見やすいように整形します。
問題ないようです。

```
{
    "app": "123",
    "record":
    {
        "文字列__1行":
        {
            "value": "テスト"
        },
        "チェックボックス":
        {
            "value": ["sample1", "sample2"]
        },
        "Table": {
            "value": [
                {
                    "value":
                    {
                        "テーブル文字列":
                        {
                            "value": "テスト1"
                        },
                        "ユーザー選択": {
                            "value": [
                                { "code": "test11" },
                                { "code": "test12" }
                            ]
                        }
                    }
                },
                {
                    "value": {
                        "テーブル文字列":
                        {
                            "value": "テスト2"
                        },
                        "ユーザー選択": {
                            "value": [
                                { "code": "test21" },
                                { "code": "test22" }
                            ]
                        }
                    }
                }
            ]
        }
    }
}
```


# レコードの項目値へのアクセス

child("キー") : キーを指定して、子cJobject を取得します。
child("キー.キー") : Access shortcut キーを指定して、子cJobject を取得します。
children(1) : index を指定して、配列およびオブジェクトの 子cJobject を取得します。


```
    ' 項目値の取得
    Debug.Print "文字列__1行: " & params.child("record").child("文字列__1行").child("value").value
    
    ' 項目値の取得 Access shortcuts
    Debug.Print "Access shortcuts: " & params.child("record.文字列__1行.value").value
    
    ' 項目値の取得 children
    Debug.Print "children: " & params.children(2).children(1).children(1).value
    
    
    Debug.Print
    
    ' サブテーブル項目値の取得
    Debug.Print "テーブル文字列: " & params.child("record").child("Table").child("value").child(1).child("value").child("テーブル文字列").child("value").value
    
    ' サブテーブル項目値の取得 Access shortcuts
    Debug.Print "Access shortcuts: " & params.child("record.Table.value.1.value.テーブル文字列.value").value

```

実行結果

```
文字列__1行: テスト
Access shortcuts: テスト
children: テスト

テーブル文字列: テスト1
Access shortcuts: テスト1
```

# Shortcut版 新規レコード登録用オブジェクト作成

cJobject 追加時も、Shortcut 機能が使えます。
kintone で、よくある 項目.value の構造が少し簡単に記述できます。

　With .add("文字列__1行.value", "テスト")

これで、コード量を少し減らすことができます。
実行結果は、同じです。

ただし、この記述方法については、いろいろ試した結果出来ることを見つけたものです。
いまのところ、本家サンプルに見つけられませんでした。

あと、直下に１オブジェクトの場合は、 With を省略出来ますので、簡単化します。
これで、だいぶコード量・階層が減って、見やすくなります。

```createRecordParams2.vba
Public Sub createRecordParams2()
    Dim params As cJobject
    Set params = New cJobject
    
    With params
        .init Nothing
        .add "app", "123"
        With .add("record")
            .add "文字列__1行.value", "テスト"
            With .add("チェックボックス.value").addArray
                .add , "sample1"
                .add , "sample2"
            End With
            With .add("Table.value").addArray
                With .add.add("value")
                    .add "テーブル文字列.value", "テスト1"
                    With .add("ユーザー選択.value").addArray
                        .add.add "code", "test11"
                        .add.add "code", "test12"
                    End With
                End With
                With .add.add("value")
                    .add "テーブル文字列.value", "テスト2"
                    With .add("ユーザー選択.value").addArray
                        .add.add "code", "test21"
                        .add.add "code", "test22"
                    End With
                End With
            End With
        
        End With
    End With
    
    Debug.Print params.serialize
    
End Sub
```

# 項目別のレコード設定

項目毎に設定する処理です。
cJobject の必要な階層のオブジェクトを取得して、設定できます。

```createRecordParams3.vba
Public Sub createRecordParams3()
    Dim params As cJobject, record As cJobject, table As cJobject
    
    Set params = New cJobject
    With params
        .init Nothing
        .add "app", "123"
        .add "record"
    End With
    
    With params.child("record")
        .add "文字列__1行.value", "テスト"
    End With
    
    Set record = params.child("record")
    With record.add("チェックボックス.value").addArray
        .add , "sample1"
        .add , "sample2"
    End With
            
    
    record.add("Table.value").addArray
    Set table = record.child("Table.value")
    With table
        With .add.add("value")
            .add "テーブル文字列.value", "テスト1"
            With .add("ユーザー選択.value").addArray
                .add.add "code", "test11"
                .add.add "code", "test12"
            End With
        End With
        With .add.add("value")
            .add "テーブル文字列.value", "テスト2"
            With .add("ユーザー選択.value").addArray
                .add.add "code", "test21"
                .add.add "code", "test22"
            End With
        End With
    End With

    
    Debug.Print params.serialize
    
End Sub
```


# 関連

[VBA で kintone レコードを取得し json 変換](http://qiita.com/rex0220/items/a3fd335e4d8e87e02af7)
[VBA で kintone ユーザー情報を取得し json 変換](http://qiita.com/rex0220/items/4cff6401f89f6f3c9def)
[VBA で kintone 新規レコード作成、json 文字列変換](http://qiita.com/rex0220/items/a196a0b7121217b7495c)