プロが教える店舗&オフィスのセキュリティ対策術

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件)

散漫に不正確なこと書いちゃったせいで、余計に煩わせてしまい


すみません。
修正ありがとうございました。
  cj 拝
    • good
    • 0

>Win8でしか発生しないのですね。


いや、違います。Win8にIE11はリリースされていませんので再現しません。
Win7ですと、IE11環境でも再現する/しないがあって、Win8.1だと確実に再現します。
    • good
    • 1

#1、cjです。

#1お礼欄拝見しました。
また、#2さんのご回答も拝見しました。

どうやら、Win8 x64 / IE11 環境でしか再現できないトラブルのようですから、
こちらの環境では再現できない事象のようです。
私の#1での回答は、問題の解決に直結することはないみたいです。

#2の回答者さんは、私も大きく信頼を寄せる方です。
#2リンク先の一番最後の方に、具体的な対策として有効と
思われる(←私には確認しようがないという意味ですが、確度の高い話と思います)
記述がありますね。確認してみてくださいませ。

テスト環境があれば、自分で試してみたいこと、つまり勘や想像ですが、
.Navigate を .Navigate2 に代え、第2引数を色々変えてみるとどうなるか、
自分なら一度は試してみたいですね。

この回答の主旨としては、#2さんの回答で解決できそうに思います、です。

以上です。
    • good
    • 0
この回答へのお礼

Win8でしか発生しないのですね。
申し訳ございませんでした。

ご協力いただき、ありがとうございました。

お礼日時:2014/09/17 20:39

Navigateメソッドの前後にVisibleプロパティを挟むといいそうです。



参考URL:http://www.moug.net/faq/viewtopic.php?t=70210
    • good
    • 0
この回答へのお礼

objIE.Visible = False
objIE.Navigate "http://shopping.yahoo.co.jp/"
objIE.Visible = True

にしたら、うまく動きました!ありがとうございました。

お礼日時:2014/09/17 20:38

こんにちは。



#最後の方に、サンプル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
    • good
    • 2
この回答へのお礼

早速のご回答、ありがとうございます。

表示されるまで待つ表記に問題があるのですね。

たくさんのサンプルを作っていただいたうちの、
◆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でページが変わると、コードが最後まで実行されないのか
理由がわからないのですが、
再度教えていただけますか?

よろしくお願いします。

お礼日時:2014/09/15 21:26

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