EXCELからkintoneアプリの500件以上のデータを取得したい

EXCEL VBAによりkintoneアプリデータを取得したいと考えております。
但し、kintoneアプリのデータ件数が500件を超えているために、試行錯誤を繰り返しております。

offsetを使用しDo Whileにてoffset値を変えながらと思い、後述するコードにてデータ取得を試みております。
しかしながら、初回の parseJSON(strJSON)以降では問題なく、データを取得できているのですが、Do Whileによる2回目にて「実行時エラー’424’ オブジェクトが必要です」ととしてエラーになります。
エラーが発生する行は If objJSON(“records”).Count = 0 Then Exit Do 行になっております。

原因と解決方法が分らず、どなたかご助言をお願いできませんでしょうか?

最終目的は1000件ほどのデータを取得したいのですが、下記、ソース上は5件ずつにてテスト中です。
尚、query文のoffset値の確認の為、途中の内容を確認(debug.print)しましたが、
初回 limit 5 offset 0
2回目limit 5 offset 5
になり、offset値は想定通りになっております。
又、初回時にoffset値を5とした場合も初回はデータ入手できますが、2回目には実行時エラーとなります。

よろしくお願い致します。

Option Explicit

Public AppID As Integer
Public APItoken As String
Public Domain As String
Public kintoneURL As String

Sub connect_kintone()
    AppID = 999 '接続したいアプリ番号
    APItoken = "ABCDEFGHIJKLMN" '接続したいアプリのAPIトークン
    Domain = "My_Domain.cybozu.com" 'kintone独自ドメイン
    kintoneURL = "https://" & Domain & "/k/v1/records.json?app=" & AppID
End Sub

Sub get_kintone()
    Call connect_kintone 'kintoneの接続情報を呼び出す
    
    Dim KintoneQuery As String
    Dim offset As Long
    Dim limit As Long
    Dim totalRecords As Long
    Dim objHttpReq As Object
    Dim strJSON As String
    Dim objJSON As Object
    Dim record As Variant
    Dim insertRow As Long
    
    offset = 0
    limit = 5
    totalRecords = 0
    
    Do
        KintoneQuery = "limit " & limit & " offset " & offset
        kintoneURL = kintoneURL & "&query=" & WorksheetFunction.EncodeURL(KintoneQuery)
       Debug.Print KintoneQuery
       
        Set objHttpReq = CreateObject("MSXML2.XMLHTTP")
        objHttpReq.Open "GET", kintoneURL, False
        objHttpReq.setRequestHeader "X-Cybozu-Api-Token", APItoken
        objHttpReq.send (Null)
        
        strJSON = objHttpReq.responseText
        Set objJSON = parseJSON(strJSON)
        
        If objJSON("records").Count = 0 Then Exit Do
        
        For Each record In objJSON("records")
            ' 取得したデータをExcelシートに転記する処理
            ' 例: Cells(insertRow, 1).Value = record("フィールドコード")
            insertRow = insertRow + 1
        Next record
        
        offset = offset + limit
        totalRecords = totalRecords + objJSON("records").Count
    Loop While objJSON("records").Count = limit
End Sub

考えたこと・やったこと

If objJSON("records").Count = 0 Then Exit Do

でエラーになっているが、


2回目のクエリに失敗していることに気づく

        strJSON = objHttpReq.responseText
        Debug.Print strJSON

で帰ってきている値が

{"code":"CB_VA01","id":"xxxxx","message":"入力内容が正しくありません。","errors":{"query":{"messages":["クエリ記法が間違っています。"]}}}

になっており、2回目のクエリが怪しいことに気づく

kintoneURL = kintoneURL & "&query=" & WorksheetFunction.EncodeURL(KintoneQuery)

の部分で、1回目のoffsetとlimitのついたクエリ文字列にさらに追加して2回目のクエリを実行しているエラーになっているのを見つける。

&query=limit%205%20offset%200&query=limit%205%20offset%205

「&query=」の部分が2回あった。

kintoneURLを使い回さないようにすると

Sub get_kintone()
    ' kintoneの接続情報を呼び出す
    connect_kintone
    
    Dim KintoneQuery As String
    Dim KintoneQueryURL As String
    Dim offset As Long
    Dim limit As Long
    Dim totalRecords As Long
    Dim objHttpReq As Object
    Dim strJSON As String
    Dim objJSON As Object
    Dim record As Variant
    Dim insertRow As Long
    
    offset = 0
    limit = 5
    totalRecords = 0
    
    Do
        KintoneQuery = "limit " & limit & " offset " & offset
        KintoneQueryURL = kintoneURL & "&query=" & WorksheetFunction.EncodeURL(KintoneQuery)
        
        Set objHttpReq = CreateObject("MSXML2.XMLHTTP")
        objHttpReq.Open "GET", KintoneQueryURL, False
        objHttpReq.setRequestHeader "X-Cybozu-Api-Token", APItoken
        objHttpReq.send (Null)
        
        strJSON = objHttpReq.responseText
        Debug.Print (strJSON)
        Set objJSON = ParseJson(strJSON)
        
        If objJSON("records").Count = 0 Then Exit Do
        
        For Each record In objJSON("records")
            ' 取得したデータをExcelシートに転記する処理
            ' 例: Cells(insertRow, 1).Value = record("フィールドコード")
            insertRow = insertRow + 1
        Next record
        
        offset = offset + limit
        totalRecords = totalRecords + objJSON("records").Count
    Loop While objJSON("records").Count = limit
End Sub

のようにしました。

aaa様

ご指摘ありがとうございました。
変数のkintoneURLを使い回さないように、ご指摘の通り修正し確認をしましたところエラーが発生せず思惑通りの動きとなりました。

お忙しい中、コメントを頂きありがとうございました。
大変助かりました。

「いいね!」 1

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。