商品検索を行う共通部分のVBAを記述する
ほぼ前回と同じです。商品種別の切り替えに関して異なる箇所のみ☆で示します。
[リスト1]商品検索を行うVBA
Private Sub SearchItem(ByVal ItemPage As Integer)
'要求ページをItemPage仮引数で受け取る
'変数の準備(略)
'(1)検索条件の入力チェック(略)
'(2)引数の準備
'連想配列オブジェクトの生成(前回と同じ)
'(2-1)商品種別をSearchIndex引数に設定する
param("SearchIndex") = ★Range("SearchIndexList").Cells(Range("ItemGroupIndex"))★
'(2-2)検索条件を★商品種類に応じた★引数に設定する
For idxVal = 1 To Range("SearchValueList").Rows.Count
If Len(Range("SearchValueList").Cells(idxVal)) > 0 Then
param(Range("SearchKeyTable").Cells(idxVal, ★Range("ItemGroupIndex")★)) = Range("SearchValueList").Cells(idxVal)
End If
Next
'(2-3)ソート順を引数に設定する
param("Sort") = Range("SortTypeTable").Cells(Range("SortTypeIndex"), ★Range("ItemGroupIndex")★)
'(2-4)表示ページを引数に指定する(前回と同じ)
'(3)HTTP通信によるリクエスト送信(前回と同じ)
'(4)レスポンスの展開
Set elmResponse = xmlRes.DocumentElement
Set elmItems = elmResponse.SelectSingleNode("Items")
'(4-1)検索件数、ページ数の取得(前回と同じ)
'(4-2)検索結果データの展開
Set elmItemList = elmItems.SelectNodes("Item")
For idxItem = 0 To elmItemList.Length - 1
'データ1件分の処理
Set elmItem = elmItemList(idxItem)
'詳細ページURLの取得
Set elmItemUrl = elmItem.SelectSingleNode("DetailPageURL")
txtUrl = elmItemUrl.Text
ttlUrl = ""
'(4-3)属性タグの取得
Set elmItemAttrTag = elmItem.SelectSingleNode("ItemAttributes")
For idxTag = 0 To elmItemAttrTag.ChildNodes.Length - 1
'(4-4)属性タグ内の処理
txtTag = elmItemAttrTag.ChildNodes(idxTag).nodeName
For idxCol = 1 To Range("ResItemTable").Columns.Count
'(4-5)必要な取得項目ごとの処理
txtCol = Range("ResItemTable").Cells(★Range("ItemGroupIndex")★, idxCol)
If txtCol = "Title" Then idxUrl = idxCol
If txtTag = txtCol Then
'(4-6)タグと取得項目が一致した場合(前回と同じ、4-7、4-8を含む)
End If
Next
'(4-9)詳細ページURLをタイトルに貼る(前回と同じ)
Next
Next
'(5)次の10件、前の10件ボタンの利用可否を設定(前回と同じ)
End Sub
前回と異なる部分のみ説明します。
(2-1)で商品種別をSearchIndex引数に設定します。前回は固定値"Books"を設定するだけでしたが、今回は商品種別に対応した値を設定する必要があります。コンボボックスで本/DVD/ミュージックのいずれかを選択すると、Range("ItemGroupIndex")には対応した商品種別インデックスとして、1/2/3のいずれかが入ります。Range("SearchIndexList")には、Books/DVD/Musicが格納されていますので、.Cells(商品種別インデックス)で、引数値を設定できます。例えば、ミュージックを選択した場合、param("SearchIndex")="Music"と設定していることになります。
(2-2)では、Range("SearchValueList")を検索項目の数だけidxVal変数で走査し、値が入力済の場合、検索条件を追加します。Range("SearchKeyTable")には、1列目にAuthor/Title/Publisher/Keywords、2列目にActor/Title/Publisher/Keywords、3列目にArtist/Title/MusicLabel/Keywordsが格納されていますので、.Cells(商品種別インデックス,idxVal)で、引数値を設定できます。例えば、DVDを選択して出演者を入力した場合、param("Actor")="(出演者名)"と設定していることになります。
(2-3)でソート順をSort引数に設定します。コンボボックスで売れている順/価格の安い順/発行日の新しい順のいずれかを選択すると、Range("SortTypeIndex")には対応した商品種別インデックスとして、1/2/3のいずれかが入ります。Range("SortTypeTable")には、1列目にsalesrank/pricerank/daterank、2列目にsalesrank/pricerank/-releasedate、3列目にsalesrank/pricerank/-releasedateが格納されていますので、.Cells(ソート順インデックス,商品種別インデックス)で、引数値を設定できます。例えば、本を選択して、発行日の新しい順を選択した場合、param("Sort")="daterank"と設定していることになります。
(4)でXMLデータを展開します(図10)。
(4-5)では、商品種別に応じた取得項目名を、txtColに格納しています。ResItemTableの1/2/3行目には、それぞれBooks/DVD/Musicの項目名が入っていますので、ItemGroupIndex行、idxCol列の値が、商品種別に応じた取得項目名になります。
オブジェクトの処理に応じたVBAを記述する
「検索する」「次の10件」「前の10件」ボタンをクリックした際の処理は、前回と全く同様です。
ワークシートに戻り、任意のセルをクリックしてオブジェクトが選択状態が解除されていることを確認し、[開発]タブの[デザインモード]をONの状態で、コンボボックスcbSearchIndexをダブルクリックすると、VBエディタが開きます。この中に以下のコードを記述します。
[リスト2][商品種別]変更時のVBA
Private Sub cbSearchIndex_Change()
Range("SearchValueList").Cells.ClearContents
Range("ResValueTable").Cells.ClearContents
Range("TotalResults").Cells.ClearContents
Range("CurrentPage").Cells.ClearContents
Range("TotalPages").Cells.ClearContents
cbPrev.Enabled = False
cbNext.Enabled = False
End Sub
商品種別を変更した際には、変更前の検索で残っている状態をクリアします。残っているデータとして、検索条件の入力範囲、レスポンス表示部、総件数などを、ClearContentsメソッドを使ってクリアします。また、[次の10件][前の10件]ボタンも無効化します。
これにて完成です。商品種別を選び、検索条件を入力し、ソート順を選んで、[検索する]ボタンをクリックしてみてください。10件ずつ取得でき、タイトルのリンクをクリックすると、商品の詳細ページが表示されれば成功です。
まとめ
Amazonの商品検索はいかがでしたか。今回取り扱った種別以外の商品検索をしたい方は、下記のURLを参考にして、チャレンジしてみてください。
https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/JPSearchIndexParamForItemsearch.html
WINGSプロジェクト 遠藤 存著/山田祥寛監修
WINGS プロジェクトについて
テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。2011年5月時点での登録メンバは35名で、現在も一緒に執筆をできる有志を募集中。