[三流君(TOPへ)] −−> [VBAで楽しくプログラミング] −−>

三流君VBAでIE操作 起動や簡単なデータセットの実験

CreateObject("InternetExplorer.application")
で、IEを起動させ、フォームにデータをセットして、Submit送信する、簡単な実験です。
レアケースなどを考えていないので、参考になるか・・・(冗長な解説ですがみてください)

今の最新の解説は、
http://www.ken3.org/cgi-bin/group/vba_ie.asp
を見てください。
※ココから下のサンプル、XP+IE7やVistaの最新環境では動きません、XP+IE6の1つ前の古い環境だと動きます。対策などがわかったら、また書き込みます
読者より、↓下記のサイトを勧めていただきました
7.1 IEオブジェクトを作る(IE7編)
↑IE7のオブジェクトの作り方が丁寧に書いてありました。
※私もザボってないで、がんばらねば・・・
※※あと、毎日のようにIE操作はUWSCを使え とメッセージをいただくので、IE操作の人はUWSCもググってみては??

読者より、下記の書き込みをいただきました。(2007/10/08 20:23:39)


MSHTMLに参照設定して、以下コードを実行すると、
WebBrowser1オブジェクトのDocumentオブジェクトに補完が聞きますよ。
その後、VB、VBAのオブジェクトブラウザでMSHTMLのActiveXに関する情報が手に入ります。
--
dim objHTML as MSHTML.HTMLDocument
set objHTML = WebBrowser1.Document
.....
set objHTML = Nothing
--
あと、デバッグ中にobjHTMLをウォッチすると、いろいろわかります。


VBAでIEを操作する解説を始めたいと思います。
まぁ、ここを読むだけじゃ厳しいと思いますが、入り口のひとつとしてお役に立てれば幸いです。

IEの起動、はじめは・・・CreateObject かな?

CreateObject("InternetExplorer.application")
にするか、フォームにIEのオブジェクトを埋め込むか?
まずは、ここからかな。
読者の心の声:イマイチ何?言ってんだか?わからないのですが・・・ 三流君の説明聞くより、コード見たほうがハヤイって?

CreateObjectは簡単で、


Sub ie_test()
    Dim objIE    As Object  'IEオブジェクト参照用
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)
End Sub
↑とにかくコレを貼り付けて実行してみてください。

↓IEの起動は、ここの解説がはじめの一歩として、わかりやすいと思う。
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/mar06/hey0313.mspx
↑イロイロなサイズを指定して起動できたりするみたい。

過去のメルマガ参考記事:[IE起動 CreateObject("InternetExplorer.application")]
フォームにオブジェクトを貼った例:[フォームにIEのコントロールを貼る]←みたいなこともできます。

サンプルを走らせながらが一番いいのかなぁ? マニュアルや調査することも非常に大切なのですが、入り口で挫折しないためには、楽しくなくっちゃ???
サンプルを見ながら動かしていけば、なんとなく感覚がつかめてくるので、あとはエラー処理を含めた丁寧なプログラムを組んでいく、そんな感じがいいのでは???

過去の解説はこちら→[過去の解説 vba_ie20070520.asp]もあわせてみてください。
ここから↓新しく書き直した解説です。(↑もしかして書き直さない方がよかった(笑))

指定したURLを開き、データをセット後、ボタンを押したい

