IEのサポートがWindows11で完全終了してしまいましたね。(2021/10/05冒頭に追記)
そんな感じで下記の質問が来たので対応策の参考になれば

下記いただいた質問
>ExcelVBAでデータを集め、競輪予想を作っています。



>さて最近、IEのサポート終了が告知されていますが
>WEBからのデータ取得はどのような対処がベターなのでしょうか?ご意見をお聞かせください。

ベター、ベスト、イロイロな考え方がありますが、
1.MSXML2.XMLHTTP などでHTMLを取得して、CreateObject("htmlfile") を使う
下記の例題動画、なんだか私の解説はイマイチだった・・・やはり、素直にSelenium VBAなのかなぁ。
と思いつつ、冒頭で Set objHTML = CreateObject("MSXML2.XMLHTTP")
でHTMLを取得して、使ったサンプルを紹介してみたり

IEサポート終了後の世界 MSXML2.XMLHTTPとCreateObject("htmlfile")を使用してJRAオッズ取得 ワイドのオッズ取得に挑戦してみた

目次
10:08 2.ワイドのオッズを押す
11:55 2.1 strレースを探し、頭出し?
18:47 3.オッズのテーブルを判断して、Excelにワイドオッズを取得
21:37 3.1 tableのcaptionで判断
28:30 4.ワイドの一番人気を探す
31:17 元に戻って、2.4 2回目以降は、レースを選択
他の動画を見る(YouTubeで再生リストを見る)
↑も参考になれば・・無事に移行できるといいですね。 三流プログラマー Ken3
※ソースコードは[MSXML2.XMLHTTPとCreateObject("htmlfile")を使用してJRAオッズ取得]を見てアレンジしてください。

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

[VBA(TOP)]
[三流君(TOP)]

全ての質問には、答えられませんが、リクエストや質問があったら、[作者(三流君)に質問する] から 気軽に送ってください

※2009年5月に保存した、更新前の記事です
最新の記事は[vba_ie_link.asp]を見てください

ここから、2009年5月に書いた記事です


2009年5月保存 三流君VBAでIEのリンクを操作 Document.Linksを探る

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

※Vista IE7の人はこちらを先に見てください。サンプルで私がよく使う好きな方法は、Set objIE = CreateObject("InternetExplorer.application")なのですが、Vista IE7の保護モードだと.Navigateで失敗したり・・[三流君 Vista IE7の修正でハマる(小細工で逃げる)] ← Vista IE7の人はこちらを先に見てください。

ページ内 目次

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

私が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でサヨナラをすることもできます。


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

Amazon雑誌から本日発売のリンクを抜く(Document.Allからリンク取り出す)

はじめに(あいさつ?):日々の操作を自動化したい、楽したい。そんな理由でシステム化・プログラムで自動化、寝てても勝手にコンピューターが働いてくれる・・・と夢を見るんだろうなぁ。
そんな迷える読者様から、たまに依頼が来たりする。。。

依頼を受け 仕様を起こす

さてと、依頼内容を理解して、仕様を起こしますか。
今回の依頼内容は:Amazonのホームページから、本日発売の雑誌リンクを取り出したいと簡単な依頼を受けました。

いつも思うけど、日本語1行で書かれると広いよね。
えっ、だから仕様をつめて(依頼主とやりとりをして)、落としていくんだろうって?
ここで手を抜くと痛い目に遭うよね。やりたいことを聞き出し仕様を起こすのって意外と大変なんですよ。。。

現在の処理を見せてもらう(見物を確認する)
文章で依頼書を書いてもらうのがアトアト面倒にならないでいいんだけど、なかなか書いてくれないので、最低限の現物確認から今回も仕様を泥縄式に決めていきます。
現在の操作手順
・Amazon.co.jp TOPページを表示する。
・雑誌を選択する
・スクロールさせm/d発売の雑誌を確認する。
※↑この確認した本日発売の雑誌をシートに取り込みたい。
動画解説:[事前準備 amazonの雑誌を調査する]
↑現物の流れをまず確認する そんな作業です。

あまり変わらないんだけど、↑の情報からいつもの箇条書きの仕様書を書きます
1.IEを起動します。
2.Amazon.co.jp TOPページを表示する。表示完了を待つ。
3.雑誌のリンクをクリックする
4.雑誌のページが表示されるのを待つ
5.表示された文章から 本日発売の雑誌 を探す
6.その下の 雑誌名とリンク先をシートに書き出す
7.IEを閉じる
と、まぁ、こんな感じかなぁ。(穴だらけの仕様書↑これを受け取った作業者は苦労するんだけど)

