LoginSignup
0
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-06

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

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

cjobject ライブラリの準備

cJobject の機能を使うには、下記からexcel ファイルをダウンロードします。
ダウンロードページ で、Data Manipulation を展開すると、最後にvanillacJobject.xlsm があります。

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

cjobject の使い方

How to use cJobject にサンプルがあります。

オブジェクトと配列を組み立てています。
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", "テスト")

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

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

あと、直下に1オブジェクトの場合は、 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 変換
VBA で kintone ユーザー情報を取得し json 変換
VBA で kintone 新規レコード作成、json 文字列変換

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3