共通の変数・定数を準備するVBAを記述する

参照設定で「Microsoft XML,v3.0」を追加した上、以下のように準備します。また、(アプリケーションID)はご自分で取得したものに置き換えてください。

[リスト1]共通の変数・定数を準備する

   Const appID As String = "(アプリケーションID)"
  (略)

カテゴリ情報取得のVBAを記述する

まず、カテゴリIDを引数に指定して、そのカテゴリ情報を取得するプロシージャgetCateを記述します。

[リスト2]プロシージャgetCate

  Sub getCate(cateID As String)

      '(1)カテゴリ情報のリクエスト送信
      (略)
         url = urlTree & "?appid=" & appID & "&category=" & cateID
      xmlhttp.Open "GET", url, False
      xmlhttp.send
      (略)

      '(2)データをXMLマップに上書きインポート
      resText = xmlhttp.responseText
      ActiveWorkbook.XmlMaps("ResultSet_対応付け").ImportXml

xmldata:=resText, overwrite:=True (略)

      '(3)コンボボックスの選択肢を設定
      Set rng = Sheets("Cate").Range("テーブル1")
      cbCate.Enabled = False
      cbCate.Clear
      For i = 1 To rng.Rows.Count
          cbCate.AddItem rng.Cells(i, colCateName).value
      Next i
      cbCate.Enabled = True

      '(4)カテゴリパスを取得
      (略)
      xmldata.LoadXML resText 'レスポンスをXML文書として格納
      Set ResultSet = xmldata.DocumentElement
      Set Result = ResultSet.FirstChild
      Range("CatePath") =

Result.getElementsByTagName("CategoryPath")(0).Text (略)

      '(5)トップカテゴリの場合
      If cateID = "0" Then
          cbTop.Enabled = False
          cbUpper.Enabled = False
      End If

      '(6)末端カテゴリでない場合
      obPrice.Enabled = False
      (略)

  End Sub

(1)リクエストURLに、appIDと仮引数のカテゴリIDをパラメータとして追加して送信します。
(2)対応付けに、取得したカテゴリ情報を、上書きモードで読み込み、テーブル1を更新しています。
(3)テーブル1のカテゴリ名一覧を、コンボボックスに再設定しています。後述のcbCate_Changedイベントが発生してしまうため、設定中はEnable属性をFalseにしておきます。
(4)カテゴリパスを取得しています。
(5)トップカテゴリの場合、[上位へ][トップへ]ボタンを無効にしています。
(6)末端カテゴリでないので、商品リスト取得関連のオブジェクトを無効にしています。

図12.カテゴリ情報の読み込みとコンボボックスへの再設定

カテゴリ関連のVBAを記述する

次に、カテゴリを選択した場合のプロシージャcbCate_Changeを記述します。

[リスト3]プロシージャcbCate_Change

  Private Sub cbCate_Change()

      '(1)選択されたカテゴリの、テーブル1上の該当行を計算
      rowCate = cbCate.ListIndex + 1

      '(2)選択されたカテゴリの属性に応じた、オブジェクトの有効/無効を設定
      Set rng = Sheets("Cate").Range("テーブル1")

      '(3)親カテゴリがトップか否かによるオブジェクトの設定
      If rng.Cells(rowCate, colParentID) <> 0 Then
          cbTop.Enabled = True
          cbUpper.Enabled = True
      Else
          cbTop.Enabled = False
          cbUpper.Enabled = False
      End If

      '(4)カテゴリが末端か否かによるオブジェクトの設定
      If rng.Cells(rowCate, colIsLeaf) = False Then
          cbLower.Enabled = True
          obPrice.Enabled = False
         (略)
      Else
          cbLower.Enabled = False
          obPrice.Enabled = True
         (略)
      End If

      '(5)その他のオブジェクトの設定
      cbNext.Enabled = False
      cbPrev.Enabled = False

  End Sub

(1)カテゴリ選択コンボボックスのListIndexプロパティは0始まりなので、1を加算したものをrowCateに設定します。
(2)Cateシートのテーブル1の範囲をrngに設定します。
(3)親カテゴリがトップか否かにより、[上位へ][トップへ]ボタンを無効化/有効化します。
(4)選択カテゴリが末端か否かにより、商品リスト取得関連のオブジェクトを有効化/無効化します。
(5)商品リストは未取得なので、[次頁][前頁]ボタンを無効化します。

その他、カテゴリ情報関連のプロシージャは以下の通りです(コードは省略)。

表11.カテゴリ情報関連のプロシージャ

名前 処理内容
cbLower_Click 選択されたカテゴリIDの下位のカテゴリを取得
cbUpper_Click 選択されたカテゴリIDの上位のカテゴリを取得
cbTop_Click カテゴリID"0"を引数として最上位のカテゴリを取得