詳細設計しないで プログラムを書き出す(泥縄式で作成してみた)

仕様書もアバウトなので、プログラムを書きながら詰めていきますか。
読者の声:たまたまテストに毛の生えた小さな作成依頼だからいいけど、詳細設計しないで作り始めるなんてサスガ三流プログラマーだね。
三流君:ほめられたので調子に乗ってプログラムを書いちゃうか(オイオイ褒められてないだろ、違うって)

いつものように箇条書きをコメントで関数内に書き込みます
Sub Amazon_Today_Link_test()
    '1.IEを起動します。
    '2.Amazon.co.jp TOPページを表示する。表示完了を待つ。
    '3.雑誌のリンクをクリックする
    '4.雑誌のページが表示されるのを待つ
    '5.表示された文章から 本日発売の雑誌 を探す
    '6.その下の 雑誌名とリンク先をシートに書き出す
    '7.IEを閉じる
End Sub
↑こんな感じで初めは、使えない仕様書の箇条書きを縦に書きます。
あとは、穴を埋めていきますか。

IE起動 から Amazonのトップページを表示まで

IEを起動、Amazon.co.jp TOPページを表示する、表示完了を待つ。
は、解説の使い回しで
ア.初めは[IEの起動] CreateObject("InternetExplorer.application")でブラウザを起動させます
イ.次に[.Navigateで開く] 目的のページを開くために.Navigateメソッドでページを移動させます。
ウ.最後に[.Busyと.ReadyState]で表示の完了(ページの読み込み)を待ちます。
↓こんな感じで、書いてみました。
Sub Amazon_Today_Link_test()
 '1.IEを起動します。
    Dim objIE      As Object  'IEオブジェクト参照用
    
    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)
    
 '2.Amazon.co.jp TOPページを表示する。表示完了を待つ。
    '.Navigate で 指定したURLを開く(www.amazon.co.jpを開く)
    objIE.Navigate "http://www.amazon.co.jp/"

    '表示完了を待つ
    While objIE.ReadyState <> 4  'ステータスが4の完了を待つ(4以外の時ループ)
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
 '3.雑誌のリンクをクリックする
 '4.雑誌のページが表示されるのを待つ
 '5.表示された文章から 本日発売の雑誌 を探す
 '6.その下の 雑誌名とリンク先をシートに書き出す
 '7.IEを閉じる
End Sub


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

雑誌のリンクをクリック .Clickする

トップページから、雑誌のページに移動したいので
[For Each 変数 In objIE.Document.Links] や [Document.Links の .Href .OuterText .OuterHTML .InnerText .InnerHTML]を参考にしながら、
Document.Linksから雑誌の文字を探し(.InnerTextを見て)、クリック.Clickしてみます。

雑誌のリンクを探したかったので、For Each objLINK In objIE.Document.Links を使い文章のリンク全体をループで回して、中身のテキストをobjLINK.InnerTEXT = "雑誌"で判断後、見つけたオブジェクトに対して、objLINK.Clickでクリックメソッドを実行しました。
Sub Amazon_Today_Link_test()
 '1.IEを起動します。
    Dim objIE      As Object  'IEオブジェクト参照用
    
    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)
    
 '2.Amazon.co.jp TOPページを表示する。表示完了を待つ。
    '.Navigate で 指定したURLを開く(www.amazon.co.jpを開く)
    objIE.Navigate "http://www.amazon.co.jp/"
    
    '表示完了を待つ
    While objIE.ReadyState <> 4  'ステータスが4の完了を待つ(4以外の時ループ)
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
 '3.雑誌のリンクをクリックする
    Dim objLINK As Object  'リンクのオブジェクト受け取り用

    For Each objLINK In objIE.Document.Links  'リンクを1つ1つ取り出しobjLINKへ
        If objLINK.InnerTEXT = "雑誌" Then  'オブジェクトのテキストで比較する
            objLINK.Click  '見つけたオブジェクトを素直にクリックする
            Exit For       'クリックしたのでループを抜ける
        End If
    Next   '↑雑誌が見つからなかったときの処理が入っていないような・・・

 '4.雑誌のページが表示されるのを待つ
    '表示完了を待つ ↑上でクリックしてページが遷移するので再度待つ
    While objIE.ReadyState <> 4  'ステータスが4の完了を待つ(4以外の時ループ)
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
 
 '5.表示された文章から 本日発売の雑誌 を探す
 '6.その下の 雑誌名とリンク先をシートに書き出す
 '7.IEを閉じる
