WebBrowserコントロールを使ったIE操作でフリーズする理由と解決方法

このQ&Aのポイント
  • WebBrowserコントロールを使用してIE操作を行う際にフリーズする問題が発生しています。特定のコードが原因でフリーズが発生することが確認されています。
  • フリーズの原因は、WebBrowserコントロールがBusy状態のままになっていることです。Busy状態では、次のコードに進むことができず、アプリケーションが応答しなくなります。
  • 解決方法としては、Busy状態のチェックに加えて、ReadyState_COMPLETEのチェックも行うことが重要です。また、DoEvents関数を使ってイベントの処理を行うことで、フリーズを回避することができます。
回答を見る
  • ベストアンサー

フリーズしてしまいます。

アクセスでWebBrowserコントロールを使ってIE操作をしているのですが フリーズしてしまいます。 フォームに、WebBrowser0を配置して、 ---------------------------------- Private Sub Form_Load() Me.WebBrowser0.Navigate "http://login.yahoo.co.jp/config/login?logout=1" Call wait 省略・・・ End Sub ---------------------------------- Sub wait() Const READYSTATE_COMPLETE As Long = 4 Do Until Me.WebBrowser0.ReadyState = READYSTATE_COMPLETE Loop Do While Me.WebBrowser0.Busy = True DoEvents Loop End Sub ---------------------------------- を実行すると必ずフリーズします。 ---------------------------------- Sub wait() Do While Me.WebBrowser0.Busy = True DoEvents Loop End Sub ---------------------------------- にしたら問題なく表示されます。 でもこれだけだと、表示し終わりません。 表示されてないのに次のコードへ進んでしまいます。 そもそもなぜフリーズするのでしょうか? アクセス2007です。ご回答よろしくお願いします。

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

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

こんばんは。 .Navigate " http://login.yahoo.co.jp/config/login?logout=1" これは、もちろん、 Me.WebBrowser0.Navigate " http://login.yahoo.co.jp/config/login?logout=1" のことです。With ステートメントを使ってもよいかと思いますが。 >二つに分ける理由は、何度もwait()を使いたいからです。 画面の切り替わりにしても、URLが変わっているのだから、Navigate と一体ではないのかと思ったからです。 >>オブジェクトを取らないで、 >ただコードを実行して、何か意味があるのでしょうか? つまり、こんな風に、オブジェクトを取れば、それを再利用できるということです。 以下では、URLを取得しています。あくまでも、サンプルです。 '// Sub Wait()  Dim ie_Doc As Object  With Me.WebBrowser0  Do While .Busy = True   DoEvents  Loop  Do Until .ReadyState = READYSTATE_COMPLETE   DoEvents  Loop  Set ie_Doc = .Document  MsgBox ie_Doc.Location.href  End With End Sub >CommandStateChangeとは、 >WebBrowserコントロールのイベントでしょうか? そのとおりですが、応用する方法はいくつかあると思いました。 '// Private Sub WebBrowser0_CommandStateChange(ByVal Command As Long, ByVal Enable As Boolean) 'ここに実行マクロ End Sub

bdifbzhz987
質問者

お礼

WindFaller様、何度もありがとうございます。 With ステートメントを使えば、.Navigateに出来るという事ですね。 誤解してました。 >画面の切り替わりにしても、URLが変わっているのだから、 Navigate と一体ではないのかと思ったからです。 URLが変わる場合は、Wait()のコードは不要という事でしょうか? サンプルを作っていただきありがとうございます。 SETステートメントを使って、 URLを取得して、色々利用できるようにしてるのですね。 デザインビューで、WebBrowser0のイベントタブを見ても 更新時 フォーカス取得時 フォーカス取得後 フォーカス喪失後 しかなかったため、 CommandStateChangeが何のことかわかりませんでした。 でも、VBE画面でWebBrowser0のイベントを見てみたら、 CommandStateChangeを含め、たくさんのイベントがありました。 一つ一つ勉強していきます。ありがとうございました。

その他の回答 (1)

回答No.1

