タイトルどおり、IEを最新のIE8へとアップデートしてみました。
そもそも、Firefoxを常用しており、マクロからコントロールのし易さからIEは死す取れ関連(自動株取引とブログへの記録投稿、その他のブログ更新)にしかつかっておりません。
そのIE7で機能的には不満は無かったのですが、とにかくFirefoxと比べて遅いのは感じていました。そんな中、IE8が登場し、「早くなった」とのふれ込みとありましたので、早速アップデートしてみました。
結果、問題が2点発生。
① 非常に遅い(体感はIE7と大して変わらなかった)
② IEフォームの仕様に一部変更があった(みたい)
※type="file"形式のinputフォームに直接任意の値をペーストできなくなりました。
②については、Firefoxでもグレーアウトされていてフォーカスが当たると、別ウインドが出るので、IE8の変更が正常なのかも知れませんが、現状のマクロ郡では別窓のコントロールが操作出来ないのでソッコーでIE7に戻しました。
IE8はIE7を上書きせずにインストールされているようなので、戻しは、コントロールパネルからIE8を削除のみ。
正味、10分程度の命でした。
そもそも、Firefoxを常用しており、マクロからコントロールのし易さからIEは死す取れ関連(自動株取引とブログへの記録投稿、その他のブログ更新)にしかつかっておりません。
そのIE7で機能的には不満は無かったのですが、とにかくFirefoxと比べて遅いのは感じていました。そんな中、IE8が登場し、「早くなった」とのふれ込みとありましたので、早速アップデートしてみました。
結果、問題が2点発生。
① 非常に遅い(体感はIE7と大して変わらなかった)
② IEフォームの仕様に一部変更があった(みたい)
※type="file"形式のinputフォームに直接任意の値をペーストできなくなりました。
②については、Firefoxでもグレーアウトされていてフォーカスが当たると、別ウインドが出るので、IE8の変更が正常なのかも知れませんが、現状のマクロ郡では別窓のコントロールが操作出来ないのでソッコーでIE7に戻しました。
IE8はIE7を上書きせずにインストールされているようなので、戻しは、コントロールパネルからIE8を削除のみ。
正味、10分程度の命でした。
ブログを自動投稿する機能を作成してテスト運用してますが、海外の記事で「€」(ユーロ)を使ったときの現象で不可解なものがあります。
ブログのタイトルと本文に「€」を入力し、投稿するとタイトル部の「€」のみ「€」*1(文字化け?)正常に表示されませんでした。投稿前(記事入力中)は正常に表示されているのに・・・本文は投稿前後共に問題なし。
この影響により、一部機能が正常に動作しない事が分かってきました。
*1:全て半角で表示される。
本文に全て半角で入力すると逆に「€」と変換されてしまうので、&#を全角で仮表示。
この「€」は機種依存文字になっているようで、単純にバグという訳ではないでしょう。おそらく、サイト毎の解釈と対応次第かと予想してますが・・。
とりあえず、現象をgooの質問ページから投げてみました。返信が来たらレポートします。
※おそらくこの記事のタイトルも同様に文字化けしてしまうことでしょう。
正しくは "「€」(ユーロ)記号の表示について」" と表示したかったのですが。。
ブログのタイトルと本文に「€」を入力し、投稿するとタイトル部の「€」のみ「€」*1(文字化け?)正常に表示されませんでした。投稿前(記事入力中)は正常に表示されているのに・・・本文は投稿前後共に問題なし。
この影響により、一部機能が正常に動作しない事が分かってきました。
*1:全て半角で表示される。
本文に全て半角で入力すると逆に「€」と変換されてしまうので、&#を全角で仮表示。
この「€」は機種依存文字になっているようで、単純にバグという訳ではないでしょう。おそらく、サイト毎の解釈と対応次第かと予想してますが・・。
とりあえず、現象をgooの質問ページから投げてみました。返信が来たらレポートします。
※おそらくこの記事のタイトルも同様に文字化けしてしまうことでしょう。
正しくは "「€」(ユーロ)記号の表示について」" と表示したかったのですが。。
TG Daily - Proposal given to recoup waste energy from cars, railways and airplanes
JRの改札(確か、新宿駅)で実験が開始されている、振動や摩擦によって発電するシステムですが、イスラエルのこの会社が開発したのはもっと大規模なもので、幹線道路のアスファルトの下に設置するというもの。
車通りの多い4車線の道路にこのシステムを設置すると、1km設置するごとに500キロワット(家庭100軒分)を発電できるとの事です。記事では電車や飛行機にもとかかれていますが、設置コストの方が高いのでは?
JRの改札(確か、新宿駅)で実験が開始されている、振動や摩擦によって発電するシステムですが、イスラエルのこの会社が開発したのはもっと大規模なもので、幹線道路のアスファルトの下に設置するというもの。
車通りの多い4車線の道路にこのシステムを設置すると、1km設置するごとに500キロワット(家庭100軒分)を発電できるとの事です。記事では電車や飛行機にもとかかれていますが、設置コストの方が高いのでは?
今回の機能は、「Blogのログインページを開く」です。
Blogのログインページを開くにはNavigate2コマンドを使います。
■構文■Navigate2 url
url :表示したいアドレス(URL)を文字列型で指定
Return :戻り値なし
■例1■
Sub Sample1()
Dim objIE as Variant ’オブジェクト参照保存用
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate2 "http://www.google.com" ※1
End Sub
ココでの注意点は※1部分。
単にURLを開くだけであればコレで問題はありませんが、この処理自体は表示コマンドを発行した後、すぐに完了してしまうという事です。言い換えると、ページの表示が完了する前に次の処理に進んでしまうのです。
問題となる例としては、何か入力画面を表示して入力も自動化している場合。
ページが表示される(入力フィールドが表示される)前に入力を開始してしまうのです。そこで、IEの表示待ちの機能が必要になります。
表示が完了したかどうかの判定には以下の項目を使用します。
objIE.ReadyState:ココが4(数値型)が表示完了
objIE.Busy :IEが処理中かどうかをTRUE/FALSEで表示
objIE.StatusText:IE最下のステータス表示欄の文字列
※どこのサイトでも上2項目しかチェックしてないのですが、不完全であるため私はStatusTextもチェック項目に追加しています。
■例2■
Function WaitIE(objIE As Object)
Dim ReadyStateNum As Integer
Dim ReadyStateText As String
ReadyStateNum = 4
ReadyStateText = "Done"
While objIE.ReadyState <> ReadyStateNum
Wend
While objIE.statustext <> ReadyStateText
Wend
While objIE.busy <> False
Wend
End Function
この機能はページを移動する度に使用される機能なのでFunctionとして定義しています。呼び側からObject形式のobjIE(AxtiveX参照)を引数として受け取り、そのIEのステータスが全て表示完了を示すまで何もせずに待つ機能になります。
ReadyStateTextが"Done"になっているのは、私の環境が英語版のIEを使っているため。日本語IEだと"表示完了"とかになってるのかな?!
ココでの注意点。マウスカーソルがIEのリンク上にある時、ReadyStateTextにはそのリンク先のURLが表示され"Done"がいつまで経っても表示されなくなってしまいます。
~次回に続く~
Blogのログインページを開くにはNavigate2コマンドを使います。
■構文■Navigate2 url
url :表示したいアドレス(URL)を文字列型で指定
Return :戻り値なし
■例1■
Sub Sample1()
Dim objIE as Variant ’オブジェクト参照保存用
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate2 "http://www.google.com" ※1
End Sub
ココでの注意点は※1部分。
単にURLを開くだけであればコレで問題はありませんが、この処理自体は表示コマンドを発行した後、すぐに完了してしまうという事です。言い換えると、ページの表示が完了する前に次の処理に進んでしまうのです。
問題となる例としては、何か入力画面を表示して入力も自動化している場合。
ページが表示される(入力フィールドが表示される)前に入力を開始してしまうのです。そこで、IEの表示待ちの機能が必要になります。
表示が完了したかどうかの判定には以下の項目を使用します。
objIE.ReadyState:ココが4(数値型)が表示完了
objIE.Busy :IEが処理中かどうかをTRUE/FALSEで表示
objIE.StatusText:IE最下のステータス表示欄の文字列
※どこのサイトでも上2項目しかチェックしてないのですが、不完全であるため私はStatusTextもチェック項目に追加しています。
■例2■
Function WaitIE(objIE As Object)
Dim ReadyStateNum As Integer
Dim ReadyStateText As String
ReadyStateNum = 4
ReadyStateText = "Done"
While objIE.ReadyState <> ReadyStateNum
Wend
While objIE.statustext <> ReadyStateText
Wend
While objIE.busy <> False
Wend
End Function
この機能はページを移動する度に使用される機能なのでFunctionとして定義しています。呼び側からObject形式のobjIE(AxtiveX参照)を引数として受け取り、そのIEのステータスが全て表示完了を示すまで何もせずに待つ機能になります。
ReadyStateTextが"Done"になっているのは、私の環境が英語版のIEを使っているため。日本語IEだと"表示完了"とかになってるのかな?!
ココでの注意点。マウスカーソルがIEのリンク上にある時、ReadyStateTextにはそのリンク先のURLが表示され"Done"がいつまで経っても表示されなくなってしまいます。
~次回に続く~
今回の機能は、「IEインスタンスを起動する」です。
コレは以前にも解説済みですが、再度改めて。
IEインスタンスを作るにはCreateObjectコマンドを使います。
■構文■Return = CreateObject(class,[servername])
class :作成するオブジェクトのクラスとアプリケーションの名前を指定
servername :作成するオブジェクトを保存するネットワーク サーバの名前を指定(省略可能)
Return :ActiveX オブジェクトへの参照を作成して返却
■例1■
Sub Sample1()
Dim objIE as Variant ’オブジェクト参照保存用
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
End Sub
~次回に続く~
コレは以前にも解説済みですが、再度改めて。
IEインスタンスを作るにはCreateObjectコマンドを使います。
■構文■Return = CreateObject(class,[servername])
class :作成するオブジェクトのクラスとアプリケーションの名前を指定
servername :作成するオブジェクトを保存するネットワーク サーバの名前を指定(省略可能)
Return :ActiveX オブジェクトへの参照を作成して返却
■例1■
Sub Sample1()
Dim objIE as Variant ’オブジェクト参照保存用
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
End Sub
~次回に続く~
今回以降、各回で一ずつ機能を紹介していきます。
今回の機能は、「所定のフォルダをチェックして画像ファイル(当初は、ただファイル)の有無をチェック」です。
ファイルの有無を確認するにはDirコマンドを使います。
■構文■Return = Dir[(pathname[, attributes])]
pathname :Uploadする画像の保存先を文字列型で指定
attributes :ファイルの拡張子や属性などでフィルタ可能(基本機能作成完了後に追加予定)
Return :(該当ファイルが存在した場合)最初のファイル名を文字列型で返却
:(該当ファイルが存在した場合)長さ0の文字列 ("") を返却
■例1■
Sub Sample1()
Dim pathname as String 'パス保存用
Dim Return as String 'ファイル名保存用
pathname = "C:Documents and Settingsユーザ名My DocumentsMy Pictures"
Return = Dir(pathname)
If Return = "" Then
Msgbox "ファイルが見つかりませんでした"
Else
Msgbox Return
Endif
End Sub
コレでは、最初の1ファイル(どのファイルかは分からない)しか取得出来ないのでFor~Next文で最後(取得ファイル名が"")まで取得する。
■例2■
Sub Sample2()
Dim pathname as String 'パス保存用
Dim Return(256) as String 'ファイル名保存用
Dim i as Integer 'カウンタ変数
pathname = "C:Documents and Settingsユーザ名My DocumentsMy Pictures"
Return(0) = Dir(pathname)
If Return(0) = "" Then
Msgbox "ファイルが見つかりませんでした"
Else
Msgbox Return(0)
Endif
For i = 1 to 255 Step 1
Return(i) = Dir() '※1
If Return(i) = "" Then
Exit for
Else
Msgbox Return(i)
Endif
Next i
End Sub
ココでの注意点は※1部分。Dir関数に引数を指定しない事。コレにより前回指定された引数が自動的に引き継がれ、且つ、前回の継続取得と判断され2番目移行のファイル名が取得可能です。
~次回に続く~
今回の機能は、「所定のフォルダをチェックして画像ファイル(当初は、ただファイル)の有無をチェック」です。
ファイルの有無を確認するにはDirコマンドを使います。
■構文■Return = Dir[(pathname[, attributes])]
pathname :Uploadする画像の保存先を文字列型で指定
attributes :ファイルの拡張子や属性などでフィルタ可能(基本機能作成完了後に追加予定)
Return :(該当ファイルが存在した場合)最初のファイル名を文字列型で返却
:(該当ファイルが存在した場合)長さ0の文字列 ("") を返却
■例1■
Sub Sample1()
Dim pathname as String 'パス保存用
Dim Return as String 'ファイル名保存用
pathname = "C:Documents and Settingsユーザ名My DocumentsMy Pictures"
Return = Dir(pathname)
If Return = "" Then
Msgbox "ファイルが見つかりませんでした"
Else
Msgbox Return
Endif
End Sub
コレでは、最初の1ファイル(どのファイルかは分からない)しか取得出来ないのでFor~Next文で最後(取得ファイル名が"")まで取得する。
■例2■
Sub Sample2()
Dim pathname as String 'パス保存用
Dim Return(256) as String 'ファイル名保存用
Dim i as Integer 'カウンタ変数
pathname = "C:Documents and Settingsユーザ名My DocumentsMy Pictures"
Return(0) = Dir(pathname)
If Return(0) = "" Then
Msgbox "ファイルが見つかりませんでした"
Else
Msgbox Return(0)
Endif
For i = 1 to 255 Step 1
Return(i) = Dir() '※1
If Return(i) = "" Then
Exit for
Else
Msgbox Return(i)
Endif
Next i
End Sub
ココでの注意点は※1部分。Dir関数に引数を指定しない事。コレにより前回指定された引数が自動的に引き継がれ、且つ、前回の継続取得と判断され2番目移行のファイル名が取得可能です。
~次回に続く~
前回からの続き~
悩んだがなかなか解決策が見つからず、時間を掛けて見た目を気にするよりも、まずは機能を優先ということで、毎度の通りEXCEL(VBA)側からUWSCを呼び出すことに。
小機能としては、以下の通り
■EXCEL(VBA)側
所定のフォルダをチェックして画像ファイル(当初は、ただファイル)の有無をチェック
IEインスタンスを起動する
Blogのログインページを開く
ID/パスワードの入力及びログインボタンを押す
画像Uploadページに移動する
画像Uploadサイズを選択する
UWSCにファイルパスとファイル名を渡す
~UWSC側処理~
画像Uploadを押す
Upload済みのファイルを削除する
未Uploadのファイルがあれば処理を繰り返す
ログアウト
IEを閉じる
■UWSC側
IE上のフォーカス(カーソル位置)をパス入力フィールドに移動
パスを入力
IE上のフォーカス(カーソル位置)をファイル名入力フィールドに移動
ファイル名入力
~上記を3回繰り返す~
とりあえずの基本機能として、この機能を優先的に作ることにしました。
~次回に続く~
悩んだがなかなか解決策が見つからず、時間を掛けて見た目を気にするよりも、まずは機能を優先ということで、毎度の通りEXCEL(VBA)側からUWSCを呼び出すことに。
小機能としては、以下の通り
■EXCEL(VBA)側
所定のフォルダをチェックして画像ファイル(当初は、ただファイル)の有無をチェック
IEインスタンスを起動する
Blogのログインページを開く
ID/パスワードの入力及びログインボタンを押す
画像Uploadページに移動する
画像Uploadサイズを選択する
UWSCにファイルパスとファイル名を渡す
~UWSC側処理~
画像Uploadを押す
Upload済みのファイルを削除する
未Uploadのファイルがあれば処理を繰り返す
ログアウト
IEを閉じる
■UWSC側
IE上のフォーカス(カーソル位置)をパス入力フィールドに移動
パスを入力
IE上のフォーカス(カーソル位置)をファイル名入力フィールドに移動
ファイル名入力
~上記を3回繰り返す~
とりあえずの基本機能として、この機能を優先的に作ることにしました。
~次回に続く~
最近、市場の低迷と共に離れていた相場に復活するための準備を着々と進めております。このブログも少しずつではありますが、シストレや自動化関連情報をUPしていく予定です。
相場から離れている間、PC関連の記事をかなりの数ブログで公開して来ましたが、画像のUPLOAD作業が非常にめんどくさかった。Blogにログインし、画像UPのページに移動して画像パスと画像名を指定して3ファイルずつUPしての繰り返し。
毎日10-20のファイルをUPするのは非常に手間でした。やはりココでもProgrammer魂に火が灯り、いつも通りに自動化してしまいました。
基本は今までの同じです。
VBAからIEをコントロールして、IEを起動、Blogにログイン、ページ移動して。。。。という感じ。ココまでは、既存のソースを再利用できるので問題なし。
問題は、画像ファイルの指定の箇所
通常の手作業での流れでは赤線のような動きとなります。コレを何とか自動化したかったのですが、このファイルを指定する部分(Browseボタン左のフィールド)どうやらvalue="XXX”とかで直接文字列を入れられない模様。詳しく調べたところセキュリティの問題を含んでおり、<InputType="File">となっているところのValueは変更できないとのこと。
でも、キーボードからの直接入力には対応していることから、考えられる事はタダひとつ。SendKeyなどの機能を使って仮想キー入力を行うこと。そこでSendKeyを更に詳しく調べながらコーディングを進めていくと、問題にぶち当たった。Sendkeyはファオーカスを持ったWindowに対してのみ仮想キー入力を行うとのこと。ようするに、VBA起動した時はExcelがフォーカスを持っており、Excelに対してSendkeyをしてしまうのだ。
ということは、Excel側でウインドのフォーカスをコントロールしなくてはならない。うーん。。
~次回に続く~
相場から離れている間、PC関連の記事をかなりの数ブログで公開して来ましたが、画像のUPLOAD作業が非常にめんどくさかった。Blogにログインし、画像UPのページに移動して画像パスと画像名を指定して3ファイルずつUPしての繰り返し。
毎日10-20のファイルをUPするのは非常に手間でした。やはりココでもProgrammer魂に火が灯り、いつも通りに自動化してしまいました。
基本は今までの同じです。
VBAからIEをコントロールして、IEを起動、Blogにログイン、ページ移動して。。。。という感じ。ココまでは、既存のソースを再利用できるので問題なし。
問題は、画像ファイルの指定の箇所
通常の手作業での流れでは赤線のような動きとなります。コレを何とか自動化したかったのですが、このファイルを指定する部分(Browseボタン左のフィールド)どうやらvalue="XXX”とかで直接文字列を入れられない模様。詳しく調べたところセキュリティの問題を含んでおり、<InputType="File">となっているところのValueは変更できないとのこと。
でも、キーボードからの直接入力には対応していることから、考えられる事はタダひとつ。SendKeyなどの機能を使って仮想キー入力を行うこと。そこでSendKeyを更に詳しく調べながらコーディングを進めていくと、問題にぶち当たった。Sendkeyはファオーカスを持ったWindowに対してのみ仮想キー入力を行うとのこと。ようするに、VBA起動した時はExcelがフォーカスを持っており、Excelに対してSendkeyをしてしまうのだ。
ということは、Excel側でウインドのフォーカスをコントロールしなくてはならない。うーん。。
~次回に続く~
楽天証券から提供されているマーケットスピード(MarketSpeed)に関する、
様々な情報をまとめました。
■WinXP上で楽天MarketSpeed(マケスピ)を多重起動する方法
http://charismaneet.seesaa.net/article/58709103.html
■多重起動設定後にバージョンアップする方法
http://charismaneet.seesaa.net/article/58712374.html
■パソコン起動時・パスワード入力の省略法
http://charismaneet.seesaa.net/article/59494425.html
■環境設定・マイページ4分割などのバックアップ(レジストリ)方法
http://trendline-info.com/trendline/blog/?p=1162
■マケスピの安い継続方法
http://trendline-info.com/trendline/blog/?p=1161
様々な情報をまとめました。
■WinXP上で楽天MarketSpeed(マケスピ)を多重起動する方法
http://charismaneet.seesaa.net/article/58709103.html
■多重起動設定後にバージョンアップする方法
http://charismaneet.seesaa.net/article/58712374.html
■パソコン起動時・パスワード入力の省略法
http://charismaneet.seesaa.net/article/59494425.html
■環境設定・マイページ4分割などのバックアップ(レジストリ)方法
http://trendline-info.com/trendline/blog/?p=1162
■マケスピの安い継続方法
http://trendline-info.com/trendline/blog/?p=1161
記事紹介:クリック証券(旧GMO証券)が、賞金総額2000万円の公開APIを
使ったシステムトレードコンテスト「シストレ FX グランプリ 2008」を
本日より開催しました。
最も賞金額が多いのが「高島社長特別賞」で1000万円。
この金額は、シストレソフトの買い取り価格でもあります。
そのほか、シストレ部門賞(1位は300万円)、トレード部門賞(1位は300万円)、
前記MVP賞50万円、後期MVP賞50万円となっています。
賞金総額2千万!公開APIでFXシストレコンテスト
使ったシステムトレードコンテスト「シストレ FX グランプリ 2008」を
本日より開催しました。
最も賞金額が多いのが「高島社長特別賞」で1000万円。
この金額は、シストレソフトの買い取り価格でもあります。
そのほか、シストレ部門賞(1位は300万円)、トレード部門賞(1位は300万円)、
前記MVP賞50万円、後期MVP賞50万円となっています。
賞金総額2千万!公開APIでFXシストレコンテスト
今まで、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
-----------------------------------------------------------
本日、何本か立て続けにブログに投稿した時に気づいたのですが、
新規投稿時のタイムスタンプは、サーバ側のタイム(日本時間)であるのに対し、
編集等で「現在日時をセット」ボタンを押した場合は、クライアント側の
タイム(カナダ時間)が自動的にセットされることに気づきました。
日本で更新していた時は、常にNTPサーバと同期しておりタイムスタンプ源泉を
意識したことは無かったのですが、海外からの更新なので気づきました。
カナダ時間を基準に見ると、未来の時間が設定されている事になり、
日本時間を基準に見ると、最新記事なのに昨日日付で表示される可能性があります。
(ちなみに、投稿時現在 5月30日(金) 16時21分)
これにより、最新記事が過去記事に埋もれてしまう危険性がありますね。
注意してご覧ください。
新規投稿時のタイムスタンプは、サーバ側のタイム(日本時間)であるのに対し、
編集等で「現在日時をセット」ボタンを押した場合は、クライアント側の
タイム(カナダ時間)が自動的にセットされることに気づきました。
日本で更新していた時は、常にNTPサーバと同期しておりタイムスタンプ源泉を
意識したことは無かったのですが、海外からの更新なので気づきました。
カナダ時間を基準に見ると、未来の時間が設定されている事になり、
日本時間を基準に見ると、最新記事なのに昨日日付で表示される可能性があります。
(ちなみに、投稿時現在 5月30日(金) 16時21分)
これにより、最新記事が過去記事に埋もれてしまう危険性がありますね。
注意してご覧ください。
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
---------------------------------------------------------------
不具合が出てきてさすがにムカついてきた今日この頃。
しかし、新バージョンにはそれなりのメリットもあることから、
バージョンアップを避けられない人もいる事でしょう。
そんな悩みを解決ではなく、回避する方法のひとつとして、
システム側で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
---------------------------------------------------------------