[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のリンクを操作 Document.Linksを探る

[三流君VBAでIEを操作・IEの制御]から、Linkの操作部分を抜き出しまとめてます。InternetExplorer WebBrowser の Document.Linksを操作してみたいと思います。なかなかのジャジャ馬で制御するのが難しいんだけど・・・

更新履歴※たまに前回の記事の方がよかったと言われます。更新前の記事は、
2009-05-12の記事は[vba_ie_link_20090512.asp]を見てください

Document.Linksの探り方

ウォッチ式を使ったり、参照設定してからコーディングすると便利だったり

参照設定の方法は、[WebBrowserを参照設定]を見てください

サンプル

説明がヘタなので現物を操作しながら(サンプルを解凍後実行しながら)、IE操作の三流解説を読んでください(百聞は一見に 〜 って感じでお願いします)
リンク先の取り出しサンプル[IE起動とリンクの取り出し サンプル 20080605_IE_Link.zip]←Excel VBAです

ページ内 目次

↑動作イメージがつかめたらたたき台とて改良したり遊んでみてください

私がIE操作、プロパティやメソッドを探る方法 を ネタばらしすると(はやいよ)、MSDNで探したりプログラムを途中で止めて オブジェクトの中身を直接見たりしています。
[三流君 が MSDN で InternetExplorer の 資料を探す]
↑上級者はここを先に見た方が良かったり?(ヘンテコな説明や動画を見るよりも こちらの方が近道かも)
と書きつつ、いきなり大切な読者様へ嘘つきました、最近はGoogleの検索を主に使っていたりします。検索のキーワードがなかなか思いつかないと思うので私のお気に入りのキーワードを紹介します。(読者の声:だったら先に書けよ↓)
[番外編 GoogleでoIE,objIE,WebBrowserをKeyWordにして検索]
↑MSDNの目次(頭)から探すのが大変なので、検索すると良いサンプルや数少ない解説ページに巡り逢えるかも、なんて自信をなくしつつも三流製 手前味噌のサンプルをどさくさに紛れて紹介します 過去記事のリンク→[過去のメルマガ] ← IE6時代のサンプルですが何かの役に立つと願いつつ・・・
※時の流れはハヤク、あと少ししたら(まだまだ先だけどオオゲサに書いてみました)IE8がリリースされるのに、実はVista IE7に苦戦しています。(IE7を攻略する前にIE8になり、取り残されたりして・・・)

さて、IEを操作 Documentの森・WebBrowserの山を頼りないガイドの三流君と一緒にさまよってみましょうか!!!
このページ 三流プログラマー的解説がIE操作方法(プロパティやメソッド)の入り口として何かの参考・お役に立てれば幸いです。


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

リンク情報を取り出す(Document.Linksオブジェクト)

はじめに(あいさつ?):インターネットエクスプローラーの操作と一口に言ってもイロイロな操作があると思います。
そのうちの一つが、あるホームページ(URL)を表示して、リンク先の情報を取り出したい、、、そんな要望があると思います。※リンクの先を探りたいなど、この一連の流れをVBA上から行いたい・・・と日本語で書くのは簡単なんだけど、この流れをプログラムで記述してみたいと思います

ここからのリンク先の取り出しサンプル[IE起動とリンクの取り出し サンプル 20080605_IE_Link.zip]←Excel VBAです
ダウンロードして遊んでみてください。

読者の声:.Document.Links ? アンタまたわけわかんないオブジェクトをイキナリくちばしるね?自分だけわかってて、相手のこと考えたことあるの??説明の順番は、考えたことあるの?もっと違う方向性・説明の順番があると思うけどなぁ。。。読者Bそうだそうだ、基本もいいけどもっと実用的なことやれよ

まぁまぁ、そんなこと言わないで、今回の1 .Lengthの話 2. For Eachの話、3. InnerHTMLやInnerTEXT.OuterHTMLや.OuterTEXTの違いだけでも、この3点だけでも聞いてくださいね。

と、いつもの小芝居は置いといて、表示したHP(ドキュメント)のリンク先が.Linksオブジェクトに保存されています。この.Document.Linksを操作して、IEドキュメント操作の感覚をつかんでもらう、それが狙いなのでよろしくお願いします。

今回操作したいリンクは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] が見つかります。
ここにイロイロと使えそうなプロパティやメソッドがありそうです。ワクワクしませんか?

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

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

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

