アプリ版:「スタンプのみでお礼する」機能のリリースについて

こちらの識者の方々にはいつもお世話になっています。
VBAの質問です。

環境は下記になります。
OS=windowsXP SP3
Office=Excel2003(11.8347.8403) SP3

WEBページからリンクをたどって必要な情報をExcelのシートに書き出していきたいのですが、やり方がわからず困っています。

http://www.dmm.com/rental/monthly/
のホームページを開き、ExcelのA列に商品の型番が入っているので、その文字列で検索し、商品のリンクをクリックし、DVDのタイトルをB列に、貸出開始日をC列に、出演者をD列に書き出していきたいのです。

例としては、A1に"r55113r"という文字列があり、この文字列で検索すると、"007/スカイフォール"の商品リンクが出てくるのですが、ブルーレイ版とDVD版があり、 タイトルに"(ブルーレイディスク)"のついていない方のリンクを開き、
B1セルに”007/スカイフォール” '作品タイトル
C1セルに”2013.04.03” '貸出開始日(yyyy.mm.dd形式)
D1セルに”ダニエル・クレイグ レイフ・ファインズ ジュディ・デンチ ナオミ・ハリス ベレニス・マーロウ ベン・ウィショー ハビエル・バルデム” '出演者
を書き出す。
以下A2セル以降同様。という感じです。

おそらくないと思うのですが、ブルーレイ版と通常版以外のものがあった場合は、その作品についてはデータを書き出さなくても大丈夫です。

以下が、途中まで作ったコードです。

Sub ie_test()

Dim objIE As Object
Dim strURL As String

Set objIE = CreateObject("InternetExplorer.application")
strURL = "http://www.dmm.com/rental/monthly/"
With objIE
.Visible = True
.Navigate strURL
waitNavigation objIE
.document.all.searchstr.Value = "r55113r"
.document.Forms(1).submit
End With

MsgBox "done"

End Sub


Sub waitNavigation(objIE As Object)
Do While objIE.Busy Or objIE.ReadyState < 4
DoEvents
Loop
End Sub

これで、検索するところまでは行けたのですが、その後の処理ができなくて困っています。
.document.all.searchstr.Value = "r55113r"
については、コードが完成してから For Next文で回そうと思っていたので、とりあえずベタで入れています。

上記のような処理をしたい場合、どのようなコードが適していますでしょうか。
識者の皆様ご教示のほど、よろしくお願いいたしますm(_ _)m

A 回答 (2件)

リンク先のサイトは質問を読んで初めて使いましたので、完璧に質問者様の望む回答は出来ないと思いますが、参考程度になればと思い回答させて頂きました。



また質問者様のOSはXPとのことですので、IEのバージョンは8かそれ以前かと思われますが、VBAでIE操作の処理をしたい場合はIE9があれば8に比べてだいぶ楽に書けるかと思います。
今回の回答では8でも動作できるように、のつもりで書きましたが、あくまで動作確認は9で行っているため、もし動かなかったらごめんなさいm(_ _)m

まず、検索結果から通常版へのリンクのクリックですが、検索結果の通常版へのリンクのURLは

http://www.dmm.com/rental/-/detail/=/cid=n_612mgb★★★★/
※★★★★の部分は検索の文字列(型番?)
のような感じになっているようです。(n_612mgbの部分も恐らく可変かと思われます)
サイトのアンカー内にはclassしか設定されていないようですので(IE9であればclassから直接拾うことが可能なのですが・・・)、ページ内の全てのアンカーを拾い、固有の部分と型番が一致したリンクが見つかったらクリックしループを抜けるようにしてあります。
(その前に、objという変数をObjectで宣言しておいてください)

For Each obj In objIE.document.getElementsByTagName("a")
If obj.href Like "*★★★★*" And obj.href Like "http://www.dmm.com/rental/-/detail/*" Then
obj.Click
Exit For
End If
Next

その下に画面遷移待ちの処理(質問文内のwaitNavigation)を再度入れます。

次にページ内の情報取得ですが、

作品タイトルは<h1>タグで囲まれており、ページ内に他の同一タグは存在しません。
その為、
Range("B1") = objIE.document.getElementsByTagName("h1")(0).innertext
で出力できます。

貸出開始日、出演者は<td>タグで囲まれています。
tdタグで囲まれている項目は他にも多数あるようですので、試しにMsgboxでページ内からtdタグの項目順番に表示させてみると
「2013/4/3」は5番目
「ダニエル・クレイグ レイフ・ファインズ ジュディ・デンチ ナオミ・ハリス ベレニス・マーロウ ベン・ウィショー ハビエル・バルデム」は13番目に出てきました。

なので以下の様な感じで出力できるかと思います。
Range("C1") = Format(objIE.document.getElementsByTagName("td")(4).innertext, "yyyy.mm.dd")
Range("D1") = objIE.document.getElementsByTagName("td")(12).innertext
※配列で出力されるため、0が1番目になります

もしかしたら検索方法や内容によってページのソースも変わってくるかもしれませんが、そのあたりは質問者様で上手くアレンジして下さい。
後はサイト自体の仕様が変わってしまうと勿論ですが上手く出力できなくなります。

またページ内から情報を取得したい場合、通常の画面遷移待ちの処理では確実に判断されず、実行時エラー91などが出てしまう場合がありますので、もし頻繁に出てしまうようならSleep関数などで数秒ブレークさせる処理を入れると良いかもしれません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
お陰様で希望のものが出来ました。
やはり思ったとおりにはいかなくてエラーが出るケースがあるので、それらを少しずつ解決していきたいと思います。
sleep関数も役立ちました。

やはりというかなんというか、webページを取得したりするのはhtmlの知識が必要なんですね。タグについて少しだけ理解することが出来ました。
ありがとうございました。

お礼日時:2013/11/12 08:50

度々すみません。

。。

If obj.href Like "*★★★★*" And obj.href Like "http://www.dmm.com/rental/-/detail/*" Then の部分は

If obj.href Like "*★★★★*" And obj.href Like "*/rental/-/detail/*" Then

にしてください。
(ソース内では相対パスで記述されているので、フルパスで検索すると引っかからないようです。。)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!