VBA用Data APIライブラリ(その3・引数の扱い方)

Movable TypeのVBA用Data APIライブラリで、sendメソッドの引数の扱い方を解説します。

1.Scripting.Dictionary型のオブジェクトを利用

APIのエンドポイントによって、パラメータとして多数の値を渡すものがあります。
その場合、パラメータの名前と値を、Scripting.Dictionary型のオブジェクトに代入して、sendメソッドに渡します。

Scripting.Dictionary型は、要素のキーを文字列で指定できる配列のようなものです。
PHPで言うところの連想配列に相当します。
Scripting.Dictionary型は以下のようにして使うことができます。

Dim obj As Scripting.Dictionary
Set obj = New Scripting.Dictionary
obj("キー1") = 値1
obj("キー2") = 値2
・・・

また、オブジェクトの作成/更新を行うエンドポイントでは、パラメータとして、作成/更新するオブジェクトを渡します。
このオブジェクトも、Scripting.Dictionary型のオブジェクトで表します。

2.配列はCollection型で表す

オブジェクトの作成の際に、フィールドによっては、配列のデータが必要になる場合があります。
その場合は、Collection型のオブジェクトを作成し、必要な数だけ要素を追加するという手法を取ります。
Collection型は以下のようにして使うことができます。

Dim c As Collection
Set c = New Collection
c.Add 値1
c.Add 値2
・・・

3.例

例えば、以下のようなことを行いたいとします。

  • IDが1番のブログ(またはウェブサイト)に記事を新規作成します。
  • 作成した記事を、IDが10番と11番のカテゴリに割り当てます。

この場合のプログラムは以下のようになります。

Sub CreateEntry()
    Dim api As MTDataAPI, i As Integer
    Dim response As Scripting.Dictionary
    Dim params As Scripting.Dictionary, entry As Scripting.Dictionary
    Dim cats As Collection, cat As Scripting.Dictionary

    ' 初期化
    Set api = New MTDataAPI
    api.init "http://your-host/path-to-mt/mt-data-api.cgi", "クライアントID"
    ' 認証
    Set params = New Scripting.Dictionary
    params("username") = "ユーザー名"
    params("password") = "パスワード"
    Set response = api.send("authenticate", params)
    If response.Exists("Error") Then
        MsgBox "認証失敗"
        Exit Sub
    End If
    ' 記事作成
    Set entry = New Scripting.Dictionary
    entry("title") = "タイトル"
    entry("body") = "本文"
    Set cats = New Collection
    Set cat = New Scripting.Dictionary
    cat("id") = 10
    cats.Add cat
    Set cat = New Scripting.Dictionary
    cat("id") = 11
    cats.Add cat
    Set entry("categories") = cats
    Set response = api.send("createEntry", 1, entry)
    If response.Exists("Error") Then
        MsgBox "記事作成失敗"
        Exit Sub
    End If
    MsgBox "記事作成成功"
End Sub

11~18行目は、認証を行う部分です。
ユーザー名とパスワードの情報をScripting.Dictionary型のオブジェクトに代入し、それをsendメソッドに渡しています。

20行目以降は、記事を作成する部分です。
まず、記事のタイトル/本文をScripting.Dictionary型のオブジェクトに代入します(20~22行目)。
記事のカテゴリは複数あるので、Collection型のオブジェクトを用意し、それぞれのカテゴリのIDを代入しています(23~30行目)
そして、sendメソッドに記事のオブジェクトを渡して、記事を作成します(31行目)。