~みんな株ってる?~

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

Blogへの画像Uploader作成記~その5~

2008年12月15日 03時08分03秒 | シストレ-開発編
今回の機能は、「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"がいつまで経っても表示されなくなってしまいます。

~次回に続く~



最新の画像もっと見る

3 コメント

コメント日が  古い順  |   新しい順
Unknown (通りすがり)
2009-02-22 00:53:11
環境はXP SP3 & IE7です。
VISTAにしていないのには理由があって、以前はプログラマーではありましたが、現在は専業トレーダーですので何よりも安定を求めるからです。専業トレーダー=トレードは唯一の飯のタネですので、不安定要素は極力取り除きたい訳です。(VISTAは信頼していない。)
ちなみにIEからエクセルに値を返すのはReadyStateとStatusTextは同じタイミング、もしくはReadyState > StatusTextの順で処理されるのではないかと思います。
返信する
Unknown (yn2007)
2009-02-12 11:08:44
コメントありがとうございます。管理人のyn2007です。

ご指摘の通り、Functionを呼ぶ事についてはご提示の書き方でも実現可能です。
が、IEのバージョンなど環境により、不具合が発生する場合があり、回避のために「statustext」をチェックしています。

もし、よろしければ環境など教えて頂ければ切り分けも出来るのですが・・・。
返信する
Unknown (通りすがり)
2009-02-06 12:18:00
エクセルとVBを使用してデータ取得~注文処理まで完全自動で行っています。
私もBusyとReadtStateしかチェックしていませんが、不都合が起きた事は一度もありません。
FunctionをCallする一行の代わりに次の一行で同じ役目を果たせると思いますが…

While IE.Busy = True Or IE.ReadyState <> 4: DoEvents: Wend
返信する