VBA で kintone ユーザー情報を取得し json 変換

VBA で kintone ユーザー情報を取得し json 変換する例です。
json 変換に、cJobject ライブラリを使用します。
[VBA で kintone レコードを取得し json 変換](http://qiita.com/rex0220/items/a3fd335e4d8e87e02af7)　とほとんど同じ手順です。

# 環境

Windows 10 Pro
Excel 2016

# cjobject ライブラリの準備

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


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


# ユーザーエクスポートAPI 取得

[ユーザーエクスポートAPI](https://developer.cybozu.io/hc/ja/articles/202363040) で、codes を指定して、ユーザー情報を取得します。

S001, S002 の codes を指定した例

```
    strQuery = "codes[0]=S001&codes[1]=S002"
    strURL = "https://<サブドメイン>.cybozu.com/v1/users.json?" & strQuery
```
※ query をエンコードするとエラーになります。

# ログイン認証のBase64変換

cJobject ライブラリに、Base64Encode関数があるので、それを使います。

```.vba
Dim strAuthorization As String     ' Authorization
strAuthorization = Base64Encode("USER:PASS")
```

# レスポンス情報を json 変換

JSONParse 関数でレスポンス情報を、cjobject に変換できます。

```.vba
    Dim resp As cJobject           ' json data
    Dim users As cJobject           ' json data

    ...
    Set resp = JSONParse(strJSON)
    Set users = resp.child("users")

```

# ユーザー情報内の項目値を取り出す

ユーザー情報の配列からからユーザー情報を取り出します。
user.stringify　は、cjobject を文字列に変換します。

```.vba
    For Each user In users.children
        
        If users.children.Count > 0 Then
            
            ' ユーザーの情報
            Debug.Print "ユーザー情報: " & user.stringify
            
            Dim info As cJobject
            ' 全情報
            For Each info In user.children
                Debug.Print info.stringify
            Next info
            Debug.Print vbCrLf
            
        End If
    Next user
```


# VBA コード全体


```module1.vba
Sub kintoneGetTest2()
    
    '--------------------------------------------------------------------
    '  変数定義
    '--------------------------------------------------------------------
    Dim objHttpReq As XMLHTTP60   ' XMLHTTP オブジェクト
    Dim strJSON As String              ' レスポンスで受け取るJSONデータ
    Dim strURL As String               ' アクセス先URL
    Dim strQuery As String             ' 検索文字列
    Dim strAuthorization As String     ' Authorization
    
    strAuthorization = Base64Encode("USER:PASS")
    
    '------------------------------------------------------------------
    ' 検索文字付きURLを作成する
    '------------------------------------------------------------------
    strQuery = "codes[0]=S001&codes[1]=S002"
    strURL = "https://<サブドメイン>.cybozu.com/v1/users.json?" & strQuery
    
    '------------------------------------------------------------------
    ' XMLHTTP オブジェクトを生成する
    '------------------------------------------------------------------
    Set objHttpReq = CreateObject("MSXML2.XMLHTTP")
    objHttpReq.Open "GET", strURL, False
    '------------------------------------------------------------------
    ' XMLHTTP のリクエストヘッダーを指定する
    '------------------------------------------------------------------
    ' ログイン認証
    objHttpReq.setRequestHeader "X-Cybozu-Authorization", strAuthorization
    ' Basic 認証
    'objHttpReq.setRequestHeader "Authorization", "Basic " & <ベーシック認証情報>
    'ドメイン名：ポート番号
    objHttpReq.setRequestHeader "Host", "<サブドメイン>.cybozu.com" + ":443"
    'キャッシュ対策（常にレスポンスが取得できる状態にする）
    objHttpReq.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
    
    '------------------------------------------------------------------
    ' リクエストを送信する
    '------------------------------------------------------------------
    objHttpReq.send (Null)
    
    '------------------------------------------------------------------
    ' レスポンスを取得する
    '------------------------------------------------------------------
    'レスポンス情報を変数に格納する
    
    Dim resp As cJobject           ' json data
    Dim users As cJobject           ' json data
    Dim user As cJobject           ' json data
    
    strJSON = objHttpReq.responseText
    'Debug.Print "resp: " & strJSON
    Set resp = JSONParse(strJSON)
    Set users = resp.child("users")
    
    
    For Each user In users.children
        
        If user.children.Count > 0 Then
            
            ' ユーザーの情報
            Debug.Print "ユーザー情報: " & user.stringify
            
            Dim info As cJobject
            ' 全情報
            For Each info In user.children
                Debug.Print info.stringify
            Next info
            Debug.Print vbCrLf
            
        End If
    Next user

End Sub
```

# 実行結果

イミディエイトウィンドウ

```
ユーザー情報: {"id":"11","code":"S001","ctime":"2017-02-18T03:46:47Z","mtime":"2017-02-18T03:46:47Z","valid":false,"name":"早乙女太一","surName":"","givenName":"","surNameReading":"","givenNameReading":"","localName":"","localNameLocale":"ja","timezone":"Asia/Tokyo","locale":null,"description":"","phone":"","mobilePhone":"","extensionNumber":"","email":"","callto":"","url":"","employeeNumber":"","birthDate":null,"joinDate":null,"primaryOrganization":null,"sortOrder":null,"customItemValues":[ ]}
{"id":"11"}
{"code":"S001"}
{"ctime":"2017-02-18T03:46:47Z"}
{"mtime":"2017-02-18T03:46:47Z"}
{"valid":false}
{"name":"早乙女太一"}
{"surName":""}
{"givenName":""}
{"surNameReading":""}
{"givenNameReading":""}
{"localName":""}
{"localNameLocale":"ja"}
{"timezone":"Asia/Tokyo"}
{"locale":null}
{"description":""}
{"phone":""}
{"mobilePhone":""}
{"extensionNumber":""}
{"email":""}
{"callto":""}
{"url":""}
{"employeeNumber":""}
{"birthDate":null}
{"joinDate":null}
{"primaryOrganization":null}
{"sortOrder":null}
{"customItemValues":[ ]}


ユーザー情報: {"id":"12","code":"S002","ctime":"2017-02-18T03:46:47Z","mtime":"2017-02-18T03:46:47Z","valid":false,"name":"高橋一生","surName":"","givenName":"","surNameReading":"","givenNameReading":"","localName":"","localNameLocale":"ja","timezone":"Asia/Tokyo","locale":null,"description":"","phone":"","mobilePhone":"","extensionNumber":"","email":"","callto":"","url":"","employeeNumber":"","birthDate":null,"joinDate":null,"primaryOrganization":null,"sortOrder":null,"customItemValues":[ ]}
{"id":"12"}
{"code":"S002"}
{"ctime":"2017-02-18T03:46:47Z"}
{"mtime":"2017-02-18T03:46:47Z"}
{"valid":false}
{"name":"高橋一生"}
{"surName":""}
{"givenName":""}
{"surNameReading":""}
{"givenNameReading":""}
{"localName":""}
{"localNameLocale":"ja"}
{"timezone":"Asia/Tokyo"}
{"locale":null}
{"description":""}
{"phone":""}
{"mobilePhone":""}
{"extensionNumber":""}
{"email":""}
{"callto":""}
{"url":""}
{"employeeNumber":""}
{"birthDate":null}
{"joinDate":null}
{"primaryOrganization":null}
{"sortOrder":null}
{"customItemValues":[ ]}

```

# 関連

[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)