~みんな株ってる?~

~目指せ!あと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
-----------------------------------------------------------



Mercedes Bentz から GLK公開

2008年05月31日 11時29分31秒 | くるま関連
メルセデスからいくつかのショーでGLクラスのSUVが展示されてます。

見た目がワイルドで私的にはかなりGoodだと思います。




http://www.mbusa.com/models/future/glk/index.do
http://en.wikipedia.org/wiki/Mercedes-Benz_GLK-Class
http://jalopnik.com/cars/glk/
http://www.autoblog.com/2008/01/13/detroit-2008-mercedes-benz-has-double-vision-with-glk-townside/
http://www.autoblog.com/tag/glk/
http://www.motorauthority.com/news/concept-cars/official-pics-mercedes-glk-revealed-ahead-of-detroit-show/


ブログのタイムスタンプ

2008年05月31日 08時21分05秒 | シストレ-開発編
本日、何本か立て続けにブログに投稿した時に気づいたのですが、
新規投稿時のタイムスタンプは、サーバ側のタイム(日本時間)であるのに対し、
編集等で「現在日時をセット」ボタンを押した場合は、クライアント側の
タイム(カナダ時間)が自動的にセットされることに気づきました。

日本で更新していた時は、常にNTPサーバと同期しておりタイムスタンプ源泉を
意識したことは無かったのですが、海外からの更新なので気づきました。

カナダ時間を基準に見ると、未来の時間が設定されている事になり、
日本時間を基準に見ると、最新記事なのに昨日日付で表示される可能性があります。
(ちなみに、投稿時現在 5月30日(金) 16時21分)

これにより、最新記事が過去記事に埋もれてしまう危険性がありますね。
注意してご覧ください。


IEのバージョンチェック機能

2008年05月31日 07時04分58秒 | シストレ-開発編
IEのバージョンがIE6→IE7→IE8βと変わるごとに、シストレの動作に何かしらの
不具合が出てきてさすがにムカついてきた今日この頃。

しかし、新バージョンにはそれなりのメリットもあることから、
バージョンアップを避けられない人もいる事でしょう。

そんな悩みを解決ではなく、回避する方法のひとつとして、
システム側でIEのバージョンを事前に把握し、バージョンにあった処理を
させることで回避を狙います。

その手始めとして、VBAでIEのバージョンをチェックする方法です。

---------------------------------------------------------------
Sub IE_VerCK()
'InternetExplorerのバージョンを調べる

 'オブジェクトの定義
 Dim IE_Ver As String
 Dim FsObj As Object

 Set FsObj = CreateObject("Scripting.FileSystemObject")

 'GetFileVersion関数を使用
 IE_Ver = FsObj.GetFileVersion("C:Program FilesInternet ExplorerIEXPLORE.EXE ")

 '結果を表示
 MsgBox "Internet Explorer" & Chr(13) & _
  " Majar Version : " & Left(IE_Ver, InStr(IE_Ver, ".") - 1) & Chr(13) & _
  " Minor Version : " & IE_Ver

 '後処理
 Set FsObj = Nothing

End Sub
---------------------------------------------------------------