win8.1でvbaでブラウザを操作しています。
XPからWIN7までは、
Sub Sample()
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True
objIE.Navigate "http://www.yahoo.co.jp/"
Do While objIE.Busy = True
DoEvents
Loop
objIE.Navigate "http://shopping.yahoo.co.jp/"
・・・
このように、
objIE.Navigate
に、URLを入れ替えても、問題なく表示できたのですが
win8からは
objIE.Navigateで、1つ目のURLを表示させ、2つ目のURLを表示させると、
見た目は、 二つ目の"http://shopping.yahoo.co.jp/"が表示されるのですが、
objIEの中身は、1つ目の "http://www.yahoo.co.jp/"のままです。
なので、
objIE.Navigate "http://shopping.yahoo.co.jp/"
のあとに、
Do While objIE.Busy = True
DoEvents
Loop
をしても、
objIEに格納されている値は、 "http://www.yahoo.co.jp/"だから
無限ループしてしまいます。
この現象を回避するにはどうすればいいでしょうか?
エクセル2010です。
よろしくお願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>Win8でしか発生しないのですね。
いや、違います。Win8にIE11はリリースされていませんので再現しません。
Win7ですと、IE11環境でも再現する/しないがあって、Win8.1だと確実に再現します。
No.3
- 回答日時:
#1、cjです。
#1お礼欄拝見しました。また、#2さんのご回答も拝見しました。
どうやら、Win8 x64 / IE11 環境でしか再現できないトラブルのようですから、
こちらの環境では再現できない事象のようです。
私の#1での回答は、問題の解決に直結することはないみたいです。
#2の回答者さんは、私も大きく信頼を寄せる方です。
#2リンク先の一番最後の方に、具体的な対策として有効と
思われる(←私には確認しようがないという意味ですが、確度の高い話と思います)
記述がありますね。確認してみてくださいませ。
テスト環境があれば、自分で試してみたいこと、つまり勘や想像ですが、
.Navigate を .Navigate2 に代え、第2引数を色々変えてみるとどうなるか、
自分なら一度は試してみたいですね。
この回答の主旨としては、#2さんの回答で解決できそうに思います、です。
以上です。
No.2
- 回答日時:
objIE.Visible = False
objIE.Navigate "http://shopping.yahoo.co.jp/"
objIE.Visible = True
にしたら、うまく動きました!ありがとうございました。
No.1
- 回答日時:
こんにちは。
#最後の方に、サンプル4種挙げておきます。
ご相談の問題点はここ↓
> Do While objIE.Busy = True
> DoEvents
> Loop
XPでもWin7でも、この記述で同期が取れることは少ないです。(サンプル◆0◆)
(実際Win7/IE11でテストしました)
OSの問題というより、今日的なページソースの在り方や、それに合わせたIEの仕様の変化、
ということはあるのかも知れませんし、昔なら特定のページでうまく同期取れたのかも知れませんが。
待機の記述を書くのが面倒臭い、とかいう相談なのでしょうかね?
省略したいのなら、BusyよりはまだしもReadyStateだけで書いてみては?(サンプル◆1◆)
(最近のネット環境でBusyが問題になること少ないですね。でも偶にある)
標準的というか教科書的というか、私が最初に覚えたのはサンプル◆2◆のような記述です。
(実際はDoEventsよりもSleepを私は重用してますが)
> objIEに格納されている値は、 "http://www.yahoo.co.jp/"だから
> 無限ループしてしまいます。
ご提示の記述には、無限ループとなる部分はパッと見には無いです。
(有るとすれば、実行中に偶然インターネットアクセスが切断されるとか、、、。)
まず、IE側で、ページの表示がコンプリートした、ことを確認してから、
次の処理に進む、というのが、基本です。
"無限ループ"というのはむしろ、
(ここに書かれていない)その後の処理の問題なのでは?
IEがコンプリートしてないのに、objIE.Document(当然これも"complete"してない)
にアクセスしようとして、フリーズする、とか。
ともあれ、ひとまずは、
> objIEに格納されている値は、 "http://www.yahoo.co.jp/"だから
という問題点を解決してみてください。
' ' ----------------
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
' ' ◆0◆ご提示の記述
Sub Re8754535q()
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "http://www.yahoo.co.jp/"
Do While objIE.Busy = True
DoEvents
Loop
Debug.Print 1, objIE.LocationURL
objIE.Navigate "http://shopping.yahoo.co.jp/"
Debug.Print 2, objIE.LocationURL
'イミディエイトウィンドウに表示される結果
' 1 ← NG
' 2 ← NG
'または
' 1 ← NG
' 2 http://www.yahoo.co.jp/ ← NG
'または
' 1 http://www.yahoo.co.jp/
' 2 http://www.yahoo.co.jp/ ← NG
' うまくいくことはない
' Stop
objIE.Quit
End Sub
' ' ◆1◆同期を取るWaitの記述を手抜きする版
Sub Re8754535a()
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "http://www.yahoo.co.jp/"
Do While objIE.ReadyState < READYSTATE_COMPLETE
DoEvents
Loop
Debug.Print 1, objIE.LocationURL
objIE.Navigate "http://shopping.yahoo.co.jp/"
Do While objIE.ReadyState < READYSTATE_COMPLETE
DoEvents
Loop
Debug.Print 2, objIE.LocationURL
'イミディエイトウィンドウに表示される結果
' 1 http://www.yahoo.co.jp/
' 2 http://shopping.yahoo.co.jp/
' Stop
objIE.Quit
End Sub
' ' ◆2◆オースドックスな記述版
Sub Re8754535c()
Dim objIE As InternetExplorer
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
Debug.Print 1, objIE.LocationURL
objIE.Navigate "http://shopping.yahoo.co.jp/"
Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE
DoEvents
Loop
Debug.Print 2, objIE.LocationURL
'イミディエイトウィンドウに表示される結果
' 1 http://www.yahoo.co.jp/
' 2 http://shopping.yahoo.co.jp/
' Stop
objIE.Quit
End Sub
' ' ◆3◆オースドックスな記述にタイムアウト(簡易版)を設定する版
' ' もしもずーーーとページ表示が終らなければ、無限ループになるけれど、
' ' Excel をアクティブにすれば Escキー 押下げでも 抜けられる
Sub Re8754535cc()
Dim objIE As InternetExplorer
Dim timeOut As Date
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate2 "http://www.yahoo.co.jp/"
timeOut = DateAdd("s", 5, Now)
Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE
DoEvents
Sleep (100)
If Now > timeOut Then
objIE.Refresh
timeOut = DateAdd("s", 5, Now)
End If
Loop
Debug.Print 1, objIE.LocationURL
objIE.Navigate2 "http://shopping.yahoo.co.jp/"
timeOut = DateAdd("s", 5, Now)
Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE
DoEvents
Sleep (100)
If Now > timeOut Then
objIE.Refresh
timeOut = DateAdd("s", 5, Now)
End If
Loop
Debug.Print 2, objIE.LocationURL
'イミディエイトウィンドウに表示される結果
' 1 http://www.yahoo.co.jp/
' 2 http://shopping.yahoo.co.jp/
' Stop
objIE.Quit
End Sub
早速のご回答、ありがとうございます。
表示されるまで待つ表記に問題があるのですね。
たくさんのサンプルを作っていただいたうちの、
◆2◆オースドックスな記述版
の方法で行きたいのですが、
------------------------------------------------
objIE.Navigate "http://shopping.yahoo.co.jp/"
の次の
Do While objIE.Busy = True Or objIE.ReadyState < READYSTATE_COMPLETE
DoEvents
Loop
------------------------------------------------
から先へ進めません。
ブレークポイントを設置して、Re8754535cを実行すれば、無事に、objIE.Quitまで行くのですが、
一気にF5で実行すると、ループしてしまってます。
なぜか、
------------------------------------------------
objIE.Navigate "http://www.yahoo.co.jp/"
Do While objIE.Busy = True Or objIE.READYSTATE < READYSTATE_COMPLETE
DoEvents
Loop
Debug.Print 1, objIE.LocationURL
objIE.Navigate "http://www.yahoo.co.jp/"
Do While objIE.Busy = True Or objIE.READYSTATE < READYSTATE_COMPLETE
DoEvents
Loop
Debug.Print 2, objIE.LocationURL
------------------------------------------------
にすると、無事最後までコードが実行されます。
(どちらも"http://www.yahoo.co.jp/")
なぜ2回目のNavigateでページが変わると、コードが最後まで実行されないのか
理由がわからないのですが、
再度教えていただけますか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAで NHK NEWSの NEWSデータ内容取得が できない 1 2023/04/09 12:26
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Amazon Keepaの使い方に付いての質問です。 アメリカAmazonで使いたいと思います。 最初に言語の選択 1 2023/04/07 02:18
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- お菓子・スイーツ 急いでます こちらのプリン製造5日が賞味期限なのですが 製造から到着までどのくらいみているのでしょう 2 2023/03/02 11:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「しばらくお待ちください」の...
-
Delphiのウィンドウサイズ変更
-
c# 文字列の最後から1文字削除...
-
Webページ上のボタン等の位置を...
-
ASPで画面間のパラメタ受け渡し
-
asp.NET初心者です。「 ’Contex...
-
テキストボックスのクリックで...
-
勝手にログアウトされてしまい...
-
Excel:「フォーム」のボタンで...
-
Q&Aフォームを作成したいのです...
-
CD-Rに追記したときに消え去っ...
-
フォームに入力した文字列「○○○」...
-
C#でドラッグ&ドロップが機能し...
-
INPUTのボタン周囲のスペース
-
ボタンを押さずにボタンを押す...
-
複数選択のListBoxでClickイベ...
-
リストビュー内でのドラッグ&...
-
VB.NET 画面遷移
-
javascript 別ウィンドウを開...
-
Eclipseでクリーンが出来ない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ASP.Net 条件により自身を閉じ...
-
アドレスバーのないウィンドウ...
-
子ウインドウから親ウインドウ...
-
「しばらくお待ちください」の...
-
Delphiのウィンドウサイズ変更
-
window.closeのメッセージ
-
HSPでIEを操作したいのですが
-
無限ループ objIE.Navigate
-
閉じるボタンのクリックイベン...
-
別ウィンドウへ表示
-
コネクション・セッション・ト...
-
Accessの画面更新を一時的に停...
-
画面遷移が不正ですと表示されます
-
HTMLボタンの文字色を変え...
-
c# 文字列の最後から1文字削除...
-
DataGridViewのチェックボック...
-
VBAで一時中断したプログラムの...
-
複数選択のListBoxでClickイベ...
-
Eclipseでクリーンが出来ない
-
チャレンジタッチの画面にスマ...
おすすめ情報