End Sub
動画解説:[こんな感じ?]

↑リンクのオブジェクトから雑誌を探してクリックしました
次は、雑誌のページから本日発売の雑誌を探します


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

m/d発売の雑誌 を探し その下のリンクをセルに書き出す

リンクは、.Document.Links にまとまっているので、全てを取り扱うときは便利なのですが、今回みたいに一部を抜き出したい場合は、.Document.Allから探った方が楽な場合があります(私が楽と言っているだけで、実際は違う方法があるかもしれませんが・・・)

今回やりたい処理は、6/10発売の雑誌 のパターン m/d発売の雑誌を探しその下のリンク(Aタグ a href=)を取り出し、セルに書き込む処理です。
文字を探したいので、
[.Allで文章にアクセス]と[All.Length]を使います。
泥臭く カウンターnを用意して、
For n = 0 To objIE.Document.All.Length - 1で頭からのループを作り
Document.All(n).InnerTEXT = m/d発売の雑誌 で テキストを探してn番目を保持します
n番目の頭出し(読み飛ばし)ができたら、次は、そこから下のAタグa href=を取り出し、セルに書き込みます。

プログラムが無駄に長くなってますが、こんな感じです。
Sub Amazon_Today_Link_test()
 '1.IEを起動します。
    Dim objIE      As Object  'IEオブジェクト参照用
    
    'IEを起動する
    Set objIE = CreateObject("InternetExplorer.application") 'IEのオブジェクトを作る
    objIE.Visible = True '見えるようにする(お約束)

 '2.Amazon.co.jp TOPページを表示する。表示完了を待つ。
    '.Navigate で 指定したURLを開く(www.amazon.co.jpを開く)
    objIE.Navigate "http://www.amazon.co.jp/"
    
    '表示完了を待つ
    While objIE.ReadyState <> 4  'ステータスが4の完了を待つ(4以外の時ループ)
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    
 '3.雑誌のリンクをクリックする
    Dim objLINK As Object  'リンクのオブジェクト受け取り用

    For Each objLINK In objIE.Document.Links  'リンクを1つ1つ取り出しobjLINKへ
        If objLINK.InnerTEXT = "雑誌" Then  'オブジェクトのテキストで比較する
            objLINK.Click  '見つけたオブジェクトを素直にクリックする
            DoEvents
            Exit For       'クリックしたのでループを抜ける
        End If
    Next   '↑雑誌が見つからなかったときの処理が入っていないような・・・

 '4.雑誌のページが表示されるのを待つ
    '表示完了を待つ ↑上でクリックしてページが遷移するので再度待つ
    While objIE.ReadyState <> 4  'ステータスが4の完了を待つ(4以外の時ループ)
        While objIE.Busy = True
            DoEvents  '特に何もしないで.Busyの状態が変わるまで待つ
        Wend
    Wend
    'クリック後 手抜きで2秒待つ (オブジェクトの展開時間を待つ)
    Application.Wait Time:=Now + TimeValue("00:00:02")  '2秒間 ボーっとする
 
 '5.表示された文章から 本日発売の雑誌 を探す
 
    Dim n       As Integer    '.allのn番目を管理する番号 添え字
    Dim strKEYWORD As String  'm/d発売の雑誌(マッチング用のワード)

    'マッチング用のキーワードを作る
    strKEYWORD = Format(Now(), "m/d") & "発売の雑誌"

    '文章(.Document)の全体(.All)から m/d発売の雑誌を見つけ ループを抜ける
    For n = 0 To objIE.Document.All.Length - 1
        If objIE.Document.All(n).InnerTEXT = strKEYWORD Then  '次に中身を比較する
            Exit For       'データを見つけたのでループを抜ける
        End If
    Next n

    'ループの最大値と比べて データが見つからない場合を判断する
    If n >= objIE.Document.All.Length Then  '途中でループを抜けられなかったか?
        MsgBox strKEYWORD & " が見つかりません。今日は休刊日 Or レイアウト変更の可能性があります"
        Exit Sub  'ユーザー確認のため、IEはそのまま閉じないでプログラムを抜ける
    End If
    
 '6.その下の 雑誌名とリンク先をシートに書き出す
    Dim nYLINE  As Integer   'セットするデータの行カウンタ
    '前回の結果を消す
    Sheets("本日発売の雑誌").Select    'シートの選択
    Rows("5:9999").Delete Shift:=xlUp  '5行目から9999行を削除する
    
    '見つけた日付をセットする
    Range("B2") = strKEYWORD
    
    nYLINE = 5   '行カウンタを初期化する(5行目からセットする)
 
    Do While n < objIE.Document.All.Length - 1
        'タグ(.TagName)を見て 処理を行う
        If objIE.Document.All(n).TagName = "A" Then 'A タグ リンクのタグなら
            Cells(nYLINE, "A") = objIE.Document.All(n).InnerTEXT  'アンカーのテキストをセット
            Cells(nYLINE, "B") = objIE.Document.All(n).href       '飛び先をセットする
            nYLINE = nYLINE + 1  'セットする行を+1する(次の行へ)
        End If
        
        '次の区切り タグだったら 次のTDまででOKだけど保険でHRを付けました
        If objIE.Document.All(n).TagName = "TD" Then Exit Do 'TDタグ 次のテーブルセルなら抜ける
        If objIE.Document.All(n).TagName = "HR" Then Exit Do 'HRタグ ラインのタグが来たら

        n = n + 1  '調査対象を次のオブジェクトへ
    Loop

 '7.IEを閉じる
    objIE.Quit
    Set objIE = Nothing

