[VBAでIE操作(TOP)]
[IE関係記事一覧]
[IE関係ブクマ]
[三流君(TOP)]
[VBA(TOP)]
はじめは[WebBrowserを参照設定]から入り
小さな[IE操作のサンプル]でTEST
次に[少し大きなIEを使ったサンプル]
にチャレンジしたり
手探りで[ヘルプ IEのオブジェクトを探る]←迷ってみたり
よく使う.Document:の解説
[.Forms]で入力処理
[.Links]でリンク情報取得
[.Images]で画像の情報
[.Frames]でフレーム処理
[.Script]でスクリプト処理
IE,WebBrowser:
[IE プロパティ(各種設定)]
[IE メソッド(イロイロな動作)]
[IE イベント(発生後処理)]


三流君VBAでIE操作 2008-05-01 履歴として残す

2008/05/01 までに書いた IE関係の記事です。あと少ししたらIE8になるのに?IE6+XPがメインの記事です・・・(IE7を攻略する前にIE8になっちゃったりして・・・)
現在の最新解説は、
http://www.ken3.org/cgi-bin/group/vba_ie.asp
↑を見てください。

2008/05/01 の記事

VBAで(ExcelやAccessなどから)IEを操作してみたいと思います。
操作方法の入り口として何かの参考・お役に立てれば幸いです。

※ココから下のサンプル、XP+IE6の1つ前の古い環境で作成したメルマガです。そのまま動かない場合もありますが、何かの参考となれば幸いです。
読者様より、IE7対応で↓下記のサイトを勧めていただきました
www.happy2-island.com 7.1 IEオブジェクトを作る(IE7編)
↑IE7のオブジェクトの対応が丁寧に書いてありました。VBSだけど参考になると思います
※あと、毎日のようにIE操作はUWSCを使え とメッセージをいただくので、IE操作の人はUWSCもググってみては??
※※私もザボってないで、がんばらねば・・・ってことでやっと三流的なIE7対応方法として[Vista IE7対応に入る(ExcelのUserFormにIEコントロールを貼る)]をUPしました(2008/05/24)IE8の背中が見えてきたのに遅すぎ(ゴメンなさい)

XP + IE6 の サンプル

インターネットエクスプローラーの操作と一口に言ってもイロイロな操作があると思います。
そのうちの一つが、あるホームページ(URL)を表示して、フォームにデータをセットして登録ボタンを押す、この一連の流れを自動で行いたい・・・と日本語で書くのは簡単なんだけど、この流れをプログラムで記述してみたいと思います

