アプリ版:「スタンプのみでお礼する」機能のリリースについて

アクセスで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です。ご回答よろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

WindFaller様、何度もありがとうございます。

With ステートメントを使えば、.Navigateに出来るという事ですね。
誤解してました。

>画面の切り替わりにしても、URLが変わっているのだから、
Navigate と一体ではないのかと思ったからです。

URLが変わる場合は、Wait()のコードは不要という事でしょうか?

サンプルを作っていただきありがとうございます。
SETステートメントを使って、
URLを取得して、色々利用できるようにしてるのですね。

デザインビューで、WebBrowser0のイベントタブを見ても
更新時
フォーカス取得時
フォーカス取得後
フォーカス喪失後
しかなかったため、
CommandStateChangeが何のことかわかりませんでした。

でも、VBE画面でWebBrowser0のイベントを見てみたら、
CommandStateChangeを含め、たくさんのイベントがありました。

一つ一つ勉強していきます。ありがとうございました。

お礼日時:2012/12/04 19:53

こんにちは。



なぜ、プロシージャを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 などとか?
    • good
    • 0
この回答へのお礼

ありがとうございました。大変参考になりました。

二つに分ける理由は、何度も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コントロールのイベントでしょうか?

ご回答よろしくお願いします。

お礼日時:2012/12/03 20:37

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