前提
ExcelのマクロでZAICOというWebアプリからAPIで在庫データを呼び出すシステムを作っています。
Webで公開されているWindowsで走るコードサンプルをmacで実装中に .Countが使用できないことに気づきました。
実現したいこと
クラスモジュールでCountを作成し
If Inventories.Count() = 0 Then
Exit Do
End If
のコードが走るようにしたい。
###サンプルコード
Dim Client As New ZaicoApiClient
Function SetZaicoApiAccessToeknOnSheet()
Worksheets("在庫一覧").Activate
' APIキーが設定されているか確認 Dim ApiKey As String ApiKey = Cells(1, 2).value If Len(ApiKey) = 0 Then MsgBox "ZAICOのAPIトークンが設定されていません", vbCritical SetZaicoApiAccessToeknOnSheet = False Exit Function End If Client.SetApiAccessToken ApiKey SetZaicoApiAccessToeknOnSheet = True
End Function
Private keys As New Collection
Private values As New Collection
Sub OnGetInventoryButtonPushed()
If Not SetZaicoApiAccessToeknOnSheet Then
Exit Sub
End If
' 追加項目用の変数 Dim OptionalAttributes As Variant Dim NameValueDic As Dictionary Dim AttrName As String Dim AttrVal ' 在庫一覧取得API用ページ番号 Dim PageNo As Integer PageNo = 1 ' 描画先のシート関連 Worksheets("在庫一覧").Activate StartRowNo = 7 ' データの表示を開始する行番号 i = 0 Dim TargetRowNo As Integer Do While True Set Inventories = Client.GetInventories(PageNo) If Inventories.Count = 0 Then Exit Do End If For Each Inventory In Inventories TargetRowNo = StartRowNo + i Cells(TargetRowNo, 1) = Inventory.Item("id") Cells(TargetRowNo, 2) = Inventory.Item("title") Cells(TargetRowNo, 3) = Inventory.Item("quantity") Cells(TargetRowNo, 4) = Inventory.Item("unit") Cells(TargetRowNo, 5) = Inventory.Item("category") Cells(TargetRowNo, 6) = Inventory.Item("state") Cells(TargetRowNo, 7) = Inventory.Item("place") Cells(TargetRowNo, 8) = Inventory.Item("code") Cells(TargetRowNo, 9) = Inventory.Item("updated_at") ' 画像ファイルのURL Set ItemImage = Inventory.Item("item_image") Cells(TargetRowNo, 10) = ItemImage.Item("url") ' 追加項目の表示 If TypeName(Inventory.Item("optional_attributes")) = "Collection" Then Set OptionalAttributes = Inventory.Item("optional_attributes") j = 1 For Each NameValueDic In OptionalAttributes AttrName = NameValueDic.Item("name") AttrVal = NameValueDic.Item("value") If IsNull(AttrVal) Then AttrVal = "" End If Cells(TargetRowNo, 10 + j) = AttrName + ": " + AttrVal j = j + 1 Next NameValueDic End If i = i + 1 Next Inventory PageNo = PageNo + 1 ' 1秒間をおいてAPIの連続アクセスを緩和 Application.Wait Now() + TimeValue("00:00:01") Loop
End Sub
Sub OnPostNewInventoryButtonPushed()
Dim OptionalAttributes As Variant ' 追加項目はJSONをネストさせて配列で送る必要があるのでここにNameValueDicをコレクションとしてもらせることで実現する
Dim NameValueDic As Dictionary
Worksheets("在庫登録").Activate Const TargetColNo As Integer = 2 Const StartRowNo As Integer = 2 Dim Data As New Dictionary Data.Add "title", Cells(StartRowNo, TargetColNo).value Data.Add "quantity", Cells(StartRowNo + 1, TargetColNo).value Data.Add "unit", Cells(StartRowNo + 2, TargetColNo).value Data.Add "category", Cells(StartRowNo + 3, TargetColNo).value Data.Add "state", Cells(StartRowNo + 4, TargetColNo).value Data.Add "place", Cells(StartRowNo + 5, TargetColNo).value Data.Add "code", Cells(StartRowNo + 6, TargetColNo).value ' 追加項目「型式」の値をセット Set OptionalAttributes = New Collection Set NameValueDic = New Dictionary NameValueDic.Add "name", "型式" NameValueDic.Add "value", Cells(StartRowNo + 7, TargetColNo).value OptionalAttributes.Add NameValueDic Data.Add "optional_attributes", OptionalAttributes ' 追加項目を送信データにセット SetZaicoApiAccessToeknOnSheet Set Response = Client.CreateInventory(Data) If Response.StatusCode = WebStatusCode.Ok Then MsgBox "在庫データが登録されました。" Worksheets("在庫登録").Activate End If
End Sub
0 コメント