電子書籍の厳選無料作品が豊富!

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
------------
のコードは全く持って無意味なのでしょうか?

「表示するまで待つ」と言う意味だと思っていたのですが
表示し終わる前に次のコードに進んでしまっているようです。

A 回答 (2件)

こんにちは。

#1、cjです。
遅くなりましたが#1お礼欄へのレスです。

> 組み合わせたものなのでしょうか?

はい、その通りです。
最近は、順番に分けて書く人の方が少ないようですし、
組み合わせて書いた方がエラーが出る可能性が低いということもあるようで
ひとまとめにして書いた方がいいですね。デメリットはないですから。
説明が不親切でした。言葉足らずですみません。

一応、エラーに備える意味では
  On Error Resume Next
  Do While ObjIE.Busy = True Or ObjIE.ReadyState <> 4
    DoEvents
  Loop
  On Error GoTo 0
こう↑書く方がベターかも知れません。

それから、
.Busy がTrueでなくなるまで、.ReadyState が"complete"するまで
DoEvents しながら待つ、という意味ですから、
DoEvents が、直接IEに何かしら働きかけている訳ではありませんから、
> やはりDoEventsだけでは不十分のようですね。

Do While ObjIE.Busy = True だけでは不十分です。
ですね。
    • good
    • 0
この回答へのお礼

再度ご回答ありがとうございました。
とてもわかりやすかったです!これでエラーにならずに済みます!大変助かりました。
また機会があったらよろしくお願いします。

お礼日時:2012/10/20 19:14

こんにちは。



  Do While ObjIE.Busy = True
    DoEvents
  Loop
だけではなくて、
  Do Until ObjIE.ReadyState = 4
    DoEvents
  Loop
も加えてみましょう。
大抵は、このふたつセットで使います。
なので、答えとしては、
「...だけでは十分ではない」です。
無意味ってことはないですね。
DoEvents は、この場合3通りの意味を持ちます。
・制御を渡す・タイムラグを作る・コードの実行を一時停止させる場合のきっかけ

それと、事前バインディング(参照設定)してあるなら
CreateObjaectを使うのは勿体ないというか
参照設定が無駄になっています。
一応、以下のようにして試してみては如何でしょう。

Sub Re7751771a()
' ' 参照設定
' ' Microsoft HTML Object Library
' ' Microsoft Internet Controls
  Dim ObjIE As InternetExplorer
  Set ObjIE = New InternetExplorer
  
  ObjIE.Navigate "http://www.yahoo.co.jp/"
  ObjIE.Visible = True
  
  Do While ObjIE.Busy = True Or ObjIE.ReadyState <> 4
    DoEvents
  Loop

  Debug.Print ObjIE.LocationName
  
  Set ObjIE = Nothing
End Sub
    • good
    • 0
この回答へのお礼

やはりDoEventsだけでは不十分のようですね。

  Do Until ObjIE.ReadyState = 4
    DoEvents
  Loop
とセットと覚えます。

DoEventsは
・制御を渡す
・タイムラグを作る
・コードの実行を一時停止させる場合のきっかけ
と言う意味があるのですか。

提示して頂いたサンプルコードの、

  Do While ObjIE.Busy = True Or ObjIE.ReadyState <> 4
    DoEvents
  Loop

は、

  Do While ObjIE.Busy = True
    DoEvents
  Loop

  Do Until ObjIE.ReadyState = 4
    DoEvents
  Loop
を組み合わせたものなのでしょうか?

お礼日時:2012/10/17 19:55

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