2016年01月16日 (土) | Edit |

マクロでハマッたので、誰か同じ事象になってしまった方のお役に立てばというのと、もっとエレガントな方法があれば教えてほしいのと、備忘のために記録しておきます。

■環境
・windows7+ie11+Excel2010
・windows10+ie11+Excel2010
(どちらでも発生)
たぶん環境の問題だと思うのでほとんどの方は発生しないかも。

■現象
とある特定のURLへ遷移(navigate)後、ページ内のリンクから取得したURLへ遷移(navigate)しようとすると、待ち合わせ処理のobjIE.readyStateがずっと1(READYSTATE_LOADING)が返ってきて読み込み終了できない。


Dim href As String
Dim objIE As Object

'IE Create Object
Set objIE = CreateObject("InternetExplorer.application")

objIE.Navigate ("http://xxxxxx/") 'url1
Call fncWait(objIE)
href = objIE.document.Links(0).href

objIE.Navigate (href) 'url2
Call fncWait(objIE) ←ここで止まる

'ブラウザのページ読み込み待ち
Function fncWait(objIE As Object) As Boolean
fncWait = False

Dim timeOut
timeOut = Now + TimeSerial(0, 0, 1) '1秒待ち

Do While objIE.Busy = True Or objIE.readyState <> 4
Sleep 100 ↑ずっと1なので無限ループ
DoEvents
If Now > timeOut Then
Exit Function 'タイムアウト
End If
Loop
Do While objIE.document.readyState <> "complete"
Sleep 100
DoEvents
If Now > timeOut Then
Exit Function
End If
Loop

fncWait = True
End Function

ちなみに
・url1とurl2の間にブレークポイントを設定して、一度でも止めると上手くいく。
・url1とurl2の間にMsgBoxで何か表示してOKを押せば上手くいく。
・url2の読み込み待ち処理がタイムアウトした後に再度url2を読み込み(navigate)すると処理上は上手くいく(次のページへ遷移してページデータの取得も出来る)が、IE画面の見た目上は全く動かずポカーンとした画面が残ってしまう。Quitもできない。
これでは実用できない。。

■対処
特定のURLだけなので、いったんブラウザを閉じることにした。

Dim href As String
Dim objIE As Object
Dim objIEDummy As Object

'IE Create Object
Set objIE = CreateObject("InternetExplorer.application")
Set objIEDummy = CreateObject("InternetExplorer.application")

objIEDummy.Navigate ("http://xxxxxx/")
Call fncWait(objIEDummy)
href = objIEDummy.document.Links(0).href
objIEDummy.Quit '閉じる

objIE.Navigate (href)
Call fncWait(objIE) 


遷移の前後でVisibleをいじったら上手くいった。(1/17訂正・追記)

Dim href As String
Dim objIE As Object

'IE Create Object
Set objIE = CreateObject("InternetExplorer.application")
 objIE.Visible = True

objIE.Navigate ("http://xxxxxx/")
Call fncWait(objIE)
href = objIE.document.Links(0).href

objIE.Visible = False
objIE.Navigate (href)
objIE.Visible = True
Call fncWait(objIE) 

あまり良い対処ではないけど。。。ひとまずこれが一番マシな対処か。(良い知恵をお持ちの方いましたら教えてください)

■やったこと
windows7+ie11+Excel2010
・sleepを長く(効果なし)
・waitを入れる(効果なし)
・タイマーを入れる(効果なし)
・ieを10にダウングレード(上手くいった)

ie10でしばらく運用したもののマイクロソフトがie10のサポートをやめるというのでやっぱりie11にすることに。
ここでie11へのアップデートが上手くいかない(「9C59」エラー)問題が発生。
こちらのページを参考にwindows updateを1つずつ削除すれば出来そうな気がしたけど面倒くさすぎるので、思い切ってwindows10にアップグレードした(デフォルトでie11がインストールされている)。

windows10+ie11+Excel2010で、とりあえず上記の対処で動くようになった。

ワンクリック一括発注支援シート(マクロ非公開)では何の問題もなく動いているようなので、たぶん何か回避方法があるorそもそも私の書き方が悪いんだと思う。マクロについて聞いてみたいけどさすがにこれはサポートの範囲外だよな。。と自粛。


にほんブログ村 株ブログ 株日記へ

