- ベストアンサー
VBでのIE操作
- VBでIE操作をしようとして色々調べています。色んなサイトを見ながら途中までは何とかできましたが、どうしてもリンク先を表示できません。
- Excel2007使用 IE7 VB初心者です。やりたい内容は、VBでIEを立ち上げて、ページからリンクをクリックして表示されたページに検索したい項目を入力し、結果をエクセルに反映することです。
- VBでIE操作のコードを作成していますが、画像になっているハイパーリンクをクリックする方法がわかりません。現在までのコードにも間違いがある可能性があるため、ご指摘いただけると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>他にも問題が山積みのようでした。 >違う部分で新たに質問を投げているので・・・お力添えお願いします。 この件に関しましては、新しいご質問の方へ、回答を書いておきました。 さて、yamaguchi816 さんがお書きの コード を拝見して、いくつかお節介を焼きたくなりましたので、暇つぶしにご覧ください。 -------------------------------------------------- 【1】[With ステートメント] のすすめ(賛否両論あるかも。。。) objIE や newIE が コード中に何度も出てきて 読みづらいので http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_060.html の「Withステートメントの利用」でもご覧ください。 -------------------------------------------------- 【2】[マルチ ステートメント] のすすめ(賛否両論あるかも。。。) お示しの コード の中で、 'ページの表示待ち While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Wend という フレーズ が出てきますが、IE の操作をするときには、ページ を遷移するたびにこの フレーズ を書かなければならなくなったりして、関数にして利用していらっしゃる方もいらっしゃいますが、私は、[With ステートメント] と併用して、 While .Busy Or .ReadyState <> 4: DoEvents: Wend という フレーズ を単語登録して書いています。 -------------------------------------------------- 【3】「表示待ち」について '表示待ち wait_time = DateAdd("s", 2, Now()) Do While Now() < wait_time DoEvents Loop という フレーズ が何回も出てきますが、これは Application.Wait (Now + TimeValue("0:0:2")) ではいけませんか? 私は、 a)While .Busy Or .ReadyState <> 4: DoEvents: Wend だけでは、ページ が表示し切れないときに、 b)Application.Wait (Now + TimeValue("0:0:2")) も入れてみて(単なる様子見)、コード がちゃんと進行するような秒数を記入したりします。 この件に関しては、とても詳しい方もいらっしゃいますが、私は、取り敢えず、「したい事が出来れば良い」ので、気にせずに、a・bを適当にちりばめて コード を書いています。 -------------------------------------------------- 【4】「Next yCNT」の位置について(実はこれが一番重要) お示しの位置に「Next yCNT」を置くと、既に、 newIE.Quit Set newIE = Nothing してしまっていますので、 For yCNT = 3 To 1002 したときに、newIE が行方不明になってしまいます。 「Next yCNT」は newIE.Quit の前に置きましょう。 -------------------------------------------------- 【5】「前のIEを閉じる」の位置について これは、どちらでも良いのですが、用が済んだらさっさと退席してもらった方が、コード が見やすくなるようですので、「リンクの貼ってある画像をクリック」して、新しい ページ が表示されたら、 objIE.Quit Set objIE = Nothing するようにしてみました。 -------------------------------------------------- 他にも、細々と変えておりますので、次の回答をご覧ください。
その他の回答 (3)
- DOUGLAS_
- ベストアンサー率74% (397/534)
Option Explicit Sub ie_test() '【1】IEを起動し、データの入力画面を開くまでの操作 Dim objIE As Object Dim i As Integer Set objIE = CreateObject("InternetExplorer.Application") With objIE .Visible = True '処理したいページを表示します。 .navigate "処理したいページ" 'ページの表示待ち While .ReadyState <> READYSTATE_COMPLETE Or .Busy: DoEvents: Wend Application.Wait (Now + TimeValue("0:0:2")) 'リンクの貼ってある画像をクリック For i = 0 To .document.images.Length - 1 If InStr(.document.images.Item(i).outerHTML, "image/btn131b1.gif") > 0 Then .document.images.Item(i).Click End If Next '表示待ち Application.Wait (Now + TimeValue("0:0:2")) '前のIEを閉じる objIE.Quit End With Set objIE = Nothing '【2】データを入力する操作 Dim objSHELL As Object Dim newIE As InternetExplorer Dim yCNT As Long '新しいIEをシェルオブジェクトに格納する Set objSHELL = CreateObject("Shell.Application") Set newIE = objSHELL.Windows(objSHELL.Windows.Count - 1) Set objSHELL = Nothing With newIE '新しいウィンドウのログインボタンを押す .document.forms(0).submit While .Busy Or .ReadyState <> 4: DoEvents: Wend '調べる項目 For yCNT = 3 To Cells(Rows.Count, 1).End(xlUp).Row If Trim(Cells(yCNT, 1)) = "" Then Exit For 'A列が空白になったらループを抜ける 'ページが表示されたので処理を行います。 .document.frames(0).document.all("phone_no").Value = Cells(yCNT, 1) 'A列の文字を参照する .document.frames(0).document.all("exec").Click '表示待ち Application.Wait (Now + TimeValue("0:0:2")) '表示されたウインドウからデータをセットする Cells(yCNT, 2) = .document.frames(1).document.body.innerText '検索の結果をエクセルに反映 Next yCNT '新しいIEを閉じる .Quit End With Set newIE = Nothing End Sub
- DOUGLAS_
- ベストアンサー率74% (397/534)
#1 の DOUGLAS_ です。 「Item(i)」の i の初期値は「0」ですから、 For i = 1 To objIE.Document.images.Length ではなくて、 For i = 0 To objIE.Document.images.Length - 1 でしたね。 失礼いたしました。 <(_ _)>
お礼
ありがとうございます。 おかげさまで画像のクリックはできましたが、他にも問題が山積みのようでした。 また、今度は違う部分で新たに質問を投げているのでお分かりになるようでしたら、またお力添えお願いします。
- DOUGLAS_
- ベストアンサー率74% (397/534)
ご質問の内容は、サイト の作りによって、操作の方法も変ってくるかと存じます。 ということで、先ずは、 >ここがわからない。。。 >(画像になっているハイパーリンクをクリックしたい、、、) という点についてのみお答えいたします。 >ページ上に画像が貼り付けてあって、 >そこにURLくっついててハイパーリンクになっている ということは、その辺りの html タグ に <a href="~~"><img src="●●.gif"></a> というようなことが書かれているかと存じますので、 For i = 1 To objIE.Document.images.Length If InStr(objIE.Document.images.Item(i).outerHTML, "●●.gif") > 0 Then objIE.Document.images.Item(i).Click End If Next などとして、画像を クリック することができるかと存じます。 #お分かりにならないことがありましたら、ご遠慮なくお尋ねください。
お礼
非常に分かりやすい説明ありがとうございます。 もとよりVBの勉強をしていたわけではなく、仕事を捗らせる為にネットで色々検索してただけだったのですが、ここまで解り易い説明は初めて見ました。 お陰様で、やろうとしていたことが完璧にできました。 何から何までありがとうございます。 また何かの機会にご質問させていただくことがありましたら、その際はどうぞよろしくお願い申し上げます。