こちらの識者の方々にはいつもお世話になっています。
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
No.1ベストアンサー
- 回答日時:
リンク先のサイトは質問を読んで初めて使いましたので、完璧に質問者様の望む回答は出来ないと思いますが、参考程度になればと思い回答させて頂きました。
また質問者様の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関数などで数秒ブレークさせる処理を入れると良いかもしれません。
ご回答ありがとうございます。
お陰様で希望のものが出来ました。
やはり思ったとおりにはいかなくてエラーが出るケースがあるので、それらを少しずつ解決していきたいと思います。
sleep関数も役立ちました。
やはりというかなんというか、webページを取得したりするのはhtmlの知識が必要なんですね。タグについて少しだけ理解することが出来ました。
ありがとうございました。
No.2
- 回答日時:
度々すみません。
。。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
にしてください。
(ソース内では相対パスで記述されているので、フルパスで検索すると引っかからないようです。。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAで NHK NEWSの NEWSデータ内容取得が できない 1 2023/04/09 12:26
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
VB2005 DataGridView上でクリッ...
-
別フォームから戻ったときのイ...
-
【C#】ラベルのダブルクリック...
-
処理終了後のに砂時計が、クリ...
-
マイページはどこを開くの
-
デジタル時計の時刻合わせの方...
-
デスクトップ画面を4分割するには
-
ウインドウを毎回同じ位置、大...
-
Excelでワードアートや図を常に...
-
エクセルのシート上に別のシー...
-
ポップアップウィンドウがブロ...
-
Javascript_submit()完了後に処...
-
5ちゃんねる
-
エクセルVBAでフォームのListbo...
-
【Android】ユーザー補助機能ボ...
-
リストビューをスクロールさせ...
-
スライドショーを全画面でなく...
-
Excelで一部分だけを常に表示さ...
-
PDFを(htmlのように)無限に縦...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
別フォームから戻ったときのイ...
-
VB2005 DataGridView上でクリッ...
-
エクセル アプリケーションの...
-
処理終了後のに砂時計が、クリ...
-
VBAでIEの「Web ページからのメ...
-
VB6.0のEnabledをfalseにしても...
-
excelのタスクバーアイコンが・...
-
Sleep関数の最大時間について
-
Perlで数値(小数点、負の数、...
-
javascriptの中で、perlのコマ...
-
C# マウスオーバーの記述方法
-
C++での連続した左クリックの禁...
-
Perlの多重起動を禁止したい
-
[CGI]ブラウザを閉じた時の動作
-
VC++2010 エディットボックスに...
-
フォームの値を取得できません...
-
エクセルVBAのMultipageの使...
-
【C#】ラベルのダブルクリック...
-
別ページからのタブ切り替えの...
おすすめ情報