スミマセン、、、と、落ち込みつつ、リンクを取り出すサンプルを作成します


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

調査したいURLを表示後 リンク先の情報をセルにテストで書いてみた

初めは、どんなことをやるか、仕様(仕様書)を書かないといけないんだっけ、
では、いつもの通用しない箇条書き仕様を軽く書きます。
1.調査したいURLをInputBoxで受け取ります(かなり手抜き・・・)
2.IEを起動させ、目的のページを表示させます。
3.目的のページからリンク先を取り出し、セルに書き出します。
こんな感じかな。※オイオイ、おおまか過ぎでしょ・・・
次章からこの3つに対応したコードを載せます。

1.標準関数のInputBoxを使ってURLを受け取る

もしかして、解説不要?だと思いつつ、標準関数のInputBoxを使ってURLを受け取る(入力してもらう)には、
strURL = InputBox("調査するURLは?", "URL入力", "http://www.ken3.org/backno/backno_vba_mokuji.html")
こんな感じかな?
標準関数なので、よく見かけると思います。

2.IEを起動させ、目的のページを表示させます

IEの起動とページ表示です。最近流行の 高級料亭でも行っている料理の使い回し じゃないけど、解説の使い回しで、
ア.初めは[IEの起動] CreateObject("InternetExplorer.application")でブラウザを起動させます
イ.次に[.Navigateで開く] 目的のページを開くために.Navigateメソッドでページを移動させます。
ウ.最後に[.Busyと.ReadyState]で表示の完了(ページの読み込み)を待ちます。

上記を参考に(って言ってもほぼそのまま、URLが変数に変わっただけですが)
Sub ie_Link_TEST()

'1.調査したいURLをInputBoxで受け取ります(かなり手抜き・・・)
    Dim strURL  As String   '入力値を受け取る変数

    'INPUTBOXでURLをもらう
    strURL = InputBox("調査するURLは?", "URL入力", "http://www.ken3.org/backno/backno_vba_mokuji.html")
    If strURL = "" Then
        MsgBox "調査したいURLを指定してください"
        Exit Sub  '途中で抜ける
    End If

'2.IEを起動させ、目的のページを表示させます。

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

    '.Navigate で 指定したURLを開く
    objIE.Navigate strURL
    
    '表示完了を待つ
    While objIE.ReadyState <> 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend

'3.目的のページからリンク先を取り出し、セルに書き出します。
    '表示されたら、ここから抜き出す処理を書く

End Sub
と、作成しました。

3.目的のページからリンク先を取り出し、セルに書き出します。

調査対象のページが無事に表示されたら、新しいブックを追加後
Document.Links.Lengthでリンクの数がわかるので、
For i = 0 To objIE.Document.Links.Length - 1とループを作り
objIE.Document.Links(i).Href
objIE.Document.Links(i).OuterText .OuterHTML
objIE.Document.Links(i).InnerText .InnerHTML
objIE.Document.Links(i).Target
をセルに書き込みます。

解説の前に 先出しで下記、テストで作ったリンク書き出しのプログラムです。
Sub ie_Link_TEST()

'1.調査したいURLをInputBoxで受け取ります(かなり手抜き・・・)
    Dim strURL  As String   '入力値を受け取る変数
    
    'INPUTBOXでURLをもらう
    strURL = InputBox("調査するURLは?", "URL入力", "http://www.ken3.org/backno/backno_vba_mokuji.html")
    If strURL = "" Then
        MsgBox "調査したいURLを指定してください"
        Exit Sub  '途中で抜ける
    End If