インターネットエクスプローラーの操作と一口に言ってもイロイロな操作があると思います。
そのうちの一つが、あるホームページ(URL)を表示して、フォームにデータをセットして登録ボタンを押す、この一連の流れを自動で行いたい・・・と日本語で書くのは簡単なんだけど、この流れをプログラムで記述しないとなぁ。先は長いかなぁ。
サンプル IETEST002.XLS→[http://ken3-info.blog.ocn.ne.jp/zip/IETEST002.zip]をzipを保存後、解凍して、テストしながら、下記の解説を読んでみてください。

URLを開く(.open)じゃなくって、.Navigateなんですよ

CreateObject("InternetExplorer.application")なんて感じで、無事にIEのオブジェクトを作成できたら、次は指定したURLを開きたいですよね。
まぁ、文章でもなんでもたいていは開く処理が必要ですよね。

Workbooks.Open Filename みたいに.Open?
それとも、.URLOpen?
ハヤク、IEでURLを開くメソッドを教えろコラ!!

アナタ、先走りますねぇ、想像力豊かでガマン汁出てるよ(オイオイ)じゃなくって、メソッドの名前を勝手に.URLOpenとか創造するなんて先走り過ぎ。※まぁ、予測・予想する能力もプログラマーとしてはとても大切で必要なんですが・・・([愚痴系 No.181 TimeAddって関数を予想する力? ]を暇な時にでも読んでみてください)

感覚は文章やブックを開く感覚でURLを開くOpenなのですが、URLを開く命令は.Navigateです。
objIE.Navigate URLの文字列 って感じです。
私のブログ[http://ken3-info.blog.ocn.ne.jp/]を開く(飛ばす)には、
下記のような命令を書きます。(と言っても1行追加するだけですが)
Sub ie_test_Navigate()

    Dim objIE    As Object  'IEオブジェクト参照用
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定した文字列のURLを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/"

End Sub
ねっ、簡単に目的のURLを開くことができたでしょ。
あとは、ここから、データをセットしたり、表示されているデータを自動で抜いたり、イロイロと操作の入り口に先っぽが入ったのかなぁ。(入り口が狭くて中が広い?○スポットは??まだまだ、奥が深いんだけど・・・?)
なんて、くだらないこと言ってないで、 英語だけどMSDNの下記の項目を見るとIEの動作(メソッド)が載っているとと思います。
InternetExplorer Object [http://msdn2.microsoft.com/en-us/library/aa752084.aspx] が 一覧で、その 下に、
.Navigate [http://msdn2.microsoft.com/en-us/library/aa752093.aspx]などが載ってます

IEのdocumentオブジェクト formを使ってhtml入力フォームにアクセスしてみた

指定したURLを開くことができたので、次はデータをセットしてみたいと思います。
試しに作ったフォーム、[http://ken3-info.blog.ocn.ne.jp/test/2007/05/post_4291_1.html]← の感想エリアにデータをセットしてみます。

まず、html内のソースを表示して<form>の中身を確認します。
いきなり、中身とかソースとか言われてもなぁ・・・頭の中?だらけだよ。
あっ、すいません、自分だけわかってて相手のこと考えて無くて。
目的の入力フォームの構造が知りたいので、目的のページを表示後、
表示--ソースとするとhtmlやcgiの中身を手作業ですが確認できます。
[ソースの確認画面イメージ]

テスト用のhtmlを確認すると、

<FORM ACTION="http://www.ken3.org/cgi-bin/test/test029-3.asp" METHOD="POST">

<b>感想:</b>
<INPUT TYPE="TEXT" NAME="MEMO" SIZE=20><br>

<b>メルマガ区分選択:</b><br>
<INPUT TYPE="RADIO" NAME="KUBUN" VALUE="ASP">三流君ASPで遊ぶ<br>
<INPUT TYPE="RADIO" NAME="KUBUN" VALUE="VBA" CHECKED>三流君VBAで楽しく<br>
<INPUT TYPE="RADIO" NAME="KUBUN" VALUE="GUCHI">プログラマー愚痴<br>

<INPUT TYPE="HIDDEN" NAME="NO" VALUE="0">

<INPUT TYPE="SUBMIT" VALUE="書 込">
<INPUT TYPE="RESET" VALUE="クリア">
</FORM>
<hr>

と入力用のhtmlフォームが作られています。

今回のテストでは、感想にデータを入力してみたいと思います。
入力したいinputエリアは、
<INPUT TYPE="TEXT" NAME="MEMO" SIZE=20><br>
の部分です。 name=XXXX(NAME="MEMO")と定義されてます。
このnameを利用してオブジェクトを表現するには、どうするのだろう?

とその前に、一呼吸おいて、
Excelのブック・シート・セルへデータをセットする場合、下記のように
シート--範囲
Sheets("Sheet2").Range("B3") = "B列3行目です"

シート--セル(y,x)
Sheets("Sheet3").Cells(5, 4) = "y,x 5行目の4列です"
Sheets(シート名).Rangeや.Cellsでオブジェクトへアクセスしていると思います。 Htmlの入力フォームの場合、オブジェクトの階層構造が
IEアプリ--ドキュメント--フォーム--アイテム(項目)
で表すことができるので(ほかにも表現方法はあるのですが今回はこれで)
objIE.Document.Forms(0).Item("MEMO").Value = 値
htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する。って感じです。
下記のようなプログラムでデータをセットすることができます
Sub ie_test_data_set()

    Dim objIE    As Object  'IEオブジェクト参照用
    Dim time5    As Date    '5秒待ちに使う。

    Dim strCOMMENT As String  'コメントの入力
    
    'INPUTBOXでデータをもらう
    strCOMMENT = InputBox("Ken3へ一言?", "", "" & Now)
    Application.WindowState = xlMinimized  '入力後Excelを最小化、下に下げる

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/05/post_4291_1.html"
    
    '手抜きで5秒待つ(読み込み待ちを単純に5秒とする)
    time5 = DateAdd("s", 5, Now()) '5秒後を計算する
    Do While True  '無限ループ
        DoEvents
        If time5 < Now() Then Exit Do  '5秒後に抜ける
    Loop
    
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する。
    objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENT
    
End Sub
ポイントは、
Excelなら、アプリ -- ブック(Book) -- シート(Sheet) -- セル(Cells)
のオブジェクト階層が、
アプリ -- html(Document) -- フォーム(Form) -- 入力エリア(A INPUT)
objIE.Document.Forms(0).Item("MEMO").Value
みたいな感じです。
読者の声:なんとなくわかってきたけど、意味不明な処理が1つあるよ。なんで5秒待ってるの??
あっ、これですか・・表示待ちを入れないとオブジェクトの展開処理が間に合わないみたいで、いきなりobjIE.Documentにさわりにいくと実行時エラー Document メソッドは失敗しました ・・・とエラーになるんですよ。
エラーの画像→[http://ken3-info.blog.ocn.ne.jp/screen/2007/05/ie__debe.html]
なので、objIE.Navigate 後に相手の準備ができる時間を与えてます。。。
※数をこなしていくと感覚がわかると思います。
※※過去のメルマガ→[VBAからIE操作 NAMEが同じフォームの項目へデータをセットする]も見てください

おっと、英語だけどMSDNの下記の項目を見るとオブジェクトの階層構造がわかりやすいと思います。
Reference for Visual Basic Developers [http://msdn2.microsoft.com/en-us/library/aa752043.aspx] が 一覧で、その 下に、
document Object [http://msdn2.microsoft.com/en-us/library/ms531073.aspx] をクリック 後に、
Collections を探っていくと、
forms Collection [http://msdn2.microsoft.com/en-us/library/ms537457.aspx] オブジェクトがあります。

.Submit メソッドを使って フォームの送信動作

データをフォームにセットできたら、次は、送信ボタン(投稿)を押したいですよね・・・
FORM Element | form Object [http://msdn2.microsoft.com/en-us/library/ms535249.aspx]
のメソッドの中に
submit [http://msdn2.microsoft.com/en-us/library/ms536771.aspx] があります。
単純に該当フォームを.Submitでできちゃったりするんですよ。
※オブジェクト.動作(メソッド) ってイメージかなぁ。

objIE.Document.Forms(0).Submit
こんな1行を入れてテストしてください。(下記、ほとんど同じだけど・・・)
ie_test_form_submit()

    Dim objIE    As Object  'IEオブジェクト参照用
    Dim time5    As Date    '5秒待ちに使う。

    Dim strCOMMENT As String  'コメントの入力
    
    'INPUTBOXでデータをもらう
    strCOMMENT = InputBox("Ken3へ一言?", "", "" & Now)
    Application.WindowState = xlMinimized  '入力後Excelを最小化、下に下げる

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/05/post_4291_1.html"
    
    '手抜きで5秒待つ(読み込み待ちを単純に5秒とする)
    time5 = DateAdd("s", 5, Now()) '5秒後を計算する
    Do While True  '無限ループ
        DoEvents
        If time5 < Now() Then Exit Do  '5秒後に抜ける
    Loop
    
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する。
    objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENT
    
    'フォーム(0番目)を .Submit する
    objIE.Document.Forms(0).Submit   '送信処理

End Sub
※過去のメルマガ→[VBAからIE操作 .document.forms(0).Submit でフォーム送信処理]も見て参考となれば・・・

.Busy = True の間、読み込み完了を待ってみる

上のデータセットのサンプル、回線の状態(オフラインとか)やテストで使用しているocn blogの反応が鈍いとエラーになるよね。。。
※5秒以上待っても表示が終わらないときなど

手抜きで、5秒待つ・・・とか言ってるけど、5秒ぐらいじゃ準備不足でエラーになる場合が多いよ。※特にオフラインでADSL回線からつなげに行くと初回5秒で読み込み完了にならないよ。

じゃ、余裕を見て、倍の10秒待ってみたら?相手のサイトによって待つ時間を工夫してくださいね。
オイオイ、本気かよその回答?

自分勝手に挿入(データを)するんじゃなくて、相手が準備OKが確認してから入れろよ(データを)。イタイだろ、わかったかボケ。この、2秒だとか、5秒待ちとか言ってる○○野郎。

まぁ、まぁ、サンプルを走らせて、オブジェクトが見つからないとエラー画面が表示されたからって興奮しないでよみんな。
確かに相手の準備時間が状況によって変わる、そんな時、ありますよね。
ってことで、相手の状態を少し見て(プロパティを見て)、読み込み完了、準備OKを待ってみたいと思います。

前置きが長かったけど、そんな時に便利なのが、
.Busy プロパティかなぁ→[http://msdn2.microsoft.com/en-us/library/aa752050.aspx]

Busy(忙しい?) True→忙しい、動いてる False→ヒマ、止まっている
単純に、objIE.Busy = Trueの間、ループで待ってみました。
Sub ie_test_busy()

    Dim objIE      As Object 'IEオブジェクト参照用
    Dim strCOMMENT As String 'コメントの入力
    
    'INPUTBOXでデータをもらう
    strCOMMENT = InputBox("Ken3へ一言?", "", "" & Now)
    Application.WindowState = xlMinimized  '入力後Excelを最小化、下に下げる

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/05/post_4291_1.html"
    
    '表示終了まで待つ .Busy(忙しい)間ループ
    Do While objIE.Busy = True
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する。
    objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENT

    'フォーム(0番目)を .Submit する
    objIE.Document.Forms(0).Submit   '送信処理

End Sub

まぁ、この objIE.Busy = True だけじゃ、ダメな時も多々あるんだけど・・・
どんな時だよ、もったいぶりやがって、、、

.ReadyState = 4 (READYSTATE_COMPLETE) を みる

objIE.Busy = True だと 広告やフレームを読み込んだ時にFalseになってしまう。 ※[No.116 InternetExplorer操作 Frameと遊ぶ Objectを探る方法 ]←の記事の一番下、フィードバックにフレームを使用したhtmlを操作する質問があって気が付いたんだけど・・・

この問題(実際に読み込み中なのに.BusyがFalseになる)を解決したいので、

'.ReadyState = READYSTATE_COMPLETE
    Do While objIE.ReadyState <> 4 '4の完了以外ループ
        '何もしないループ(笑)
        DoEvents
    Loop
と、.ReadyState で 判断している 場合もあります。(判断する必要があったりします)

.ReadyStateで判断はいいとして、4ってなに???
あっ、スイマセン、
MSDNの[.ReadyState]←を見ると、
Enum READYSTATE
    READYSTATE_UNINITIALIZED = 0
    READYSTATE_LOADING = 1
    READYSTATE_LOADED = 2
    READYSTATE_INTERACTIVE = 3
    READYSTATE_COMPLETE = 4
End Enum

と、定義されています。参照設定していないので、objIE.ReadyState <> 4と直接値の4を書いてますが、objIE.ReadyState <> READYSTATE_COMPLETEと書くときれいです。

Debug.Printを大量に入れ、下記のようにテストしてみました。
Sub ie_test_ReadyState()  '.ReadyStateのテスト

    Dim objIE      As Object  'IEオブジェクト参照用
    Dim strCOMMENT As String  'コメントの入力
    Dim nFLG       As Integer 'テスト用のフラグ
    
    'INPUTBOXでデータをもらう
    strCOMMENT = InputBox("何か一言コメントを入れてください")
    If strCOMMENT = "" Then
        MsgBox "何か文字を入れてくださいね"
        Exit Sub  '途中で抜ける
    End If
    Application.WindowState = xlMinimized  '入力後Excelを最小化、下に下げる

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    Debug.Print "IE起動しました(.Navigate前)"  'デバッグで文字を書く
    Debug.Print ".Busy = " & objIE.Busy
    Debug.Print ".ReadyState = " & objIE.ReadyState

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/05/post_4291_1.html"
    
    Debug.Print "指定したURLへ移動中(.Navigate直後)"  'デバッグで文字を書く
    Debug.Print ".Busy = " & objIE.Busy
    Debug.Print ".ReadyState = " & objIE.ReadyState
    
    '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ループ
    Debug.Print "これからループに入ります"
    nFLG = 999  'テスト用のフラグを999で初期化する。
    Do While objIE.Busy = True And objIE.ReadyState <> 4
        If objIE.ReadyState <> nFLG Then  '前回の状態と違うか判断
            Debug.Print ".Busy = " & objIE.Busy  'デバッグで文字を書く
            Debug.Print ".ReadyState = " & objIE.ReadyState
            nFLG = objIE.ReadyState  'フラグに今の状態を代入する
        End If
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    
    Debug.Print "ループを出ました"
    Debug.Print ".Busy = " & objIE.Busy  'デバッグで文字を書く
    Debug.Print ".ReadyState = " & objIE.ReadyState
    
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する。
    objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENT
    
    'フォーム(0番目)を .Submit する
    objIE.Document.Forms(0).Submit   '送信処理
End Sub

デバッグで出力された文字を見ると、
IE起動しました(.Navigate前)
.Busy = False
.ReadyState = 0
指定したURLへ移動中(.Navigate直後)
.Busy = True
.ReadyState = 1
これからループに入ります
.Busy = True
.ReadyState = 1
.Busy = True
.ReadyState = 3
ループを出ました
.Busy = False
.ReadyState = 4

と出力されてます、.ReadyState = 2 が無いのが気になりますが、.ReadyStateを見て判断するのもひとつの手ですね。※えっ、テストになってないだろって?※※本当のテストはフレームページや広告のページを使って、.Busy = FalseでもReadyStateが読み込み中の場合を示さないとテストの意味が無いって?厳しいなぁ・・・

んっ?
objIE.Busy = True And objIE.ReadyState <> 4
って、なんかおかしくない?
ループの条件が、objIE.Busy = Flaseになったら、左側の条件がくずれない?
(右側が4以外でも、ループを抜けない??)
objIE.Busy <> False Or objIE.ReadyState <> 4
でしょ???↑皆さんも注意してくださいね・・・

だから不完全なテストはマズイんだって・・・と思ったところで、
あまりいじめないで下さいよ(でも、いじるのはOK?イジメとイジリの微妙な違いがイマイチわからないが)

空白ページから タイトルの変化 .Document.Title を みる

ステータスの変化で完了をみていましたが、同様にタイトルの変化で完了をみてみます。※なんか、我流で邪道を丸出しですが・・
objIE.Navigate "about:blank" で 空白のページを表示させてから、
Do While objIE.Document.Title = "" で タイトルが変化するまでループしてます。小細工のニオイがプンプンしますが、こんな方法もあるってことで、、、
Sub ie_test_Document_TITLE()  'Document.TITLEのテスト

    Dim objIE      As Object  'IEオブジェクト参照用
    Dim strCOMMENT As String  'コメントの入力
    
    'INPUTBOXでデータをもらう
    strCOMMENT = InputBox("何か一言コメントを入れてください")
    If strCOMMENT = "" Then
        MsgBox "何か文字を入れてくださいね"
        Exit Sub  '途中で抜ける
    End If
    Application.WindowState = xlMinimized  '入力後Excelを最小化、下に下げる

    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)
    objIE.Navigate "about:blank"  '空白のページへ移動 初期化のつもり(笑)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/05/post_4291_1.html"
    
    Do While objIE.Document.Title = ""   'タイトルが変わったらループを抜ける
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する。
    objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENT
    
    'フォーム(0番目)を .Submit する
    objIE.Document.Forms(0).Submit   '送信処理
End Sub

ここまでのサンプル IETEST002.XLS→[http://ken3-info.blog.ocn.ne.jp/zip/IETEST002.zip]をzipを保存後、解凍して、テストしてみてください。

※まだまだ、書きかけ、内容をまとめていく予定・・・


チョット、はじめの一歩が長すぎましたね。ここからドキュメントの探りやプロパティ、メソッド、イベント・・・と先は長いんだけど。


ken3.org 掲示板の過去LOG→:[保存された過去ログを見る]

作者に感想・質問/要望を送る(気軽に質問・感想書いてください)
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい

探り方?

ヘルプはどこにあるの?三流なのにどうやって資料を探しどこで勉強したの?
と、質問をいただきます。

やはり本家、microsoft.comやよく聞く?MSDNを探ってみるのも・・・(あまり深く見ると楽しむ前に挫折しかかるので、下記はほどほどに・・・)

WebBrowser Control -- Reference for Visual Basic Developers
http://msdn2.microsoft.com/en-us/library/Aa752043.aspx

WebBrowser Object
http://msdn2.microsoft.com/en-us/library/Aa752085.aspx

アクセス可能な HTML 要素
http://www.microsoft.com/japan/msdn/workshop/author/access/accessibility.aspx#acc_elements
この辺りから1つ1つ探っていくのもアリかなぁ・・・

Internet Explorer (Programming)
http://support.microsoft.com/iep

上記は英語だから・・・ツライけど。 読者の心の声:だったらテメエがわかりやすく翻訳したり説明しろよボケ
[後輩に追い越される三流な先輩]←こんな感じで後から来た皆さんに追い越されまくり(笑)


お時間がある時に私の書いた、ココから下のサンプルや過去のメルマがのリンク先を見て笑ってください。

検索エンジンやリンクから、せっかく私のサイトに来ていただいたのですが、下記2つの検索結果がかなり参考になったり・・・するのでは???
[IE 魔界の]2つをキーワードにしてGoogleで検索する
(↑かなりの確立で有効な回答が得られると思います、先輩方の回答を見ると謎が解けると思います。私もすらっと回答できる、そんな人になりたいですね。。。)
↓あとは、パターン的にobjIEと変数名を定義している人が多いので、
[objIE]をキーワードにしてGoogleで検索する
も有効かなぁ。※短いサンプルなどが見つかり、参考となるのでは?

あとは、[InternetExplorer.application]をキーワードにしてマイクロソフト内検索する
などなど・・・

↑1歩1歩独自で進めたい人はこんな感じで、実際のプログラムを見ながら進めるのがいいと思います。
※また、BBSやMLの空気を読んで(過去ログも読んで)、上級者がいらっしゃる掲示板に質問を投げてみるのもひとつの手です。
検索に迷ったら(IE操作の道に迷ったら)、objIEInternetExplorer.application をキーワードにGoogleやYahooで探ってみてください。


不思議なIEお嬢様、まだまだ攻略できそうにないよね。
えっ、Excel姫やAccessお姉さまも攻略して無いダロって?
※う〜ん、実力無くて、なかなか、攻略できなくて。。。。
何かの参考となれば幸いです。


メルマガ関連項目のリンクと概要

概要を見て、これは?と思ったら、タイトルをクリックして本文を読んでください

※ココから下のサンプル、XP+IE7やVistaの最新環境では動きません、XP+IE6の1つ前の古い環境だと動きます。対策などがわかったら、また書き込みます
読者より、↓下記のサイトを勧めていただきました
7.1 IEオブジェクトを作る(IE7編)
↑IE7のオブジェクトの作り方が丁寧に書いてありました。
※私もザボってないで、がんばらねば・・・
※※あと、毎日のようにIE操作はUWSCを使え とメッセージをいただくので、IE操作の人はUWSCもググってみては??
[No.71 IE操作 リンク先を取出す .Document.links(i).href]
.Documentオブジェクトのリンクを探り、
.href .outertext .outerHTML を使ってみました。

関連リンク 2008/02/04: [三流君CODEのゴミ箱: VBA IE操作 リンクの取り出し と ダウンロード IE6+Excel2003] ←ダウンロードとの組み合わせとサンプルファイルです。サンプルにキレがないけど こちらも合わせてみてください

[No.97 InternetExplorer.application操作 .Clickでクリック] データをフォームに objIE.document.all.userid.Value = "Ken3" 'ユーザー名 objIE.document.all.pass.Value = "aaa" 'パスワード でセットして、その後、 objIE.document.all.btn01.Click 'クリックメソッドを実行 単純にクリックメソッドを実行して、自動ログイン処理を作成しました。 [No.105 VBAからIE操作 .document.forms(0).Submit でフォーム送信処理] ボタンに名前が付けられていないと、.Clickが使いにくかったので、 .document.forms(0).Submit を使用して、ファームの送信ボタンを押しました。 [No.108 IE アプリケーションのイベントを横取りする] Dim WithEvents IE As InternetExplorer と WithEventsキーワードを使って、 IE_NewWindow2(ppDisp As Object, Cancel As Boolean) と書き、IEのイベントに対して、処理を書いてみました。 テストで下記のようなダウンロード終了時に発生するイベントを書いてみました。 Private Sub WebBrowser0_DocumentComplete(ByVal pDisp As Object, URL As Variant) 'タイトルの代入 Me![txtTITLE] = Me.WebBrowser0.Document.Title 'HTMLの代入 Me![txtHTML] = Me.WebBrowser0.Document.body.innerhtml End Sub [No.110 IE SELECTタグ OPTIONを選択する.Document.all(n).Selected=True] .Document.all(n).Selected=Trueを使用して、 フォーム内のSELECT タグのOPTIONを選択してみました。 [No.112 IE 操作 .ExecWB でコマンド実行(検索したかったけど)] IEの機能(ボタン)を使いたかったので、.ExecWBを探りました。 検索コマンドがうまく行かなかったので、SendKeysで逃げました・・・・ [No.116 InternetExplorer操作 Frameと遊ぶ Objectを探る方法] F2のオブジェクトブラウザを使って、Frameを探り、 フレーム分割された画面に対して、データをセットしてみました。 objIE.Document.frames("F_RIGHT").Document.all("userid").Value = "Ken3" とフレーム関係を探ってみました。 [No.117 InternetExplorer操作 .Silentを使用したけど....] JavaScriptのalert警告メッセージを表示したくなかったので、 .Silent=Trueを使用したが、うまく行かなかった話です。 ※逃げ手(代替案)も成果も無いメルマガでした。(笑) [No.118 Microsoft Web Browser コントロールをフォームに貼る] Microsoft Web Browser コントロールをフォームに貼る手順の解説です。 たんに挿入、ActiveXコントロール、と順に選ぶだけです(簡単です) [No.119 IEを使用して、Web上の表をExcelへ] TABLEのタグから階層的にTR,TDのタグを取り出し、 Web上の表データをExcelに転記しました。 タグはタグの集合体、そんな階層イメージがわかればOKです。 [No.120 URLDownloadToFile APIを使用してダウンロードしてみた] URLDownloadToFile APIを使用して、 Web上のリンク先のデータをダウンロードしてみました。 (右クリック、保存の自動化にチャレンジしてみました) [No.124 IE _BeforeNavigate2イベントでPostデータを覗き見する] _BeforeNavigate2、次のURLへ移る前のイベントで、 PostDataをチェックしてみました。 [No.148 IE ラジオボタン(RADIO)の.Checkedと.Clickの違い] INPUT Type=RADIO(ラジオボタン)のオブジェクトに対して、 .Checkedだとイベントが起動しないが、 .ClickだとonClickのイベントが起動する、 そんな違いの話を少し書いてます。 [No.154 IE SELECTタグの選択 .SelectedIndex=nで選択] objIE.Document.all.Ken.SelectedIndex = 5 objIE.Document.all.kansou.SelectedIndex = 2 など、.SelectedIndexでSELECTタグの項目を選択してみた。 [No.155 IE SELECT後 .fireEventでJavaScriptのイベントを起動] fireEvent --- Fires a specified event on the object. (オブジェクトに指定された出来事を発砲します。) なんてのがあって、 '選択後にonchangeのイベントを発生させる objIE.Document.all.JYO.fireEvent ("onchange") として、JavaScriptのonchangeイベントを発生させました。 [No.156 TypeNameとShell.Applicationを使い起動済みのIEを探す] 'シェルのオブジェクトを作成する Set objShell = CreateObject("Shell.Application") ここから、ウインドウの数だけまわし、起動中のIEを探してみました。 For Each objWindow In objShell.Windows Debug.Print "タイプは:" & TypeName(objWindow.document) 'HTMLDocumentだったら If TypeName(objWindow.document) = "HTMLDocument" Then 'オブジェクトを代入する Set objIE = objWindow nFLG = True '見つけたよ Exit For '初めに見つけたオブジェクトを代入 End If Next [No.157 IE Element の 我流な探し方(AS Objectはキライ)] TypeNameを使い、 'データをループする For Each objTAG In objIE.document.all Debug.Print objTAG.tagName & ":" & TypeName(objTAG) Cells(yline, "A") = objTAG.tagName Cells(yline, "B") = TypeName(objTAG) Cells(yline, "C") = objTAG.innerHTML yline = yline + 1 Next ループさせて、オブジェクトのタイプを探ってみました。 B:HTMLPhraseElement BR:HTMLBRElement A:HTMLAnchorElement とかいろいろとあるみたいです。 [No.159 IE 認証ページへのアクセス、basci認証ページって?] ヘッダーに "Authorization: Basic bWFpbG1hZ2E6Z3Vlc3Q=" と基本認証のコードを埋め込み、Basic認証のページをIEで開いてみました。 'テスト用の認証ページに飛ぶ Const strURL = "http://www.kurokiya.sake-ten.jp/zzz/" Const strHEAD = "Authorization: Basic bWFpbG1hZ2E6Z3Vlc3Q= " & vbCrLf objIE.navigate2 strURL, , , , strHEAD たんにヘッダーで送っているだけです。 [No.162 IE データセット後、JavaScriptを起動する] IEのJavaScriptの起動方法ですが、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Me.WebBrowser1.Document.scripts(n) とか、scriptsがスクリプトオブジェクトだから、 これを.RUNとかないかなぁと探ってみましたが、 目的の処理が見つかりませんでした。 <a href = "JavaScript:parts('B')">〜 とリンクになっているから、それだったら、 .Navigate2 "JavaScript:parts('B')" でOKなのか?って発想でテスト実行してみました。 [No.163 IE _NewWindow2 別窓で開いたオブジェクトの管理] Dim WithEvents objNEW_IE As InternetExplorer でオブジェクト変数を定義して_NewWindow2で新規IEを作成、 Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean) Set objNEW_IE = CreateObject("InternetExplorer.Application") Set ppDisp = objNEW_IE '作ったオブジェクトを代入 objNEW_IE.Visible = True End Sub 下記のように、作成したIEのイベント(ここでは読み込み完了)で処理したサンプルです Private Sub objNEW_IE_DocumentComplete(ByVal pDisp As Object, URL As Variant) MsgBox "あたらしく開かれたURLは" & URL End Sub [No.164 IE .getElementsByTagNameでタグ指定 .Quitで閉じる] .getElementsByTagName("タグの名前") で指定したオブジェクトを取得できます。 新規ウインドウに表示された広告コードなどTEXTAREAのタグを .getElementsByTagName("TEXTAREA") で取り出し処理を行い、その後、.Quitで新規に開いたIEを閉じました。 [No.167 amazonの広告コード UTF-8を探る(keywordを作る) ] IE操作にはあまり関係ないのですが、 amazonの広告コード UTF-8でkeywordを作ってみました。 ※SJISをUTF-8に変換してみました。 [No.170 IE Aタグのリンク先を.Click(クリック)してみた] フレームの先のJavaScriptの起動ができなくて、 苦肉の策で Dim objFDOC As Object 'フレームのドキュメントを保存する Set objFDOC = objIE.Document.frames("F_RIGHT").Document '代入 'リンク情報からオブジェクトを探し.Clickする For n = 0 To objFDOC.links.Length - 1 'リンク数分まわす Debug.Print objFDOC.links(n).href 'デバックで表示する 'リンク先(.href)をチェックする(文字列比較する) If objFDOC.links(n).href = "javascript:gonumber();" Then objFDOC.links(n).Click '.Clickでクリックしてみた Exit For '見つかったので強制的にループを抜ける End If Next n と、フレームの先のリンク先オブジェクトを探して.Click(クリック)して逃げました。 [No.175 IE .Navigate about:blankで空白ページ表示 禁断の制御文GOTO文] objIE.Navigate "about:blank" で空白のページを表示してから、 正常に移動されなかったら、禁断の制御文?GoTo文を使って再度読み込みに行く、 そんなサンプルです。(あまりキレがないけど) [No.176 VBAからIE操作 NAMEが同じフォームの項目へデータをセットする] 同じ名前が存在する時、.allで探すとエラーになるので、 objIE.document.all.q(0).Value = "golf" 'document.all.q(0)をテスト や objIE.document.all("q")(1).Value = "auto" 'document.all("q")(1)をテスト でセットして遊んでみました。 ラジオボタンの操作の時、 '上から3番目のGUCHIをチェック(2)の.CheckedをTrueにする objIE.document.Forms(0).kubun(2).Checked = True 'セレクト状態をtrueにする や '下記でもOKです.all("kubun")(2)を操作する 'objIE.document.all("kubun")(2).Checked = True 'セレクト状態をtrueにする が使えたので、場面によっては楽かなぁ??? [No.177 VBAからIE操作 TABLEの中にTABLE .getElementsByTagNameほか] サンプルは株価の表で、TABLEが2重になってました。 そのテーブルを、 '.document から.getElementsByTagName("TABLE")でオブジェクトを取り出す For Each objTAG In objIE.document.getElementsByTagName("TABLE") 'TABLEの中、テキスト文字で[終値]があるか、子TABLEは無しかチェック If InStr(objTAG.InnerText, "終値") > 0 _ なんて感じで識別して、取り込んでみました。

最近発売の雑誌を紹介する

パソコン雑誌です。息抜きや空いた時間に読んで見ては?
  1. MdN (エムディーエヌ) 2008年 06月号
  2. DTM MAGAZINE 2008年 06月号
  3. 日経 Linux (リナックス) 2008年 06月号
  4. ネトラン 6月号 【雑誌】
  5. Design Wave MAGAZINE (デザイン ウェーブ マガジン) 2008年 06月号
  6. ケータイスペシャル 2008年 06月号

中刷り広告???(オイオイ)

読者からのお勧め本。私はまだ購入していないのですが、下記の
[自動売買ロボット作成マニュアル~エクセルで理想のシステムトレード]
が参考になった三流君も見習って株のソフトを作ってくださいと多数(と言っても3人)に言われました。
株の自動売買ソフトかぁ・・・みなさん夢がありますね。。。
※追加情報(2006/11/08)、各証券会社にあわせたVBA IEコントロールの発注方法などは載っていないみたいです。本を買っただけではわからない・・と読者からお叱りを受けました。
※※メールで送られてくる質問の多数は株と競馬の自動データ処理なので、新たに解説ページを別で作ろうかなぁ・・・と思いつつ、具体的な予定は無かったり・・・はやく動き出せ、動けよコラ、三流プログラマーはこれだから と 自分自身に言ってみた。

読者からのお勧め本その2私はまだ購入していないのですが(またカヨ)、下記の
[VBAマクロで作る株式自動売買プログラム(仮)]
のタイトルが気になったので三流君も買ってみたら?と言われました(と言っても1 人ですが、、)
たしかに、タイトルに惹かれますね。あとは中身のチェックかな。
※じゃなくって、ポツポツIEを使った自動処理の本が出ているってことは、私は波に乗り遅れたかなぁ、、、今から証券口座を申し込んで作成を始めても遅いか。(そもそも、今から勉強して素人が株デビューするには時期が悪い?それとも?)

ページフッター(リンクなど)

[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・


2008/05/12 19:59:37