• 締切済み

無限ループ objIE.Navigate

win8.1でvbaでブラウザを操作しています。 XPからWIN7までは、 Sub Sample() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" Do While objIE.Busy = True DoEvents Loop objIE.Navigate "http://shopping.yahoo.co.jp/" ・・・ このように、 objIE.Navigate に、URLを入れ替えても、問題なく表示できたのですが win8からは objIE.Navigateで、1つ目のURLを表示させ、2つ目のURLを表示させると、 見た目は、 二つ目の"http://shopping.yahoo.co.jp/"が表示されるのですが、 objIEの中身は、1つ目の "http://www.yahoo.co.jp/"のままです。 なので、 objIE.Navigate "http://shopping.yahoo.co.jp/" のあとに、 Do While objIE.Busy = True DoEvents Loop をしても、 objIEに格納されている値は、 "http://www.yahoo.co.jp/"だから 無限ループしてしまいます。 この現象を回避するにはどうすればいいでしょうか? エクセル2010です。 よろしくお願いします。

みんなの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

散漫に不正確なこと書いちゃったせいで、余計に煩わせてしまい すみません。 修正ありがとうございました。   cj 拝

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.4

>Win8でしか発生しないのですね。 いや、違います。Win8にIE11はリリースされていませんので再現しません。 Win7ですと、IE11環境でも再現する/しないがあって、Win8.1だと確実に再現します。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

#1、cjです。#1お礼欄拝見しました。 また、#2さんのご回答も拝見しました。 どうやら、Win8 x64 / IE11 環境でしか再現できないトラブルのようですから、 こちらの環境では再現できない事象のようです。 私の#1での回答は、問題の解決に直結することはないみたいです。 #2の回答者さんは、私も大きく信頼を寄せる方です。 #2リンク先の一番最後の方に、具体的な対策として有効と 思われる(←私には確認しようがないという意味ですが、確度の高い話と思います) 記述がありますね。確認してみてくださいませ。 テスト環境があれば、自分で試してみたいこと、つまり勘や想像ですが、 .Navigate を .Navigate2 に代え、第2引数を色々変えてみるとどうなるか、 自分なら一度は試してみたいですね。 この回答の主旨としては、#2さんの回答で解決できそうに思います、です。 以上です。

fkamkwgkv
質問者

お礼

Win8でしか発生しないのですね。 申し訳ございませんでした。 ご協力いただき、ありがとうございました。

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.2

Navigateメソッドの前後にVisibleプロパティを挟むといいそうです。

参考URL:
http://www.moug.net/faq/viewtopic.php?t=70210
fkamkwgkv
質問者

お礼