広告
コメント
この記事へのコメント
Application.OnTime
trademamさん、はじめまして。
Application.OnTimeは試されたでしょうか?
タイマーとの記述がそうでしたらすいません。
2016/01/17(Sun) 10:50 | URL  | フリーハート [編集]
Re: Application.OnTime
フリーハートさん、こんにちは!コメントありがとうございます!
Application.OnTime 試してみました!
が、、objIE.readyStateの待ち合わせは完了してちゃんと次の処理へ進むんですが、ページの内容が前のページのものになってしまいました。。
objIE.document.body.innerHTML などを見てみると、前のページの内容が入っています。

この記事では省略してたのですが、タイマーは別の方法で(待ち合わせのタイムアウト処理と同じでNow+TimeSerialで、3秒間Loopさせてその間DoEventsする)やっていたんですが、その時も同じ結果になっていました。
なんなのかナゾです。。。(--;
2016/01/17(Sun) 13:57 | URL  | trademam [編集]
試してみました
私の方でも試して、最終的にはうまく行っているように思えます。
環境依存もあるかもしれませんがお試し下さい。

・当初、yahooで試して同じような状態になりましたが、原因は2つ目に表示しようとしているurlから自動遷移にて戻っている為でした。
・トライ&エラーの仮定で、ieのゴミタスクが残っていると不定の状態になる可能性があります。

#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If

Private Sub CommandButton1_Click()
Dim href As String

'IE Create Object
Set objIE = CreateObject("InternetExplorer.application")
' objIE.Visible = True
objIE.Navigate ("http://www.google.co.jp") 'url1
Call fncWait(objIE)

Debug.Print objIE.document.Title
Debug.Print objIE.document.URL

href = objIE.document.Links(0).href
Debug.Print href & "を表示する予定"

objIE.Navigate (href) 'url2

Dim l_ymd As Date
l_ymd = Now()
l_ymd = DateAdd("s", 3, l_ymd)
Application.OnTime EarliestTime:=l_ymd, Procedure:="calledSub"
End Sub
Function fncWait(objIE As Object) As Boolean
fncWait = False

Dim timeOut
timeOut = Now + TimeSerial(0, 0, 1) '1秒待ち

Do While objIE.Busy = True Or objIE.readyState <> 4
Sleep 100
DoEvents
If Now > timeOut Then
Exit Function 'タイムアウト
End If
Loop
Do While objIE.document.readyState <> "complete"
Sleep 100
DoEvents
If Now > timeOut Then
Exit Function
End If
Loop

fncWait = True
End Function

以下、標準モジュールにて
Public objIE As Object
Public Sub calledSub()
Debug.Print "after"
Debug.Print objIE.document.Title
Debug.Print objIE.document.URL

End Sub
2016/01/17(Sun) 15:24 | URL  | フリーハート [編集]
Re: 試してみました
フリーハートさんこんばんは!
わざわざコードまで書いていただいて、ありがとうございます!m(_ _)m
やってみたのですが、やっぱり上手く動作しませんでした。。
3秒後に起動されたサブルーチンでも、Title,URLは前のページのものが表示されてしまいました(×_×)
Googleではちゃんと動いていましたので、このページだけの問題のようです。
ちなみにurlは http://www.live-sec.co.jp/m/ で、一番上のリンク「証券口座ログイン」からログイン画面に行きたいです。(ブラウザの見た目上は行けているんですが)
このページだけ動かないので気持ち悪いです。。ページがシンプルすぎて読み込みが早すぎるせい??とも思うのですが、、うーん、ナゾです。。
2016/01/17(Sun) 20:47 | URL  | trademam [編集]
正常に遷移してしまいました
trademanさん、こんばんは。
うちでは、そのurlでも正常に遷移しました。
私の方は、excel 2013なのでそのせいなのかもしれません。
お役に立てず、すいませんでした。
2016/01/17(Sun) 22:35 | URL  | フリーハート [編集]
Re: 正常に遷移してしまいました
フリーハートさん、どうもありがとうございます!
excel2013にすることも検討してみようと思います。
ワンクリック一括発注支援シートでは問題なさそうなので、何かあると思うのですが、、
と、いじくっていたら、
url2に遷移する前後でobjIE.visibleをいじったら何故か上手くいきました(^^;

objIE.Visible = False
objIE.Navigate (href)
objIE.Visible = True

結局気持ちの悪い処置ですが、前よりは少しマシになりました(^^;;
2016/01/17(Sun) 23:17 | URL  | trademam [編集]
No title
アイアン鉄でございます。

私もこっそり運用しているライブスターで昨年末から同様の現象が発生し下記の方法でごまかしてます。

'ホームページを表示
'Call objIE.Navigate("http://www.live-sec.co.jp/m/")

Call objIE.Navigate("https://lv01.live-sec.co.jp/webbroker3/44/i/WEB3Index.jsp?aa_odrdv=2")

どうも最初のページからのリンクがプログラムでちゃんと制御出来ない様になっているんだと思います。
この後のソースも変わってますので、次のコメントでステートメントすべてを貼ります。
2016/01/18(Mon) 17:23 | URL  | アイアン鉄 [編集]
No title
'ライブスター
Sub CmdOrder1_Click()
Dim objIE As Object
Dim url_l As String
Dim url_s As String
Dim waitTime As Variant

Dim Row As Long

If vbNo = MsgBox("ライブスターで発注しちゃう?", vbInformation + vbYesNo, "発注野郎") Then
Exit Sub
End If

'IE Create Object
Set objIE = CreateObject("InternetExplorer.application")

'IE Option
objIE.FullScreen = False 'メニューも全て無くした最大化になる
objIE.Toolbar = True 'ToolBar On/Off
objIE.MenuBar = True 'MenuBar On/Off
objIE.Visible = True ' True


'ホームページを表示
Call objIE.Navigate("https://lv01.live-sec.co.jp/webbroker3/44/i/WEB3Index.jsp?aa_odrdv=2")
'Call objIE.Navigate("http://www.live-sec.co.jp/m/")

Do While objIE.Busy
Loop

'IE View
objIE.Visible = True

With objIE
' Call subWait(objIE)

'株式取引メニュー
' .Navigate (.Document.Links(0).Href)

' waitTime = Now + TimeValue("0:00:03")
' Application.Wait waitTime

Call subWait(objIE)

.Document.Forms(0).Elements("aa_accd").Value = Range("B2")
.Document.Forms(0).Elements("lg_pw").Value = Range("B3")
.Document.Forms(0).Item("aa_accd").Value = Range("B2")
.Document.Forms(0).Item("lg_pw").Value = Range("B3")
'ログインボタンをクリック
.Document.Forms(0).submit

Call subWait(objIE)

'メインメニュー
.Navigate (.Document.Links(0).Href)

Call subWait(objIE)

'株式取引メニュー
.Navigate (.Document.Links(6).Href)

Call subWait(objIE)

'注文入力
url_l = .Document.Links(0).Href '買い注文用
url_s = .Document.Links(1).Href '売り注文用

Row = 11

Do Until Cells(Row, 2) = ""
If fncOrderA(objIE, Row, url_l, url_s) Then
Cells(Row, 1) = "成功"
Else
Cells(Row, 1) = "失敗"
End If

Row = Row + 1
Loop


End With

objIE.Quit

MsgBox "終わったぜ( ´∀`)b", vbInformation, "発注野郎"

End Sub

2016/01/18(Mon) 17:24 | URL  | アイアン鉄 [編集]
不定な動きっぽいですね
trademanさん、こんばんは。
excelをバージョンアップしても変わらない可能性もあるので、そのままで良いかと思います。
不定っぽい動きが、気になりますがvba自体バギーな所あるのでしょうがないかと思います。
2016/01/18(Mon) 18:43 | URL  | フリーハート [編集]
Re: No title
アイアン鉄さん、コメントいただきありがとうございます!
なるほど、直接遷移後のページから始めれば良いんですね〰。
確かにこれが一番簡単で良いかもですね。
わざわざ新しいソースも貼って頂いてありがとうございます!
参考にさせていただきますね!(^^)
2016/01/18(Mon) 19:53 | URL  | trademam [編集]
Re: 不定な動きっぽいですね
フリーハートさん、こんばんは。

そうですね、とりあえず動作はしますので、excelはこのままにしようかと思います。
VBA自体がバギーなんですね(^^;
なんとなく使いたがらない人が多い気がするのは、そういう理由なんでしょうね…(笑)
いろいろとアドバイスいただきまして、ありがとうございました!
2016/01/18(Mon) 19:56 | URL  | trademam [編集]
No title
http://forest.watch.impress.co.jp/docs/special/599332.html
で勉強していたのですが、動かず困っていました。
ようやく症状が全く同じ、かつ、解決する内容があって助かりました
(objIE.VisbleのTrue/False切り替えでうまくいく。環境はwin10(64)/Excel2007/IE11でした)
ありがとうございます
2017/03/28(Tue) 16:33 | URL  | 初心者 [編集]
Re: No title
>初心者さん
こんにちは、ご報告ありがとうございます。
ちょっと気持ちの悪い対処ですが、どうもExcelのバージョンのせいのような気がしていますので、ここで諦めですね~(^^;
2017/03/29(Wed) 00:06 | URL  | trademam [編集]
コメントを投稿
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可