• ベストアンサー

VBでIEよる新ページ表示後にエラーになる

VBでIEを操作していますが、ページ表示直後にそのページのソースを処理するステートメントでエラーとなります。デバッグモードのステップインで実行するとエラーにはなりません。尤もページ表示後は、下記処理で表示完了を待つようにしています。 While objIE.ReadyState <> 4 While objIE.Busy = True DoEvents Wend Wend 現在、暫定的に表示完了を待つ処理の後に数秒のインターバルを置くようにしています。何か良い方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

DocumentCompleteイベントを用いた場合でも、サイトの構成によっては DocumentCompleteイベントが複数回発生する場合があります。 その場合は、 DocumentCompleteイベントの発生毎にソースコードを解析し、 必要ソースの存在をチェックしなければ、ダメだと思います。 また、上記現象から、処理完了後にもDocumentCompleteイベントが 発生する可能性もあることから、その時に同じ処理をさせないような 仕組みをflag等で設定します。 ま、DocumentCompleteイベントが1回だけなら、 この意見は取り越し苦労です・・

isunsun
質問者

お礼

色々ご指摘、ご教示頂き大変助かっています。 ソース読込みの完了は、ご指摘のようにDocumentCompleteのイベントを使用するようにします。 更に、ご指示頂いた種々注意点をコーディングに反映し、完成度の高いプログラムに繋げたいと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

DocumentComplete イベントで表示完了を待つようにしてその中で処理するようにして下さい。

isunsun
質問者

お礼