こんにちは。 なぜ、プロシージャを2つに分ける必要があるか分かりませんが、 Busy と ReadyState は、逆では?  Do While Me.WebBrowser0.Busy = True   DoEvents  Loop  Do Until Me.WebBrowser0.ReadyState = READYSTATE_COMPLETE   DoEvents  Loop でも、オブジェクトを取らないで、ただコードを実行して、何か意味があるのでしょうか?そもそも、WebBrowserコントロールを使うのだったら、Yahooの場合は、.Navigate URLのアドレスだけでも十分です。後は、IEのイベントをとって、画面の変化を待って進めてもよいと思います。 例えば、_CommandStateChange などとか?

bdifbzhz987
質問者

お礼

ありがとうございました。大変参考になりました。 二つに分ける理由は、何度もwait()を使いたいからです。 仰る通り、逆にしてみたらフリーズしませんでした! >オブジェクトを取らないで、 ただコードを実行して、何か意味があるのでしょうか? どういうことでしょうか? >そもそも、WebBrowserコントロールを使うのだったら、 Yahooの場合は、.Navigate URLのアドレスだけでも十分です。 Private Sub Form_Load() .Navigate "http://login.yahoo.co.jp/config/login?logout=1" Call wait End Sub にしたら、コンパイルエラーになってしまいました。 CommandStateChangeとは、 WebBrowserコントロールのイベントでしょうか? ご回答よろしくお願いします。