初めの一歩・とっかかりとして、
試しに作ったフォーム、[http://ken3-info.blog.ocn.ne.jp/test/2007/05/post_4291_1.html]← の感想エリアにデータをセットしてみます。
↓下記、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フォームが作られています。

この入力フォームの感想エリアにデータをセットしてみたいと思います。

事前準備

VBAから、IEを操作する・・・と簡単に書いてますが、まずは事前準備から。
深呼吸して心を落ちつかせます(ウソ)
初めは、操作したいホームページを自分で(手作業で)操作して、処理のイメージをつかみます。
今回のターゲット → [http://ken3-info.blog.ocn.ne.jp/test/2007/05/post_4291_1.html]を開いて、手動でデータを入力したり、ボタンを押して、動きをチェックします

手動で操作のイメージをつかんだら、
次に、html内のソースを表示して<form>の中身を確認します。
いきなり、中身とかソースとか言われてもなぁ・・・頭の中?だらけだよ。
あっ、すいません、自分だけわかってて相手のこと考えて無くて。
目的の入力フォームの構造が知りたいので、目的のページを表示後、
表示--ソースとするとhtmlやcgiの中身を手作業ですが確認できます。
[ソースの確認画面イメージ] ← 単純にIEのメニューから表示させているだけですが
※↑フレームやJavaScriptで細工されたページ、文字コードが違って化け文字になっている・・・など簡単に表示できない場合もありますが

繰り返すと、
・手作業で自動化したい操作を行ってみる。
・ソースを表示して、入力フォームや構造のチェックに使う準備をする
まずは、この2点です。

データセットとデータ送信(Submitボタン)のサンプル

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

と、三流解説者がやり易い方法で解説を進めます(読者の立場は無視かよ???)

下記がデータセットのサンプルプログラムです(いきなりカヨ)
Sub ie_test_DATASET()  'データセット後 Submitボタンを押す

    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 '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/05/post_4291_1.html"
    
    '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ループ
    Do While objIE.Busy = True
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
        DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop
    
    'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する。
    objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENT
    
    'フォーム(0番目)を .Submit する
    objIE.Document.Forms(0).Submit   '送信処理
End Sub
サンプル IETEST003.XLS→[http://ken3-info.blog.ocn.ne.jp/zip/IETEST003.zip]を保存後、zipを解凍して、テストしながら、下記の解説を読んでみてください。
いきなり、サンプルを掲載して、みなさん?マークだと思いますが、ポイントを1つ1つ書いていきます。

手作業の操作を忘れずに・・・

手動で操作した時の操作を今一度思い出してください。
まず、コンピュータの電源を入れて、ログインする(ここからやるのカ?)
・インターネットエクスプローラーを起動して、
・URLを入力(ショートカットやお気に入りの人も居るかなぁ)
・入力フォーム(画面の表示)を確認
・マウスやキーボードを使ってデータを入力したり選択する。(データの入力)
・送信ボタン を 押す
だいたいこんな感じかな。
わかってんだよ、しつこいなぁ、ハヤク コードの解説始めろよ※クドクてシツコイ男は嫌われるぞ

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
↑とにかくコレを貼り付けて実行してみてください。
CreateObject("InternetExplorer.application")でIEを起動させobjIEの変数に代入して、objIE.Visible = True 他のVBAでもおなじみの.VisibleプロパティをTrueにしてます。
読者の声:一言で言えよ、起動して可視(見えるように)しただけだろ。

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を開くことができたでしょ。
読者の声:だから一言で言えよ .Navigate URL文字列 でOKだろ。説明が無駄に長いんだよ。

表示の完了を待つ

次は、ページが表示されるのを待ちます。
    '表示終了まで待つ .Busy(忙しい)間 と.ReadyState(ステータス)が4以外の時 ループ
    Do While objIE.Busy = True
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
        DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop
なぜ、待つかと言うと、いきなり入れるとイタイでしょ?(オイオイ、何言ってんだおっさん)
表示待ちを入れないで いきなりオブジェクトに触りに行くと(フォームなどのオブジェクトにアクセスすると) 相手の心の準備ができていないみたいで(オブジェクトの展開処理が間に合わないみたいで)、どこ触ってんだよと怒られるじゃなかった、 実行時エラー Document メソッドは失敗しました ・・・など、エラーで怒られるんですよ。
エラーの画像→[http://ken3-info.blog.ocn.ne.jp/screen/2007/05/ie__debe.html]
なので、objIE.Navigate 後に相手の準備ができるが確認します。

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

指定したURLを開き、相手の受け入れ準備も確認できたので、次はデータを挿入してみたいと思います。

入力したい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)に転記(代入)する。って感じです。
下記のような感じでデータをFormのMEMOにセットすることができます
'htmlドキュメント フォーム(0番目) アイテム(MEMO)に転記(代入)する。 objIE.Document.Forms(0).Item("MEMO").Value = strCOMMENT
ポイントは、
Excelなら、アプリ -- ブック(Book) -- シート(Sheet) -- セル(Cells)
のオブジェクト階層が、
アプリ -- html(Document) -- フォーム(Form) -- 入力エリア(A INPUT)
objIE.Document.Forms(0).Item("MEMO").Value
みたいな感じです。
読者の声:なんとなくわかってきたけど、こんなのヘルプに無いし、どこで調べるんだよ??
あっ、これですか・・
英語だけど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] オブジェクトがあります。
※数をこなしていくと感覚がわかると思います。
※※過去のメルマガ→[VBAからIE操作 NAMEが同じフォームの項目へデータをセットする]も見てください

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

挿入(データをフォームにセット)できたら、次は、送信ボタン(投稿)を押したいですよね・・・
単純に該当フォームを.Submitなんてメソッドで できちゃったりするんですよ。
※オブジェクト.動作(メソッド) ってイメージかなぁ。

objIE.Document.Forms(0).Submit
こんな1行で、送信処理ができてしまいます。

読者の声:だからさっきから質問してるでしょ、.Submit ? Form ? F1押して表示されるExcel VBAのヘルプにそんなの一言も載ってないよ

う〜ん、、、また怒られそうですが英語のMSDNを紹介します。
FORM Element | form Object [http://msdn2.microsoft.com/en-us/library/ms535249.aspx]
のメソッドの中に
submit [http://msdn2.microsoft.com/en-us/library/ms536771.aspx] があります。
※過去のメルマガ→[VBAからIE操作 .document.forms(0).Submit でフォーム送信処理]も見て参考となれば・・・

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

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

リンクを取り出す サンプル .Document.Linksを触る

商品一覧や売れ筋ランキングなどから、リンク先を取り出し、自分のID付きの広告コードを作成する

リンク先が動的に変わる、、、そんな場合に使いたいオブジェクトが.Document.Linksかなぁ。

読者の声:.Document.Links ? アンタまたわけわかんないオブジェクトをイキナリくちばしるね?自分だけわかってて、相手のこと考えたことあるの??説明の順番、上のデータセット解説から次はリンクでいいの?もっと違う方向性・説明の順番があると思うけどなぁ。。。オレ、スパム的な広告を大量に作る予定無いし、金の亡者じゃないし。

まぁまぁ、そんなこと言わないで、広告のリンクを作らなくても、
.Lengthの話 2. For Eachの話、3. InnerHTMLやInnerTEXT.OuterHTMLや.OuterTEXTの違いだけでも、この3点だけでも聞いてくださいね。

と、いつもの小芝居は置いといて、表示したHP(ドキュメント)のリンク先が.Linksオブジェクトに保存されています。この.Document.Linksを操作して、IEドキュメント操作の感覚をつかんでもらう、それが狙いなのでよろしくお願いします。
読者の声:だったら素直に書けよ、スパムとか金の亡者とか変な単語書いて煽るから誤解されるんだっばさ。

問題のLinkはAタグなので、MSDNでみるにはココ、
アクセス可能な HTML 要素 [http://www.microsoft.com/japan/msdn/workshop/author/access/accessibility.aspx#acc_elements] をクリック 後に、
Aタグ を探っていくと、
A Element | a Object [http://msdn2.microsoft.com/en-us/library/ms535173.aspx] が見つかります。
ここにイロイロと使えそうなプロパティやメソッドがありそうです。ワクワクしませんか?

読者の声:あっそ、でも英語でしょ?日本語の解説無いの?

冷めてるなぁ、、、でも、いっぱいあって何を使えばいいのか・・・いきなりこんなの見せられたら挫折しますね。
なので、私が使っている(知っている)プロパティを使って、テストプログラムを書いてみました。

読者の声:はじめから知ってるコマンドだけ解説します・残りは自分で探してくださいと言えよ?全て丁寧に解説してくれるものだと期待するでしょ

スミマセン、、、と、落ち込みつつ、リンクを取り出すサンプルを作成します
動作は、IE起動後、テスト用のBlog[http://ken3-info.blog.ocn.ne.jp/test/2007/09/post_fcf4.html] を開き、表示完了を待ってから、含まれているリンク情報をセルに書き出し、IEを終了させてみます。
Sub ie_test_Link_TEST()

    Dim objIE As Object  'IEオブジェクト参照用
    Dim i     As Integer '添え字 i番目などで使用
    Dim yLINE As Integer '行カウンタ、Y行目
    
    '15行から9999行を削除する 前回の結果データを消す
    Rows("15:9999").Delete
    
    'IEを起動する 初期処理
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く テストエリアを開く
    objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/09/post_fcf4.html"

    '表示終了まで待つ
    Do While objIE.Busy = True
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
        DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop
    
    'html ドキュメント リンク オブジェクトからデータをセルへ転記(代入)する。
    yLINE = 15  'セット開始の行を代入する
    For i = 0 To objIE.Document.Links.Length - 1
        'データをセルへセットする
        Cells(yLINE, "A") = "'" & objIE.Document.Links(i).Href
        Cells(yLINE, "B") = "'" & objIE.Document.Links(i).OuterText
        Cells(yLINE, "C") = "'" & objIE.Document.Links(i).OuterHTML
        Cells(yLINE, "D") = "'" & objIE.Document.Links(i).InnerText
        Cells(yLINE, "E") = "'" & objIE.Document.Links(i).InnerHTML
        Cells(yLINE, "F") = "'" & objIE.Document.Links(i).Target
        
        yLINE = yLINE + 1 'セット位置(行)を+1する
    Next i
    
    '抜き出し作業が終わったので、IEを終了させる
    objIE.Quit
    Set objIE = Nothing
    
End Sub
サンプル IETEST004.XLS→[http://ken3-info.blog.ocn.ne.jp/zip/IETEST004.zip]をzipを保存後、解凍して、テストしてみてください。

Links.Lengthでデータ数 添え字 Links(i) でアクセス

バカの一つ覚えのExcelとの比較を一つ、ブック内のシート名を表示するテストプログラムを書きます。
Sub TEST_SHEET_NAME()
    'シートの名前をテストで表示する
    Dim i As Integer   'カウンター、添え字
    
    For i = 1 To ActiveWorkbook.Sheets.Count
        MsgBox i & " シートの名前 " & ActiveWorkbook.Sheets(i).Name
    Next i

End Sub

ActiveWorkbook.Sheets.Count
で、ブックのシート数が取れるので、ループで1からシート数分まわし、
ActiveWorkbook.Sheets(i).Name
で、i番目のシートの名前(.Name)を表示してます。

読者の声:だから何?、ドキュメント内のリンク数は、objIE.Document.Links.Countと言いたいの?感覚的にExcel VBAに慣れた人は.Countを使うと決め付けたいの??でも、リンクの数は.Lengthなんでしょ?

あまり怒らないでくださいよ、リンクの数(要素の数)は.Countじゃなくて.Lengthです、配列も0から始まるので、
For i = 0 To objIE.Document.Links.Length - 1
Cells(yLINE, "A") = "'" & objIE.Document.Links(i).Href


Next i
と、i=0から初めて、.Length - 1までのループとしてます
他のIEオブジェクト操作でも 配列の要素数は、パターン的に.Lengthが多いので覚えておいてください・・それが言いたかっただけなんですが、Excelを例にしてた蛇足の解説でしたね(少々反省)

読者の声:蛇足でも何でもいいから、ハヤク、次行け?

.Href .OuterText .OuterHTML .InnerText .InnerHTML .Target

ドキュメント内 リンクのオブジェクト に
objIE.Document.Links(i番目)
で、アクセスできた(できる)ので、私が使ったことがあるプロパティをセルに書き出してみました。↓単純に縦に羅列しただけですが
Cells(yLINE, "A") = "'" & objIE.Document.Links(i).Href
Cells(yLINE, "B") = "'" & objIE.Document.Links(i).OuterText
Cells(yLINE, "C") = "'" & objIE.Document.Links(i).OuterHTML
Cells(yLINE, "D") = "'" & objIE.Document.Links(i).InnerText
Cells(yLINE, "E") = "'" & objIE.Document.Links(i).InnerHTML
Cells(yLINE, "F") = "'" & objIE.Document.Links(i).Target
実行結果を見ると、各プロパティの違いがわかると思います

読者の声:わかるわけねぇだろコラ。また、自分だけ気持ち良くなってんじゃねぇよ。。。InnerとOuterHTMLとTEXT どこが違うんだよ。

スミマセン、手抜きの解説で、少々いつものようにくどく書くと下記のリンクのAタグがあります
<A href="http://www.ken3.org/" target=_blank><Big><STRONG>三流</STRONG>プログラマー</Big></A>
↑のデータを例にすると、
.Href は リンク先URL http://www.ken3.org が値として取り出せます。
.Target は _blank (見たまんまか)
.OuterText と .InnerText は タグの付いてないテキスト文字列 三流プログラマー を値として取り出せます
.OuterHTML は、外側のタグを含むHTML <A href="http://www.ken3.org/" target=_blank><Big><STRONG>三流</STRONG>プログラマー</Big></A> です。あっ、そのまま全てか(笑)
.InnerHTML で タグの内側 <Big><STRONG>三流</STRONG>プログラマー</Big> 外側を1つはずした感じかな の データを受け取れます。

.OuterText .OuterHTML .InnerText .InnerHTMLは、他のタグでも使うことが多いので、なんとなくでもいいので頭のスミにでも覚えておいてください。

処理が終わったので IEを .Quit で閉じてみた

今回のリンク抜き出し処理にはあまり関係ないのですが、
objIE.Quit
.Quitで、Set objIE = CreateObject("InternetExplorer.application") で作成した IEを終了、閉じることができます。
開発中やデバッグ中はIEをそのまま残しておいたほうが何かと便利なのですが、処理が終わったら.Quitでサヨナラをすることもできます。

(i)で参照 から For Each に 変更

よし、リンクオブジェクトの説明終了、、、朝までにもう一軒飲み屋じゃなかった、オブジェクトをハシゴするぞと行きたい所ですが、あと一杯、少しだけお時間をとらせてください。

読者の声:だから、余計な会話はいいから、はやくシロ。(※←この読者の心の声もかなりの蛇足なんですが(笑)説明に必要ないでしょと思いつつ)

書き方に好みの問題もあるのですが、
objIE.Document.Links(i)
と、配列(i番目)でまわす方法のほかに、
For Each 変数 In オブジェクト
なんて書き方もあります

読者の声:何言ってんだか、よくわからん。いつもの例だせよ

えっ、いいんですか?いつもの蛇足の例を出して。では、お言葉に甘えてExcelのシートを例にして、
Sub TEST_SHEET_NAME_FOR_EACH()
    Dim objSHEET As Worksheet  'シートのオブジェクト受け取り用
    For Each objSHEET In ActiveWorkbook.Sheets
        MsgBox " シートの名前 " & objSHEET.Name
    Next
End Sub

みたいに、Dim objSHEET As Worksheetと受け取り用の変数を1つ定義して、 For Each objSHEET In ActiveWorkbook.Sheets
と記述すると、ActiveWorkbook.Sheets分だけ1つ1つ次のオブジェクトを取り出しながらループさせ、objSHEET.Nameみたいに(i)とか添え字や.Countなどの要素数を使わないで処理することができます。
頭から全てのデータをループさせる場合、このほうがスッキリとした記述かなぁ。
※三流君的には、(i)とか(n)、の書き方が好きだけど。

スッキリさせると言えば、せっかくリンクのテストプログラム作ったのに調べるURLによって毎回モジュール内の
objIE.Navigate "http://ken3-info.blog.ocn.ne.jp/test/2007/09/post_fcf4.html"
URLの文字列を直接変更してからテストするなんて、汎用性が無いので、せっかくExcelを使っているのだから、B10のセルに調査したいURLを保存(入力)してもらい参照するように変更してみます。あと、.Quitも終了させるか最後にユーザーに聞く感じに変更してみます。↓こんな感じに変更してみました。
Sub ie_test_LinkDATASET()
    'IE ドキュメント リンク オブジェクトのテスト

    Dim objIE As Object  'IEオブジェクト参照用
    Dim objA  As Object  'リンクのAタグ
    Dim yLINE As Integer '行カウンタ、Y行目
    
    '15行から9999行を削除する 前回の結果データを消す
    Rows("15:9999").Delete
    
    'IEを起動する 初期処理
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

    '.Navigate で 指定したURLを開く セルB10に入力したアドレスを開く
    objIE.Navigate Range("B10").Text  '指定されたURL(B10に入力)へ
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
        DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop
    
    'html ドキュメント リンク オブジェクトからデータをセルへ転記(代入)する。
    yLINE = 15  'セット開始の行を代入する
    For Each objA In objIE.Document.Links
        'データをセルへセットする
        Cells(yLINE, "A") = "'" & objA.Href
        Cells(yLINE, "B") = "'" & objA.OuterText
        Cells(yLINE, "C") = "'" & objA.OuterHTML
        Cells(yLINE, "D") = "'" & objA.InnerText
        Cells(yLINE, "E") = "'" & objA.InnerHTML
        Cells(yLINE, "F") = "'" & objA.Target
        yLINE = yLINE + 1 'セット位置(行)を+1する
    Next
    
    '後始末
    If MsgBox("IEを閉じますか?", vbYesNo) = vbYes Then
        objIE.Quit  '処理が終わったので、IEを終了させる
        Set objIE = Nothing
    End If

End Sub
↑、こっちのほうが少しはプロっぽい感じになったのかなぁ。
For Each objA In objIE.Document.Links
objA.Href
と、objIE.Document.Links(i).Hrefよりは、スッキリしたかなぁ。
サンプル IETEST004.XLS→[http://ken3-info.blog.ocn.ne.jp/zip/IETEST004.zip]をzipを保存後、解凍して、テストしてみてください。

読者の声:手前味噌って言葉を辞書で調べろよ・・

やっと Document.Body の解説に入る(.Bodyへアクセスする)

HTMLの入力フォーム FORM には、
objIE.Document.Forms(0).Item("MEMO").Value = 値
で値をセットしたり、
objIE.Document.Forms(0).Submit
で、送信のアクションを起こしたり、
HTMLのリンク は .Document.Links にアクセスして、
.Document.Links(n).Href でリンク先URLや
.Document.Links(n).InnerTEXT で文字を取り出したりしました。

解説の順番がなってない・・と、識者の人達にお叱りを受けそうですが、やっとボディタッチじゃなかった、Document.Body オブジェクトを触ってみたいと思います。
※女性読者の声?:タッチとか触るとか あと 所々に出てくる変な言葉遣い止めてもらえます?感じ悪いので、、、

数少ない、女性読者に嫌われたところで、めげずに続けます。(少々反省、文章は的確に短くがプログラマーさん達にウケルのかなぁ、変な蛇足はメモリや時間の無駄??)

.Document.Body.Allを使い 1つ1つアクセスする

いつものようにいきなりサンプルを見せる解説を始めます、下記のプログラムをExcelで走らせて見てください。
Sub ie_test_Ken3org_BODY_ALL()
    'ken3.org IE ドキュメント BODY ALL オブジェクトのテスト

    Dim objIE As Object   'IEオブジェクト参照用
    Dim n     As Integer  'カウンター
    Dim yLINE As Integer  '行カウンタ、Y行目
    
    '15行から9999行を削除する 前回の結果データを消す
    Rows("15:9999").Delete

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

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/"  'URLを開く
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
        DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop
    
    'html ドキュメント BODY オブジェクトからデータをセルへ転記(代入)する。
    yLINE = 15  'セット開始の行を代入する
    For n = 0 To objIE.Document.Body.All.Length - 1
        'データをセルへセットする
        Cells(yLINE, "A") = yLINE - 15 'n番目を計算でセットする
        Cells(yLINE, "B") = "'" & TypeName(objIE.Document.Body.All(n)) 'TypeNameでオブジェクトのタイプを表示
        
        Cells(yLINE, "C") = "'" & objIE.Document.Body.All(n).TagName   'タグの名前
        Cells(yLINE, "D") = "'" & Left(objIE.Document.Body.All(n).OuterHTML, 256) '頭から256文字だけセット
        Cells(yLINE, "E") = "'" & Left(objIE.Document.Body.All(n).InnerText, 256)
        Cells(yLINE, "F") = "'" & Left(objIE.Document.Body.All(n).InnerHTML, 256)

        yLINE = yLINE + 1 'セット位置(行)を+1する
    Next
    
    '後始末
    If MsgBox("IEを閉じますか?", vbYesNo) = vbYes Then
        objIE.Quit  '処理が終わったので、IEを終了させる
        Set objIE = Nothing
    End If

End Sub

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

ポイントは、Document.Body.All(n)でn番目のタグのデータを取得することができます。
.Document.Body.All.Length で、オブジェクトの数がわかるので、0から始めて To −1までのループを下記のように作りました。
For n = 0 To objIE.Document.Body.All.Length - 1
あとは、オブジェクト Document.Body.All(n)に対して操作してください。
TypeName関数に渡し、HTMLHeaderElement や HTMLTable などを表示したり
Document.Body.All(n).TagName で n番目のタグの名前、H1やP,TABLEなどを表示
Document.Body.All(n).OuterHTML や .InnerText で 中身のデータを表示しています※ここでは、セルにセットするために256文字でカットしてますが、実際は全てのデータを取得することができます。
少し使いにくいですが、頭から1つ1つタグをたどっていく場合などでDocument.Body.All(n)のループを使ってみてください。

あっ、もちろん、For Each In の書き方で、
For Each objA In objIE.Document.Body.All
objA.TagName や objA.InnerText みたいに書くこともできます。

読者の声:私、Excel持ってないのですが・・・みんながExcel VBAが使える環境にあると決め付けて解説しないで下さい。(※2人から実際にTELで「エクセル持ってない」と言われました)
あっ、スミマセン・・・、サンプルが私が使い易いExcel VBAを基準にしてて、、、三流解説ってことでご勘弁を(今後もExcelのサンプルで続けます、スミマセン)
今回の実行結果は↓のような感じです。
Item(n) 番目	TypeName	.TagName	.OuterHTML
0	HTMLHeaderElement	H1	"
<H1>AB型の変わり者 三流プログラマー Ken3のHP</H1>"
1	HTMLParaElement	P	"
<P>AB型の変わり者、三流プログラマーKen3がいろいろと書いてます。<BR>反面教師としたり、部分的に抜き取るなり、ご自由に料理してください<BR>※リンクはフリーです、連絡も不要です。TOPでも途中でもお好きなところに・・(リンクしていただけたらありがたいです)</P>"
2	HTMLBRElement	BR	<BR>
3	HTMLBRElement	BR	<BR>
4	HTMLParaElement	P	"
<P>今は、一人でできる小さなシステムの受託開発作業 や 資金がきれたら派遣で食いつないでます。今年(2007年)に35歳になりました、、、プログラマー35歳定年説?もあるし、うまく転機をみつけないとなぁ・・・</P>"
5	HTMLBRElement	BR	<BR>
6	HTMLTable	TABLE
    ・
    ・
出力結果の続きは→[http://ken3-info.blog.ocn.ne.jp/test/2007/09/for_n_0_to_obji_44ca.html]を見てください。

指定したタグのデータを抜き出す .Tags("タグの文字")

例えば、文章の段落、<P>のタグを取り出す時は、
If objIE.Document.Body.All(n).TagName = "P" Then
'処理
End If
と、頭から1つ1つオブジェクトの.TagName タグの名前を見て判断して処理を行う、なんかヒマだねぇ、いい書き方無いの?
実は、指定したタグだけ取り出す そんな都合のよい書き方があるんですよ。

読者の声:だったら、ハヤク教えろよ、て言うか初めに書けよ

書き方は、簡単で、
For Each objA In objIE.Document.Body.All.Tags("P")
と、
objIE.Document.Body.Allに.Tags("タグの文字")を追加するだけです。
かなり簡単でしょ?
Sub ie_test_Ken3org_BODY_ALL_P()
    'ken3.org IE ドキュメント BODY ALL から <P>〜を取り出す

    Dim objIE As Object  'IEオブジェクト参照用
    Dim objA  As Object  'リンクのAタグ
    Dim yLINE As Integer '行カウンタ、Y行目
    
    '15行から9999行を削除する 前回の結果データを消す
    Rows("15:9999").Delete

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

    '.Navigate で 指定したURLを開く
    objIE.Navigate "http://www.ken3.org/" '文字列で指定されたURLへ
    
    '表示終了まで待つ
    Do While objIE.Busy = True
        DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
    Loop
    Do While objIE.ReadyState <> 4
        DoEvents  '特に何もしないで.ReadyStateの状態が4に変わるまで待つ
    Loop
    
    'html ドキュメント BODY オブジェクトからデータをセルへ転記(代入)する。
    'Document.Body.All.Tags("P") で Pタグのデータのみ処理する
    yLINE = 15  'セット開始の行を代入する
    For Each objA In objIE.Document.Body.All.Tags("P")
        'データをセルへセットする
        Cells(yLINE, "A") = yLINE - 15 'n番目を計算でセットする
        Cells(yLINE, "B") = "'" & TypeName(objA) 'TypeNameでオブジェクトのタイプを表示
        
        Cells(yLINE, "C") = "'" & objA.TagName   'タグの名前
        Cells(yLINE, "D") = "'" & Left(objA.OuterHTML, 256) '頭から256文字だけセット
        Cells(yLINE, "E") = "'" & Left(objA.InnerText, 256)
        Cells(yLINE, "F") = "'" & Left(objA.InnerHTML, 256)

        yLINE = yLINE + 1 'セット位置(行)を+1する
    Next
    
    objIE.Quit  'IEを閉じる
    
End Sub

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

三流作者の補足:※ここまで、いろいろとIE Document.Bodyの解説書きましたが、下記のMSDN Front Pageの記事がかなりいい感じです。せっかく書いたので我流の解説を長々載せましたが、下記の記事がお奨めです。
Officeに入っていて、なかなか、使っていない?Front Page ですが、ホームページ作成のソフトなので、IEドキュメント オブジェクトをラップ(包み込んでいるのか?)、それともそのまんまアクセスしているのか?そこまでは探っていませんが、↓
Front Page 2002 Internet Explorer オブジェクト モデルへのアクセス
http://msdn.microsoft.com/library/ja/jpdnfp2k2/htm/odc_accessingie.asp

↑の アクティブ Web ページの HTML の操作 です。ここのサンプル(操作のVBA?)や説明を見るとイメージがつかみ易いと思います。※数少ない?日本語だし(オイオイ)、私の冗長解説よりも短くて、的確です。Front Pageのオブジェクトなので、そのままは使えませんが、Document操作の感覚はかなりつかめると思います


※まだまだ、書きかけ、内容をまとめていく予定・・・下のほうにあるメルマガの関連記事のリンクも合わせてみて下さい。


ドキュメントの探りやプロパティ、メソッド、イベント・・・とまだまだ、先は長い?全体の地図が見たいところだけど、未開拓の場所(未発掘のオブジェクト)が私も多くて、全体を示せずに今どこに居るのか?道に迷う感じですみません

読者の声:しっかりしろ、三流ガイド。IEオブジェクトの山で遭難しそうだよ。


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

[#BackNoLink][ページ内のTOPへ戻る]

過去のメールマガジンのリンクが長かったので、下記に移動しました。
[IE操作 メルマガ 一覧]
よろしくお願いします。


改版履歴 更新情報:過去のIE操作の解説はこちら↓(IE6+XP,IE7+XPの古い記事もアリ)
2009-12-01:[過去の解説 vba_ie_20091201.asp]
2009-06-01:[過去の解説 vba_ie_20090601.asp]
2009-02-01:[過去の解説 vba_ie_20090201.asp]
2008-05-01:[過去の解説 vba_ie_20080501.asp]
2007-08-31:[過去の解説 vba_ie_20070831.asp]
2007-05-20:[過去の解説 vba_ie20070520.asp]

2012-03-19:[過去の解説 vba_ie_20120319.html]
もあわせてみてください。
(↑もしかして書き直さない過去の解説の方がよかったかも?(笑))

広告

リンク広告
  1. --[ポコロンダンジョンズ ポコダンの再生リスト]
  2. --[パズドラ セラフィス降臨 パズル&ドラゴン]
  3. --[ Windows10 OSのフルバックアップ システムイメージバックアップ]
  4. --[Access コンボボックスを使ってみた]



[ページ内のTOPへ戻る]

ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

感想や質問・要望・苦情など 三流君へメッセージを送る。[#QA_MESSAGE]


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:



(感想や質問・要望・苦情はHPで記事に載せることがあります。)
例:[XXXXさんへ回答例]←みたいに回答していたり...

急ぎで連絡がほしい、そんな時は:[twitter三流君]に気軽に連絡してください。




[三流君(TOPへ)] / [VBAで楽しく] / [記事一覧]
カスタム検索