objIE.Visible = False objIE.Navigate "http://shopping.yahoo.co.jp/" objIE.Visible = True にしたら、うまく動きました!ありがとうございました。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 #最後の方に、サンプル4種挙げておきます。 ご相談の問題点はここ↓ > Do While objIE.Busy = True > DoEvents > Loop XPでもWin7でも、この記述で同期が取れることは少ないです。(サンプル◆0◆) (実際Win7/IE11でテストしました) OSの問題というより、今日的なページソースの在り方や、それに合わせたIEの仕様の変化、 ということはあるのかも知れませんし、昔なら特定のページでうまく同期取れたのかも知れませんが。 待機の記述を書くのが面倒臭い、とかいう相談なのでしょうかね? 省略したいのなら、BusyよりはまだしもReadyStateだけで書いてみては?(サンプル◆1◆) (最近のネット環境でBusyが問題になること少ないですね。でも偶にある) 標準的というか教科書的というか、私が最初に覚えたのはサンプル◆2◆のような記述です。 (実際はDoEventsよりもSleepを私は重用してますが) > objIEに格納されている値は、 "http://www.yahoo.co.jp/"だから > 無限ループしてしまいます。 ご提示の記述には、無限ループとなる部分はパッと見には無いです。 (有るとすれば、実行中に偶然インターネットアクセスが切断されるとか、、、。) まず、IE側で、ページの表示がコンプリートした、ことを確認してから、 次の処理に進む、というのが、基本です。 "無限ループ"というのはむしろ、 (ここに書かれていない)その後の処理の問題なのでは? IEがコンプリートしてないのに、objIE.Document(当然これも"complete"してない) にアクセスしようとして、フリーズする、とか。 ともあれ、ひとまずは、 > objIEに格納されている値は、 "http://www.yahoo.co.jp/"だから という問題点を解決してみてください。 ' ' ---------------- Option Explicit #If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #End If ' ' ◆0◆ご提示の記述 Sub Re8754535q() Dim objIE As InternetExplorer   Set objIE = CreateObject("InternetExplorer.Application")   objIE.Visible = True   objIE.Navigate "http://www.yahoo.co.jp/"   Do While objIE.Busy = True     DoEvents   Loop   Debug.Print 1, objIE.LocationURL   objIE.Navigate "http://shopping.yahoo.co.jp/"   Debug.Print 2, objIE.LocationURL 'イミディエイトウィンドウに表示される結果 ' 1        ← NG ' 2        ← NG 'または ' 1        ← NG ' 2      http://www.yahoo.co.jp/  ← NG 'または ' 1      http://www.yahoo.co.jp/ ' 2      http://www.yahoo.co.jp/  ← NG ' うまくいくことはない '  Stop   objIE.Quit End Sub ' ' ◆1◆同期を取るWaitの記述を手抜きする版 Sub Re8754535a() Dim objIE As InternetExplorer   Set objIE = CreateObject("InternetExplorer.Application")   objIE.Visible = True   objIE.Navigate "http://www.yahoo.co.jp/"   Do While objIE.ReadyState < READYSTATE_COMPLETE     DoEvents   Loop   Debug.Print 1, objIE.LocationURL   objIE.Navigate "http://shopping.yahoo.co.jp/"   Do While objIE.ReadyState < READYSTATE_COMPLETE     DoEvents   Loop   Debug.Print 2, objIE.LocationURL 'イミディエイトウィンドウに表示される結果 ' 1      http://www.yahoo.co.jp/ ' 2      http://shopping.yahoo.co.jp/ '  Stop   objIE.Quit End Sub ' ' ◆2◆オースドックスな記述版 Sub Re8754535c() Dim objIE As InternetExplorer   Set objIE = CreateObject("InternetExplorer.Application")   objIE.Visible = True   objIE.Navigate "http://www.yahoo.co.jp/"   Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE     DoEvents   Loop   Debug.Print 1, objIE.LocationURL   objIE.Navigate "http://shopping.yahoo.co.jp/"   Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE     DoEvents   Loop   Debug.Print 2, objIE.LocationURL 'イミディエイトウィンドウに表示される結果 ' 1      http://www.yahoo.co.jp/ ' 2      http://shopping.yahoo.co.jp/ '  Stop   objIE.Quit End Sub ' ' ◆3◆オースドックスな記述にタイムアウト(簡易版)を設定する版 ' ' もしもずーーーとページ表示が終らなければ、無限ループになるけれど、 ' ' Excel をアクティブにすれば Escキー 押下げでも 抜けられる Sub Re8754535cc() Dim objIE As InternetExplorer Dim timeOut As Date   Set objIE = CreateObject("InternetExplorer.Application")   objIE.Visible = True   objIE.Navigate2 "http://www.yahoo.co.jp/"   timeOut = DateAdd("s", 5, Now)   Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE     DoEvents     Sleep (100)     If Now > timeOut Then       objIE.Refresh       timeOut = DateAdd("s", 5, Now)     End If   Loop   Debug.Print 1, objIE.LocationURL   objIE.Navigate2 "http://shopping.yahoo.co.jp/"   timeOut = DateAdd("s", 5, Now)   Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE     DoEvents     Sleep (100)     If Now > timeOut Then       objIE.Refresh       timeOut = DateAdd("s", 5, Now)     End If   Loop   Debug.Print 2, objIE.LocationURL 'イミディエイトウィンドウに表示される結果 ' 1      http://www.yahoo.co.jp/ ' 2      http://shopping.yahoo.co.jp/ '  Stop   objIE.Quit End Sub

fkamkwgkv
質問者

お礼

早速のご回答、ありがとうございます。 表示されるまで待つ表記に問題があるのですね。 たくさんのサンプルを作っていただいたうちの、 ◆2◆オースドックスな記述版 の方法で行きたいのですが、 ------------------------------------------------ objIE.Navigate "http://shopping.yahoo.co.jp/" の次の   Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE     DoEvents   Loop ------------------------------------------------ から先へ進めません。 ブレークポイントを設置して、Re8754535cを実行すれば、無事に、objIE.Quitまで行くのですが、 一気にF5で実行すると、ループしてしまってます。 なぜか、 ------------------------------------------------ objIE.Navigate "http://www.yahoo.co.jp/" Do While objIE.Busy = True Or objIE.READYSTATE < READYSTATE_COMPLETE DoEvents Loop Debug.Print 1, objIE.LocationURL objIE.Navigate "http://www.yahoo.co.jp/" Do While objIE.Busy = True Or objIE.READYSTATE < READYSTATE_COMPLETE DoEvents Loop Debug.Print 2, objIE.LocationURL ------------------------------------------------ にすると、無事最後までコードが実行されます。 (どちらも"http://www.yahoo.co.jp/") なぜ2回目のNavigateでページが変わると、コードが最後まで実行されないのか 理由がわからないのですが、 再度教えていただけますか? よろしくお願いします。

