多分最近だと思いますが、いつの間にかVBAでIE操作する時のページ読み込み時のアイドル処理がうまく行われてないことに気が付きました。
そのプログラムはここ2年くらいほぼ毎日動かしており、ずっと正常に動いていたので、プログラムそのものが原因とは考えづらいです。
以下の様に簡素なプログラムにしても、やはり症状は変わらず…。。
Sub ie_test() Dim ie As Object Dim url(4) As String Dim i As Long url(0) = "http://www.yahoo.co.jp" url(1) = "http://www.google.co.jp" url(2) = "http://www.amazon.co.jp" url(3) = "http://www.rakuten.co.jp" url(4) = "http://kakaku.com" Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True For i = 0 To 4 ie.navigate url(i) wait ie Next i ie.Quit Set ie = Nothing End Sub Sub wait(ByVal ie As Object) Do While ie.Busy = True DoEvents Loop Do While ie.document.ReadyState <> "complete" DoEvents Loop End Sub
この場合どうなってしまうのかと言うと、1サイト目のYahoo!は正常に処理が行われます。
きちんとwaitも効いてるのですが、2サイト目からは物凄い速度で5サイト目まで一気にループします。。
そして、何故か最後のQuitが効かずプログラムの処理が完了します。
多分、ie.document.ReadyState <> "complete"がうまく行われてないように思います。
よく分からないのは、ウォッチ式で見てみると、Documentより下が<変数なし>と無いことになってしまっている点です。
そこで、ie.document.ReadyState <> "complete"を使い出した時より前に使ってたie.ReadyState = 4で試してみます。
すると、2サイト目で永久ループになってしまいます。どうやら読み込みが完了してると思われるのに、1(READYSTATE_LOADING)で止まっている模様。
あとよく分からないのは、次のサイトに移ってるはずなのにDocumentに以前のサイトのDOMが入ってたりすることですね。
一旦止めてウォッチ式を見てると、そんなよく分からない状態の時があります。
指定のリンク(URL)が出るまでループ、といった処理があるのですが、プロパティのhrefをDebug Printしてみると、何故か最初のサイトのページのリンクが吐き出されているのでした(笑)
それと上記のサンプルでは発生しないのですが、navigateのところで「Navigate メソッドは失敗しました IWebBrowser2 オブジェクト」が多々発生します。
多分エクセルやOSを再インストールすれば直ったりしそうだけど、それも面倒くさい…。。
追記
原因が分かりました。「Microsoft SkyDrive Pro Browser Helper」というIEのアドオンを無効にしていると当記事の症状が発生するようです。