こんばんは
先ほどと同様な質問かもしれませんが、
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
No.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAで NHK NEWSの NEWSデータ内容取得が できない 1 2023/04/09 12:26
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
多人数のじゃんけんプログラム
-
C#でフォームのオブジェクト名...
-
Excelで =EMBED("Acrobat Docu...
-
COMコンポーネントって何?
-
Vbで通常使用するプリンターを...
-
bmp画像をjpegやpng画像に圧縮...
-
文字列でクラス型名を取得したい
-
Accessの連結・非連結オブジェ...
-
VBAのWindowオブジェクトとWork...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ArrayLsitのデータ取得
-
Listに格納されているオブジェ...
-
Listに格納されたオブジェクト...
-
JAVAからHTMLへ値を返す方法
-
Visual Studioでのbmpファイル...
-
.getElementById()のエラーにつ...
-
javaでは基本型の参照渡しは無...
-
LISTBOXの内容が更新されま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報