'2.IEを起動させ、目的のページを表示させます。

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

    '.Navigate で 指定したURLを開く
    objIE.Navigate strURL
    
    '表示完了を待つ
    While objIE.ReadyState <> 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
'3.目的のページからリンク先を取り出し、セルに書き出します。
    
    Dim i     As Integer '添え字 i番目などで使用
    Dim yLINE As Integer '行カウンタ、Y行目
   
    'html ドキュメント リンク オブジェクトからデータをセルへ転記(代入)する。
    Workbooks.Add  '新規ブックを追加 データ転送用に新規のブックを追加する
    Range("A1") = "調査したURLは " & strURL & " です"  'A1にURLを記述(セット)
    Range("D1") = "リンクの数は " & objIE.Document.Links.Length & "です"  'D1にリンクの数をセット

    Range("A2") = ".Href(リンク先)"   'A2〜F2 2行目に見出しをセットする
    Range("B2") = ".OuterText"
    Range("C2") = ".OuterHTML"
    Range("D2") = ".InnerText"
    Range("E2") = ".InnerHTML"
    Range("F2") = ".Target"
    Columns("A:F").ColumnWidth = 22 '列幅を22に変更

    yLINE = 3  'セット開始の行を代入する
    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 '自分を含む テキスト(Innerと変わりない?)
        Cells(yLINE, "C") = "'" & objIE.Document.Links(i).OuterHTML '自分を含む HTML
        Cells(yLINE, "D") = "'" & objIE.Document.Links(i).InnerText '内側のテキスト
        Cells(yLINE, "E") = "'" & objIE.Document.Links(i).InnerHTML '内側のHTML
        Cells(yLINE, "F") = "'" & objIE.Document.Links(i).Target    '_Blank や 表示先フレームの名前など
        
        yLINE = yLINE + 1 'セット位置(行)を+1する
    Next i
    
    '抜き出し作業が終わったので、通常.QuitでIEを終了させる が 今回は残す
    'objIE.Quit
    Set objIE = Nothing
   
    MsgBox "処理終了、ブラウザの表示内容 と シートを確認してください"
   
End Sub

操作手順と実行結果:


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

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

ループで回す時、最大値・要素の数を知りたいので、そんな時は、Document.Links.Lengthで知ることができます。

バカの一つ覚えの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を例にしてた蛇足の解説でしたね(少々反省)


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

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

ドキュメント内 リンクのオブジェクト に
objIE.Document.Links(i番目)
で、アクセスできた(できる)ので、次はプロパティ・値を取りたいと思います。
objIE.Document.Links(i).Hrefでリンク先などを取り出すことができます

私が使ったことがあるプロパティをセルに書き出してみました。↓単純に縦に羅列しただけですが
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は、他のタグでも使うことが多いので、なんとなくでもいいので頭のスミにでも覚えておいてください。


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

