今まで、VBAからIEを操作する際にNaviate2関数を使用して、
以下のような流れで処理をしていました。
-----------------------------------------------------------
Sub main() '株価データ取得処理
Dim objIE as Object '変数定義
Dim a as Integer
Dim code as String
ret = IE_open(objIE) 'IE初期処理
For a = 1 to 100 step 1 'メイン処理ループ
code = cells(a , 1).value
Call data_get(objIE , code) 'データ取得処理
Call ホニャホニャ '以降必要に応じて処理
Next a
ret = IE_close(objIE) 'IE終了処理
End sub
-----------------------------------------------------------
Sub data_get(objIE , code) '個別データ取得処理
Dim URL as String '変数定義
URL = "http://table.yahoo.co.jp/ホニャホニャ" & code
objIE.Navigate2 URL
Call IE表示待ち(objIE)
Call ホニャホニャ 'IE操作してデータ処理
End sub
-----------------------------------------------------------
Function IE_open(objIE) 'IEオブジェクトの作成
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False 'IEウィンドウを非表示
End Function
-----------------------------------------------------------
Function IE_close(objIE)
objIE.Visible = True 'IEウィンドウを表示
objIE.Quit 'IEオブジェクトの開放
Set objIE = Nothing
End Function
-----------------------------------------------------------
要するに、objIEオブジェクトを使い回していたのですが、
Vista SP1のタイミングか?これがエラーになるようになりました。
腑に落ちない点が多々ありますが、とりあえずシステム復旧を最優先に考え、
以下のように変更しております。
変更点は以下の3点です
①objIEオブジェクトを再利用しない
何が悪かったのかイマイチはっきりしないバグですが、これでエラー回避出来ます。
②Navigate2をNavigateに変更
初期のIE7ではNavigate関数が全く使えなかったが、フとしたことからNavigate関数が
使えるようになっていることを発見。下位互換や使い易さからNavigateに戻した。
③暫定WAIT処理の追加
これは①の副作用とも言うべきものです。メインループの各回でIEオブジェクトの
生成と開放をしているのですが、ループ処理が早すぎるとIEプロセスが落ちる前に
次のIEが生成されるためか、IEのプロセスがメモリをどんどん消費しながら成長して、
最終的にエラーで落ちる現象が発生しました。
これを暫定で回避するためのWAIT処理です。
-----------------------------------------------------------
Sub main() '株価データ取得処理
Dim a as Integer '変数定義
Dim code as String
For a = 1 to 100 step 1 'メイン処理ループ
code = cells(a , 1).value
Call data_get(objIE , code) 'データ取得処理
Call ホニャホニャ '以降必要に応じて処理
Next a
End sub
-----------------------------------------------------------
Sub data_get(objIE , code) '個別データ取得処理
Dim URL as String '変数定義
Dim objIE as Object
ret = IE_open(objIE) 'IE初期処理
URL = "http://table.yahoo.co.jp/ホニャホニャ" & code
objIE.Navigate URL
Call IE表示待ち(objIE)
Call ホニャホニャ 'IE操作してデータ処理
ret = IE_close(objIE) 'IE終了処理
timeup = DateAdd("s", 1, Now()) '暫定WAIT処理
Do While timeup > Now()
DoEvents
Loop
End sub
-----------------------------------------------------------
Function IE_open(objIE) 'IEオブジェクトの作成
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False 'IEウィンドウを非表示
End Function
-----------------------------------------------------------
Function IE_close(objIE) 'IEオブジェクトの開放
objIE.Visible = True 'IEウィンドウを表示
objIE.Quit 'IEオブジェクトの開放
Set objIE = Nothing
End Function
-----------------------------------------------------------
以下のような流れで処理をしていました。
-----------------------------------------------------------
Sub main() '株価データ取得処理
Dim objIE as Object '変数定義
Dim a as Integer
Dim code as String
ret = IE_open(objIE) 'IE初期処理
For a = 1 to 100 step 1 'メイン処理ループ
code = cells(a , 1).value
Call data_get(objIE , code) 'データ取得処理
Call ホニャホニャ '以降必要に応じて処理
Next a
ret = IE_close(objIE) 'IE終了処理
End sub
-----------------------------------------------------------
Sub data_get(objIE , code) '個別データ取得処理
Dim URL as String '変数定義
URL = "http://table.yahoo.co.jp/ホニャホニャ" & code
objIE.Navigate2 URL
Call IE表示待ち(objIE)
Call ホニャホニャ 'IE操作してデータ処理
End sub
-----------------------------------------------------------
Function IE_open(objIE) 'IEオブジェクトの作成
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False 'IEウィンドウを非表示
End Function
-----------------------------------------------------------
Function IE_close(objIE)
objIE.Visible = True 'IEウィンドウを表示
objIE.Quit 'IEオブジェクトの開放
Set objIE = Nothing
End Function
-----------------------------------------------------------
要するに、objIEオブジェクトを使い回していたのですが、
Vista SP1のタイミングか?これがエラーになるようになりました。
腑に落ちない点が多々ありますが、とりあえずシステム復旧を最優先に考え、
以下のように変更しております。
変更点は以下の3点です
①objIEオブジェクトを再利用しない
何が悪かったのかイマイチはっきりしないバグですが、これでエラー回避出来ます。
②Navigate2をNavigateに変更
初期のIE7ではNavigate関数が全く使えなかったが、フとしたことからNavigate関数が
使えるようになっていることを発見。下位互換や使い易さからNavigateに戻した。
③暫定WAIT処理の追加
これは①の副作用とも言うべきものです。メインループの各回でIEオブジェクトの
生成と開放をしているのですが、ループ処理が早すぎるとIEプロセスが落ちる前に
次のIEが生成されるためか、IEのプロセスがメモリをどんどん消費しながら成長して、
最終的にエラーで落ちる現象が発生しました。
これを暫定で回避するためのWAIT処理です。
-----------------------------------------------------------
Sub main() '株価データ取得処理
Dim a as Integer '変数定義
Dim code as String
For a = 1 to 100 step 1 'メイン処理ループ
code = cells(a , 1).value
Call data_get(objIE , code) 'データ取得処理
Call ホニャホニャ '以降必要に応じて処理
Next a
End sub
-----------------------------------------------------------
Sub data_get(objIE , code) '個別データ取得処理
Dim URL as String '変数定義
Dim objIE as Object
ret = IE_open(objIE) 'IE初期処理
URL = "http://table.yahoo.co.jp/ホニャホニャ" & code
objIE.Navigate URL
Call IE表示待ち(objIE)
Call ホニャホニャ 'IE操作してデータ処理
ret = IE_close(objIE) 'IE終了処理
timeup = DateAdd("s", 1, Now()) '暫定WAIT処理
Do While timeup > Now()
DoEvents
Loop
End sub
-----------------------------------------------------------
Function IE_open(objIE) 'IEオブジェクトの作成
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False 'IEウィンドウを非表示
End Function
-----------------------------------------------------------
Function IE_close(objIE) 'IEオブジェクトの開放
objIE.Visible = True 'IEウィンドウを表示
objIE.Quit 'IEオブジェクトの開放
Set objIE = Nothing
End Function
-----------------------------------------------------------