関連するQ&A

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

    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")) を付け足すしかないのでしょうか? (できればこれは使いたくないです) ご教授よろしくお願い致します。

  • 無限ループ 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 を入れてみましたが、抜けれません。 ページは既に表示済みです。 なぜ無限ループが抜けられないのか、 なぜページが表示されているのにこのコードが繰り返されるのか 何かわかる方よろしくお願いします。

  • オブジェクト変数または 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

  • Webbrowserで完全にHPを表示させるまで待機したい。

    VB6.0を使っています。 Webbrowserを使いまして HPの表示を完了するまで待機するようにしようと思いました。 しかし表示前に”読み取り終了”になってしまいます。 表示するまで待機させるにはどうすればいいのでしょうか? どうかお願いいたします。 Label1.Caption = "読み取り中" WebBrowser1.Navigate "http://www.yahoo.co.jp" Do While WebBrowser1.Busy = True DoEvents Loop Do While WebBrowser1.Document.ReadyState <> "complete" DoEvents Loop Label1.Caption = "読み取り終了" あと、基本的な操作なのですが プロジェクトを読み込んだすぐにはコードもオブジェクトも表示されません。 一度実行してからコードを出さざるを得ないのですが これはどうすればいいのでしょうか?

  • 正しいWebBrowserの使い方(ループ判定)

    VB2008を使っています。WebBrowserのコンポーネントを使って ホームページにGET形式でパラメータを渡して画面のBODY部分を読み取る ものを作っているのですが、サーバーのレスポンスにもよりますが 1分間に20回で5分(100回程度)連続アクセスをするのですが、 以下のルーチンの場合何か不安を感じまして、 ネットでこれを使えばOKというものが無くて 確実に読み取る方法が知りたくて質問いたしました。 やはり、2つ目のイベントを用いる方が安心でしょうか? 正しいWebBrowserの使い方(ループ判定)をご存知の方教えてください。 '***** WebBrowser1.ReadyState ***** WebBrowser1.Navigate(URL) Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete Or WebBrowser1.IsBusy = True Application.DoEvents() Loop data = WebBrowser1.DocumentText '***** DocumentCompletedイベントまでループ ***** public wait_flag as Boolean wait_flag = True WebBrowser1.Navigate(URL) Do While (WebBrowser1.IsBusy = True) Or (wait_flag = True) Application.DoEvents() Loop data = WebBrowser1.DocumentText '---- イベント ----- Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted wait_flag = False End Sub

  • vbaでyahooメールの受信メールの一覧を読み取

    vbaでyahooメールの受信メールの一覧を読み取る方法はありますか? Sub test() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://login.yahoo.co.jp/config/login?logout=1" 'ログアウトする Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Navigate "https://login.yahoo.co.jp/config/login?.src=&.pd=&.done=http%3A//www.yahoo.co.jp/" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Document.all.UserName.Value = "" objIE.Document.all.passwd.Value = "" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Document.Forms(0).submit Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop objIE.Navigate "http://jp.mc1003.mail.yahoo.co.jp/mc/welcome?.rand=6i0loli2li7s6&noFlush&YY=940152127#_pg=showFolder&fid=Inbox&order=down&tt=84&pSize=25&.jsrand=6381767" Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop Debug.Print objIE.Document.Body.innerHTML Set objIE = Nothing End Sub これでログインまではできるのですが、その後のソースを読み取っても受信メールの一覧は読み取れません。 ログイン後に、vbaではなく手動でWEBクエリをやってソースに書き出してみましたがやはり受信メールだけは読み取れません。 WEBクエリならフォルダの一覧は読み取れました。 VBAで読み取るのは不可能なのでしょうか?

  • VBAで教えてgooに自動ログインしたい

    Sub 教えてgoo() Dim objIE As Object Const READYSTATE_COMPLETE As Long = 4 Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://login.mail.goo.ne.jp/id/authn/LoginStart?Site=oshiete.goo.ne.jp&Success=http%3A%2F%2Foshiete.goo.ne.jp%2F" Do While objIE.Busy = True DoEvents Loop Do Until objIE.ReadyState = READYSTATE_COMPLETE Loop objIE.document.all.all("uname").Value = "gooID" objIE.document.all.all("pass").Value = "gooPW" Do While objIE.Busy = True DoEvents Loop Do Until objIE.ReadyState = READYSTATE_COMPLETE Loop objIE.document.all("ログイン").Click End Sub --------------------------------------------------------- を実行してみても、 objIE.document.all.all("uname").Value = "gooID" objIE.document.all.all("pass").Value = "gooPW" objIE.document.all("ログイン").Click の部分がエラーになってしまいます。 教えてgooは、VBAでログインできないように規制されてるのでしょうか?

  • WebBrowserについて

    Visual Studio 2008を使っています 途中で処理が停止しまい困っています デバックで一時停止をすると Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop この部分で作業が止まっています 何かいい方法はないでしょうか? ソースは下記の通りです WebBrowser1.Navigate(New Uri("http://※※※※※※※※※※※※)) Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop ______________________________ Threading.Thread.Sleep(1000)とか入れても止まってしまいます 秒数はいろいろ試しましたが駄目でした WebBrowser1.Navigate(New Uri("※※※※※※※※※※※※)) Threading.Thread.Sleep(1000) Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete System.Windows.Forms.Application.DoEvents() Loop

  • https:/○○login.php エラーになる

    win7 32ビット オフィス2010です。 https:/○○login.php のようなサイトを開こうとすると ------------------------------------------------------ Dim objIE As InternetExplorer Sub test() Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https:/○○login.php" Call WaitIE1(objIE) End Sub ------------------------------------------------------ Function WaitIE1(objIE As InternetExplorer) Do While objIE.Busy = True DoEvents Loop Do While objIE.Document.ReadyState <> "complete" DoEvents Loop End Function ------------------------------------------------------ このコードがエラーになります。 Do While objIE.Document.ReadyState <> "complete" の部分で 実行時エラ― -2147417848 オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。 となります。 objIEをウォッチ式に登録してみてみると Function WaitIE1(objIE As InternetExplorer) の時に、「変数なし」となっています。 objIE.Navigate http://www.goo.ne.jp/ にすれば、 エラーにならずに、コードが最後まで行きます。 ウォッチ式を見ても 「変数なし」にはなりません。 この違いは何でしょうか?

  • オートメーション エラーです

    win7 エクセル2010です。 ************************************************* Dim objIE As InternetExplorer Sub Sample1() Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "http://www.goo.ne.jp/" Call wait1 Set objIE = Nothing End Sub ************************************************* Sub wait1() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.readyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub ************************************************* だと うまく行きますが、 URLの部分の社内のURLにすると 実行時エラー-2147417848(80010108) 「オートメーションエラーです。起動されたオブジェクトはクライアントから切断されました」 になります。 社内のURLの拡張子は、aspxです。 ウォッチウインドウでobjIEをウォッチ式に登録すると objIE.navigate を過ぎると 中身が、<オートメーション エラーです。> になります。 これは社内のシステムの方でプロタクトがかかっているのでしょうか?

専門家に質問してみよう