Linksの参照を Links(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などの要素数を使わないで処理することができます。
同様に For Each 変数 In objIE.Document.Links とLinksもFor Each IN を使うことができます。
読者の声:デジャブか?この解説前にも見たことがある。
Ken3:ギク、、[Document.AllをFor Eachで回す]とそっくりですね。。。料理じゃなかった、解説の使い回しですね(二度見た人はお許しを)
※逆に言うと For Each 変数 IN オブジェクト はイロイロと使えるってことです。もったいないから・・と言ってみた。(オイオイいい加減にしろよまったく)

話を戻して、下記 For Each INを使用したサンプルに書き換えました。
Sub ie_Link_For_Each_test()  'For Each 変数 In objIE.Document.Links のテスト

'1.調査したいURLをInputBoxで受け取ります(かなり手抜き・・・)
    Dim strURL  As String   '入力値を受け取る変数
    
    'INPUTBOXでURLをもらう
    strURL = InputBox("調査するURLは?", "URL入力", "http://www.ken3.org/backno/backno_vba_mokuji.html")
    If strURL = "" Then
        MsgBox "調査したいURLを指定してください"
        Exit Sub  '途中で抜ける
    End If

'2.IEを起動させ、目的のページを表示させます。

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

    '.Navigate で 指定したURLを開く
    objIE.Navigate strURL
    
    '表示完了を待つ
    While objIE.ReadyState <> 4
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
'3.目的のページからリンク先を取り出し、セルに書き出します。
    
    Dim yLINE   As Integer '行カウンタ、Y行目
    Dim objLINK As Object  'リンクのオブジェクト受け取り用
       
    'html ドキュメント リンク オブジェクトからデータをセルへ転記(代入)する。
    Workbooks.Add  '新規ブックを追加 データ転送用に新規のブックを追加する
    Range("A1") = "調査したURLは " & strURL & " です"  'A1にURLを記述(セット)
    Range("D1") = "リンクの数は " & objIE.Document.Links.Length & "です"  'D1にリンクの数をセット

    Range("A2") = ".Href(リンク先)"   'A2〜F2 2行目に見出しをセットする
    Range("B2") = ".OuterText"
    Range("C2") = ".OuterHTML"
    Range("D2") = ".InnerText"
    Range("E2") = ".InnerHTML"
    Range("F2") = ".Target"
    Columns("A:F").ColumnWidth = 22 '列幅を22に変更

    yLINE = 3  'セット開始の行を代入する
    For Each objLINK In objIE.Document.Links  'リンクを1つ1つ取り出しobjLINKへ
        'データをセルへセットする  'を付けて文字列にする(セルにセットしたいので)
        Cells(yLINE, "A") = "'" & objLINK.Href      'リンク先
        Cells(yLINE, "B") = "'" & objLINK.OuterText '自分を含む テキスト(Innerと変わりない?)
        Cells(yLINE, "C") = "'" & objLINK.OuterHTML '自分を含む HTML
        Cells(yLINE, "D") = "'" & objLINK.InnerText '内側のテキスト
        Cells(yLINE, "E") = "'" & objLINK.InnerHTML '内側のHTML
        Cells(yLINE, "F") = "'" & objLINK.Target    '_Blank や 表示先フレームの名前など
        
        yLINE = yLINE + 1 'セット位置(行)を+1する
    Next
    
    'IEの終了を聞く
    If MsgBox("IEを閉じますか?", vbYesNo, "終了確認") = vbYes Then
        objIE.Quit   '.Quitで閉じる
    End If
    Set objIE = Nothing
   
End Sub
頭から全てのデータをループさせる場合、For Each objLINK In objIE.Document.Linksとして、使う時は objLINK.プロパティ このほうがスッキリとした記述かなぁ。
※三流君的には、Links(i)とかLinks(n)、の書き方が長くても好きだけど。


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

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

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

Link処理 終わりの挨拶

まだまだ、書かないといけないLink操作 プロパティやメソッドなどの組み合わせがあるのですが、このあたりで逃げるように失礼します(オイオイ)。更新が遅いけど温かく見守ってください 更新中 まだまだ書きかけ

いろいろな表現があって、かえって迷ってしまうかもしれませんが、数をこなすと見えてくるので、私のサンプルだけじゃなく、いろいろなサンプルを探して見てください。[番外編 GoogleでoIE,objIE,WebBrowserをKeyWordにして検索]にお勧めのキーワード検索方法を載せてます

ここまでのリンク先の取り出しサンプル[IE起動とリンクの取り出し サンプル 20080605_IE_Link.zip]←Excel VBAです
ダウンロードして遊んでみてください。


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

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

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

Ken3の連絡先:[連絡先@メールアドレス]です。何か相談事があれば気軽に連絡してね(頼りないけど)




[ページ内のTOPへ戻る]

ページフッター

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

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


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

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



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

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




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




広告

リンク広告
  1. --[ガチャ 爆死や神引き 課金などなど]
  2. --[【ガチャ】モンスト 3500万人記念!!オーブ0ガチャ]
  3. --[Access コンボボックスを使ってみた]
  4. --[ Windows7 OSのフルバックアップ システムイメージバックアップ]