End Sub
動画解説:[m/d発売の文字を探しその下のリンクを書き出す]
ポイントは、strKEYWORD = Format(Now(), "m/d") & "発売の雑誌"で、マッチング用の文字列を作り、
For n = 0 To objIE.Document.All.Length - 1のループでまわし
If objIE.Document.All(n).InnerTEXT = strKEYWORD Then で比較し、見つけたらループを抜けます。
この時、nの値が頭出しされているので、次は、
Do While n < objIE.Document.All.Length - 1で読み飛ばしたnからループを作り、
タグ(.TagName)を見て処理を行います。
If objIE.Document.All(n).TagName = "A" Then でAタグを確認後、
セルに Cells(nYLINE, "A") = objIE.Document.All(n).InnerTEXT でリンク先のタイトル
Cells(nYLINE, "B") = objIE.Document.All(n).href で飛び先のURLをセットしてます
あとは、終わりの判断です。これも.TagNameを利用して、次の"TD"タグが来たら処理を終了させてます(ループを抜けてます)
If objIE.Document.All(n).TagName = "TD" Then Exit Do
いろいろと行った小細工で無事リンクが取り出せたと思います。。。

Link処理 終わりの挨拶

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

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

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


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

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

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

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



[ページ内のTOPへ戻る]

ページフッター

Googleで情報を探す

せっかくホームページに来ていただいたのに、検索の紹介 ぉぃぉぃ
サイト指定や期間の指定を組み合わせて実行してみてください。

Google
探す言葉:
ググる。↑VBAなど 気になる単語や,オブジェクト(MailItem),プロパティ(.Body)やメソッド(.Move)などを入れて検索してみてください。

サイト指定:人気QAサイト や 一次情報MS本家を指定する
条件無し WWW 全体から検索も良いけど↓で絞り込むのもおススメです
一次情報・二次情報まとめから探る
一次情報は基本のMSDN含む microsoft.comから
まとめ一次・二次情報 Qiita 知識を記録・共有 qiita.comで個人まとめを参考に
手前味噌の三次情報 三流君メモBlog ken3memo.hatenablogから検索
QAサイトの質問から探る
QAはやっぱり人の多いYahoo知恵袋 chiebukuro.yahoo.co.jpから探る
こちらもどうぞ おしえてgoo! oshiete.goo.ne.jp
15分探して見つからなかったら?回答率90%以上 teratail.com
私も利用中 最近過疎ってる失礼 人力検索 q.hatena.ne.jp
意外と穴場? 2ch 5ch.netから探す
検索実行: ←オプション確認後に検索ボタンを押してください

期間指定:情報の鮮度も大切?
指定なし(全て)※不変の情報を得るには指定無しが一番?
3日以内 最新の更新情報を探す時など。
3ヶ月 これはあまり使わないかも
1年以内の更新なら情報鮮度もOK?バランス型
3年も経てばOfficeもバージョンUP?
検索実行: ←オプション確認後に検索ボタンを押してください

メッセージ送信

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

感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。


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


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


対応速度・緊急度:
(回答・感想は下記のようにしてHPで記事に載せてます) 例:[XXXXさんへ回答例]←みたいに回答していたり...
とても急ぎで連絡がほしい、そんな時は:[twitter三流君DM]に気軽に連絡してください。

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