関連するQ&A

  • DoEvents

    VBSでDoEventsは使えないのでしょうか? *************************** Dim ObjIE dim i Set ObjIE = CreateObject("InternetExplorer.Application") ObjIE.Navigate "http://oshiete.goo.ne.jp/" ObjIE.Visible = True Do While ObjIE.Busy = True DoEvents Loop Do While ObjIE.Document.ReadyState <> "complete" DoEvents Loop Set ObjIE = Nothing *************************** だと、エラーになりました。 Wscript.sleep 3000 ならエラーにならずにコードは動きました。 VBAならDoEventsは使えるのに VBSで使えない理由を教えてください。

  • ie操作 ローカルパスだとエラーになる

    ヤフーなら問題なくコードが動くのに、URLがローカルのパスだと、エラーになってしまいます。 具体的には、 *********************************************************** Sub Sample1() Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.yahoo.co.jp/" objIE.Visible = True Do Until objIE.ReadyState = 4 Loop Do While objIE.Busy = True DoEvents Loop End Sub *********************************************************** だと、問題なく実行されるのに、 *********************************************************** Sub Sample2() strFName = MyDesktop & "\index.html" Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate strFName objIE.Visible = True Do Until objIE.ReadyState = 4 Loop Do While objIE.Busy = True DoEvents Loop End Sub ------------------------- Function MyDesktop() Dim WSH As Variant Set WSH = CreateObject("Wscript.Shell") MyDesktop = WSH.SpecialFolders("Desktop") Set WSH = Nothing End Function *********************************************************** だと、 Do Until objIE.ReadyState = 4 で オートメーションエラー 起動されたオブジェクトはクライアントから切断されました。 となります。 なぜローカルだと、エラーになるのでしょうか? 何が違うのでしょうか?

  • vbaでyahooメールの受信メールの一覧を読み取

    vbaでyahooメールの受信メールの一覧を読み取る方法はありますか? Sub test() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://login.yahoo.co.jp/config/login?logout=1" 'ログアウトする Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Navigate "https://login.yahoo.co.jp/config/login?.src=&.pd=&.done=http%3A//www.yahoo.co.jp/" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Document.all.UserName.Value = "" objIE.Document.all.passwd.Value = "" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Document.Forms(0).submit Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Navigate "http://jp.mc1003.mail.yahoo.co.jp/mc/welcome?.rand=6i0loli2li7s6&noFlush&YY=940152127#_pg=showFolder&fid=Inbox&order=down&tt=84&pSize=25&.jsrand=6381767" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop Debug.Print objIE.Document.Body.innerHTML Set objIE = Nothing End Sub これでログインまではできるのですが、その後のソースを読み取っても受信メールの一覧は読み取れません。 ログイン後に、vbaではなく手動でWEBクエリをやってソースに書き出してみましたがやはり受信メールだけは読み取れません。 WEBクエリならフォルダの一覧は読み取れました。 VBAで読み取るのは不可能なのでしょうか?

  • 実行時エラー 2147023179

    win7、エクセル2010でIE操作をしてるのですが どうやらローカルのページ (objIE.Navigate "C:\Users\B\Desktop\a.html") を表示すると、 Do While objIE.Busy = True の部分で、 実行時エラー 2147023179 オートメーションエラーです。 そのインターフェイスは認識されません。 となります。 しかし、 Sub Sample() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://login.yahoo.co.jp/config/login?logout=1" 'ログアウトする Do While objIE.Busy = True DoEvents Loop Set objIE = Nothing End Sub このようにネット上のページを表示すると問題なく動きます。 ローカルのページではダメなのでしょうか?

  • DoEventsは意味ない?

    Sub test() Dim ObjIE As InternetExplorer Set ObjIE = CreateObject("InternetExplorer.Application") ObjIE.Navigate "http://www.yahoo.co.jp/" ObjIE.Visible = True Do While ObjIE.Busy = True DoEvents Loop Debug.Print ObjIE.LocationName Set ObjIE = Nothing End Sub ------------------------------------- を実行した所、イミディエイトウインドウに何も表示されないので ObjIE.LocationNameを ObjIE.Refreshに変えてみたところ、 ------------ 実行時エラー ‘-2147467259 オートメーションエラーです。エラーを特定できません。 ------------ となりました。 ステップインでゆっくり実行するとできたことから、 ObjIE.Refresh にたどり着くまでに、IEにサイトが表示されてないのが原因のようです。 と言いう事は、 ------------ Do While ObjIE.Busy = True DoEvents Loop ------------ のコードは全く持って無意味なのでしょうか? 「表示するまで待つ」と言う意味だと思っていたのですが 表示し終わる前に次のコードに進んでしまっているようです。

  • vbaでIEを閉じるだけの処理

    オフィス2003を使用しています。 「IEを開いて閉じる」は Sub TEST() Set ObjIE = CreateObject("InternetExplorer.application") ObjIE.Visible = True '見えるようにする '文字列で指定したURLに飛ぶ ObjIE.navigate "http://www.yahoo.co.jp/index.html" '表示終了まで待つ Do While ObjIE.Busy = True DoEvents Loop ObjIE.Quit End Sub と言うことがわかったのですが 開くのは他の作業をしたときに行うので 「閉じる」だけをvbaで行いたいのですがどうすればいいのかわかりません。 Sub TEST2() Set ObjIE = CreateObject("InternetExplorer.application") ObjIE.Visible = True '見えるようにする ObjIE.Quit End Sub だと また新たなIEが起動してしまい「現在起動しているIEを閉じる」と言うことができません。 アドバイスをお願い致します。

  • 「地図」で検索するにはどういう操作をすればいいので

    ヤフーのトップページから 値を入れて検索を押すまではできるのですが 「ウェブ」ではなく「地図」で検索するにはどういう操作をすればいいのでしょうか? Sub yahoo() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" Do While objIE.Busy = True DoEvents Loop Do While objIE.Document.ReadyState <> "complete" DoEvents Loop objIE.Document.forms(0).elements("p").Value = "東京" '‘「地図」をクリックする操作をしたい objIE.Document.forms(0).submit Set objIE = Nothing End Sub 宜しくお願いいたします。

  • 現在表示されているURLを取得したいのですが

    Sub test1() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.goo.ne.jp/" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop Debug.Print objIE.Navigate Set objIE = Nothing End Sub //////////////////////////////////////////////// をやろうとすると、 Debug.Print objIE.Navigate の部分で、「引数は省略できません。」とエラーになります。 どう修正すればいいか教えてください。 ("http://www.goo.ne.jp/"はダミーです)

  • vbaでIEの操作

    こんばんは。やりたいことができないので教えてください。 vbaで指定のurlを開きたいです。 エクセル2003とIE8です。 Sub test001() Dim ObjIE As Object Set ObjIE = CreateObject("InternetExplorer.application") ObjIE.Visible = True ObjIE.navigate "http://jp.msn.com/" Do While ObjIE.Busy = True '表示させるまで待つ DoEvents Loop End Sub これでIEを立ち上げてURLを開けるのですが これでは新しいウインドウで開いてしまいます。 現在IEを立ち上げていて、上記のコードを実行すると 新たなタブで開きたいですが解決策はありますか? ObjIE.Visible = True が原因かと思い、これを抜かしてみましたが そうすると何も起こりません。 VBAで既に開いているIEの新しいタブでURLを開く方法をご教授ください!よろしくお願いします。

  • NavigateとNavigate2の違いは?

    Sub Sample_Navigate() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" Set objIE = Nothing End Sub Sub Sample_Navigate2() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate2 "http://www.yahoo.co.jp/" Set objIE = Nothing End Sub 上記二つのサンプルをテストしてみましたが違いが判りません。 Navigate2のヘルプを見ようとしても キーワードが見つかりません。が見つかりませんになってしまいます。 この二つのメソッドの違いを教えていただけますか? オブジェクトブラウザの情報だと Navigateは Sub Navigate(URL As String, [Flags], [TargetFrameName], [PostData], [Headers]) SHDocVw.InternetExplorer のメンバー Navigates to a URL or file. Navigate2は Sub Navigate2(URL, [Flags], [TargetFrameName], [PostData], [Headers]) SHDocVw.InternetExplorer のメンバー Navigates to a URL or file or pidl. と書いてありました。 引数の数は一緒でした。

専門家に質問してみよう