~みんな株ってる?~

~目指せ!あと5年でセミリタイヤ~   ※ブラウザのフォントを等幅にすると快適に参照ができます。

原因不明のエラー~続報1~VBAからIEを操作~

2008年05月31日 15時28分29秒 | シストレ-開発編
今まで、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
-----------------------------------------------------------




最新の画像もっと見る