度々ありがとうございます。 試さして頂きます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAによるIE操作について

    VBAによるIE操作について WEBブラウザの表示が完了しているかを確認する方法で以下を利用しています。 While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Wend Set objDoc = objIE.Document Do Until objDoc.ReadyState = "complete": DoEvents: Loop これで完了するまで処理を待つのですが、たまにブラウザが読み込み状態で固まってしまうことがあります。 F5で更新すると再度読み込みを行い、処理が正常に戻るのですが、固まってしまった場合のプログラムでの対処法はないでしょうか? 10秒間ループし続けたらsendkeysでF5を押下するなど色々考えたんですが、うまく表現できません>< どなたか分かる方ご教授お願いします!

  • オブジェクト変数または With ブロック変数が設定されていません。

    下記の様に組みましたが、下記の★印の所で止まる様な事があります。 毎回止まるわけではないのですが、止まる時に「オブジェクト変数または With ブロック変数が設定されていません。」と表示されますが、 原因は何か?どの様にすればいいのか?など詳しく教えてください。 よろしくお願いします。 Sub test() Dim objIE As Object Dim strCOMMENT As String Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://" While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop 'データをセットする 'htmlドキュメント フォーム(0番目) アイテムに転記(代入)する objIE.Document.forms(0).Item("username").Value = "11111" objIE.Document.forms(0).Item("password").Value = "11111" While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Document.all.subm.Click While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop For Each link In objIE.Document.Links If link.href = "http://" Then link.Click End If Next While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop 'タイトル・コメントの読み込み strtitle = Sheets("sheet1").Range("k7") strCOMMENT = Sheets("sheet1").Range("k9") Application.WindowState = xlMinimized While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Document.forms(0).Item("title").Value = strtitle objIE.Document.forms(0).Item("comment").Value = strCOMMENT While objIE.readystate <> 4 While objIE.busy = True DoEvents ' Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Document.all.submit.Click While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop 'フォーム(0番目)を .Submit(確認) する objIE.Document.forms(0).getElementsByTagName("input")(11).Click '←★この部分で止まる時があります。 While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 6, Now()) Do While Now() < Wait_Time DoEvents Loop For Each link In objIE.Document.Links If link.href = "http://" Then link.Click End If Next While objIE.readystate <> 4 While objIE.busy = True DoEvents Wend Wend Wait_Time = DateAdd("s", 7, Now()) Do While Now() < Wait_Time DoEvents Loop objIE.Quit '.Quitで閉じる End Sub

  • Or  And  確実に表示させるにはどちらを?

    http://okwave.jp/qa/q5586837.html を見て思ったのですが、 ブラウザを表示させるまで待つ場合、 Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop と Do While objIE.Busy = True And objIE.readyState <> 4 DoEvents Loop ではどちらを使ったほうがいいのでしょうか? どちらもサイトを表示できてますが、確実に表示されるのはどちらなのか教えてください。

  • DocumentCompleteイベントプロシジャに制御が渡らない

    VB6(VBA)でIEを操作し、表示ページのソースの読込みの確認にDocumentCompleteイベントを使用することを考えています。それで下記のテストプログラムを作成しますたが、DocumentCompleteイベントプロシジャに制御が渡りません。 その原因をご教示して頂きたくお願いします。 Dim WithEvents objIE As InternetExplorer --------------------------------------------------------------- Private Sub CommandButton1_Click() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" While objIE.readyState <> 4 While objIE.Busy = True DoEvents Wend Wend objIE.Navigate "http://www.goo.ne.jp/" While objIE.readyState <> 4 While objIE.Busy = True DoEvents Wend Wend End Sub ------------------------------------------------------------- Private Sub objIE_DocumentComplete(ByVal pDisp As Object, URL As Variant) MsgBox "ソースの読込み完了" End Sub

  • VBでのIE操作

    VBでのIE操作をしようとして色々調べています。 色んなサイトを見ながら途中までは何とかできましたが、どうしてもリンク先を表示できません。 お分かりになる方いましたら、お力添えいただければ幸いです。 状況: Excel2007使用  IE7  VB初心者です。 やりたい内容: VBでIEを立ち上げる ↓ ページからリンクをクリックする (ページ上に画像が貼り付けてあって、そこにURLくっついててハイパーリンクになっている。) (セキュリティの関係でハイパーリンク先を初期で表示することはできない。) ↓ 表示されたページに検索したい項目を入力 ↓ 結果をエクセルに反映する。 以上の作業をVBで組もうと思ってます。 よろしくお願いします。 Option Explicit Sub IE_Test() 'IEの起動 Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True '処理したいページを表示します。 objIE.Navigate "(表示したいページ)" 'ページの表示待ち   While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Wend '開かれたIEを探す。 Dim objSHELL As Object Dim objWINDOW As Object Dim newIE As InternetExplorer '調べる項目に対して、、、 For yCNT = 3 To 102 ' If Trim(Cells(yCNT, 1)) = "" Then Exit For 'A列が空白になったらループを抜ける ここがわからない。。。 (画像になっているハイパーリンクをクリックしたい、、、) 'シェルのオブジェクトを作成する Set objSHELL = CreateObject("Shell.Application") Set newIE = objSHELL.Windows(objSHELL.Windows.Count - 1) Set objSHELL = Nothing '念のため、新しいウインドウの表示を待つ While newIE.readyState <> READYSTATE_COMPLETE Or newIE.Busy = True DoEvents Wend 'ページが表示されたので、表示された文章に対して、処理を行います。 newIE.document.all("phone_no").Value = Cells(yCNT, 1) 'A列の文字を参照する newIE.document.all("exec").Click '表示されたウインドウ(newIE)からデータをセットする Cells(yCNT, 2) = newIE.document.body.innerText '検索の結果をエクセルに反映 '新しいIE(子IE)を閉じる newIE.Quit Set newIE = Nothing '前のIE(親IE)を閉じる   objIE.Quit set objIE = Nothing Next yCNT End Sub 上記が現在までのできているコードです。 ここにも色々間違いがある可能性もあります。 ご指摘頂けましたら幸いです。 よろしくお願いします。

  • 「ページが表示されました」まで取得したい

    IEを立ち上げてステータスバーのテキストを取得して、 「ページが表示されました」を取得出来たら、次のコードへ進みたいのですが、 下のコードでStatusTexttを書き出しても「ページが表示されました」まで取得できません。 Sub test() Dim objIE As InternetExplorer Dim i As Long Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.goo.ne.jp/" objIE.Visible = True Workbooks.Add Cells(1, 1) = objIE.StatusText i = 2 Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Cells(i, 1) = objIE.StatusText i = i + 1 Loop Cells(i, 1) = objIE.StatusText Set objIE = Nothing End Sub Do While objIE.Busy = True Or objIE.ReadyState <> 4 ここら辺のコードを弄ればいいような気がしますが、うまくいきません。 ご回答よろしくお願いします。

  • 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 IE操作

    VBAです。 とあるサイトで Sub IE_wait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.readyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub が無限ループに陥ります。 中断して Exit Sub を入れてみましたが、抜けれません。 ページは既に表示済みです。 なぜ無限ループが抜けられないのか、 なぜページが表示されているのにこのコードが繰り返されるのか 何かわかる方よろしくお願いします。

  • あるHPにエクセルのVBAから入力したいのですが

    はじめまして。VBAの初心者です。 現在、エクセルVBAを用いてIEにログインするコードを作っています。 で、他のページはうまくいったのですが、 https://www.wnp.waseda.jp/portal/portal.php このホームページだけは他のページと同じやり方でやっても、フォームに文字を入力することができません。 ちなみに以下のコードを記述しましたがうまくいきませんでした。 'IEの起動 Dim objIE As Object '変数を定義します。 Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。 objIE.Visible = True '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "https://www.wnp.waseda.jp/portal/portal.php" 'ページの表示完了を待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。 DoEvents Wend objIE.Document.Form1("loginid").Value ="私のID" '←ここでエラーがでます。 (1)なぜ他のHPと同じようにはいかないかという点と、できれば、(2)うまくいくコード、を教えていただければ嬉しいです。 よろしくお願いします。

  • 表示されるまで待たせたい

    vbaでieの操作をしているのですが Sub マクロ1() Do While ObjIE.Busy = True DoEvents Loop End Sub でも Sub マクロ2() Const READYSTATE_COMPLETE As Long = 4 Do Until ObjIE.ReadyState = READYSTATE_COMPLETE Loop End Sub でも、 表示される前に次のコードへ進んでしまって エラーになってしまいます。 表示されるまで待たせるには Application.Wait (Now + TimeValue("00:00:03")) を付け足すしかないのでしょうか? (できればこれは使いたくないです) ご教授よろしくお願い致します。