プロが教えるわが家の防犯対策術!

こんばんは

先ほどと同様な質問かもしれませんが、

yahooからオークションサイトをクリックするというものですが
そのなかの処理でオークションリンククリック後 While doc.getelementsbytagname("body").Length <= 0でBODYのレングスが1になるまでループさせるというものですが、
ウオッチウインドウには変数なしでendsub 終了しました。

ただし、①の場所に(wait) 
Application.Wait [Now() + "0:00:01.9"]をつけ再度実行すると
正しく処理されるようになりました。(変数なし→値が入っている)

これは、doc.Links(i).Click後処理が早くてdocumnetオブジェクトが作られていないから
なのでしょうか?


Sub ie_test()

Dim objIE As Object 'IEオブジェクト参照用
'
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

While objIE.document.ReadyState <> "complete"

Debug.Print objIE.document.ReadyState&; "naka1"

DoEvents

Wend

Dim doc As Object
Set doc = objIE.document

For i = 0 To doc.Links.Length - 1
If doc.Links(i).innertext = "ヤフオク!" Then

doc.Links(i).Click
'Application.Wait [Now() + "0:00:01.9"] '①これをいれるとうまくいく
While doc.getelementsbytagname("body").Length <= 0
Debug.Print objIE.busy
Wend
Exit For
End If
Next

End Sub

A 回答 (1件)

こんばんは。


>これは、doc.Links(i).Click後処理が早くてdocumnetオブジェクトが作られていないからなのでしょうか?

あまり関係ないようです。Clickしたらおそらくステージが変わるのです。
裏技というか、IEイベントにして、変化する場所を監視して、変化した瞬間に次の動作に移る方法もあるのですが、おなじみの
 Do While objIE.Busy Or objIE.ReadyState <> 4: DoEvents: Loop
を一つ入れるだけで劇的に変わるはずです。

具体的には、こんな感じです。実際に動かしていませんから、正確にできるかはこの場では確かめられません。

Dim doc As Object
Set doc = objIE.Document

For i = 0 To doc.Links.Length - 1
 If doc.Links(i).innerText = "ヤフオク!" Then
  doc.Links(i).Click ←リンク先だったら、URLを取って、.Navigate2 URLでもよい

  Do While objIE.Busy Or objIE.ReadyState <> 4: DoEvents: Loop
  '(このように1行にまとめたほうが見やすいです。)
'画面の切り替わりを待ちます。
  'そして、必要に応じて、
  Set doc =objIE.Document を改めて取得しなおします。 <=これを活かすには、ループを抜けるしかありません。
''以下の場合のdoc は、一度しか取っていないので、何回やっても、変わらないです。
'× While doc.getelementsbytagname("body").Length <= 0
  Exit for
  Loop
End If
Next
    • good
    • 0

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