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月に書いた記事です
[三流君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操作方法(プロパティやメソッド)の入り口として何かの参考・お役に立てれば幸いです。
はじめに(あいさつ?):インターネットエクスプローラーの操作と一口に言ってもイロイロな操作があると思います。
そのうちの一つが、あるホームページ(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やネットから探してくださいと言えよ?全て丁寧に解説してくれるものだと期待するでしょ
スミマセン、、、と、落ち込みつつ、リンクを取り出すサンプルを作成します
初めは、どんなことをやるか、仕様(仕様書)を書かないといけないんだっけ、
では、いつもの通用しない箇条書き仕様を軽く書きます。
1.調査したいURLをInputBoxで受け取ります(かなり手抜き・・・)
2.IEを起動させ、目的のページを表示させます。
3.目的のページからリンク先を取り出し、セルに書き出します。
こんな感じかな。※オイオイ、おおまか過ぎでしょ・・・
次章からこの3つに対応したコードを載せます。
もしかして、解説不要?だと思いつつ、標準関数のInputBoxを使ってURLを受け取る(入力してもらう)には、
strURL = InputBox("調査するURLは?", "URL入力", "http://www.ken3.org/backno/backno_vba_mokuji.html")
こんな感じかな?
標準関数なので、よく見かけると思います。
IEの起動とページ表示です。最近流行の 高級料亭でも行っている料理の使い回し じゃないけど、解説の使い回しで、
ア.初めは[IEの起動] CreateObject("InternetExplorer.application")でブラウザを起動させます
イ.次に[.Navigateで開く] 目的のページを開くために.Navigateメソッドでページを移動させます。
ウ.最後に[.Busyと.ReadyState]で表示の完了(ページの読み込み)を待ちます。
上記を参考に(って言ってもほぼそのまま、URLが変数に変わっただけですが)
|
調査対象のページが無事に表示されたら、新しいブックを追加後
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
をセルに書き込みます。
解説の前に 先出しで下記、テストで作ったリンク書き出しのプログラムです。
|
ループで回す時、最大値・要素の数を知りたいので、そんな時は、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
ドキュメント内 リンクのオブジェクト に
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とOuterやHTMLと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は、他のタグでも使うことが多いので、なんとなくでもいいので頭のスミにでも覚えておいてください。
よし、リンクオブジェクトの説明終了、、、朝までにもう一軒飲み屋じゃなかった、オブジェクトをハシゴするぞと行きたい所ですが、あと一杯、少しだけお時間をとらせてください。
読者の声:だから、余計な会話はいいから、はやくシロ。(※←この読者の心の声もかなりの蛇足なんですが(笑)説明に必要ないでしょと思いつつ)
書き方に好みの問題もあるのですが、
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
話を戻して、下記 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 |
今回のリンク抜き出し処理にはあまり関係ないのですが、
objIE.Quit
.Quitで、Set objIE = CreateObject("InternetExplorer.application") で作成した IEを終了、閉じることができます。
開発中やデバッグ中はIEをそのまま残しておいたほうが何かと便利なのですが、処理が終わったら.Quitでサヨナラをすることもできます。
はじめに(あいさつ?):日々の操作を自動化したい、楽したい。そんな理由でシステム化・プログラムで自動化、寝てても勝手にコンピューターが働いてくれる・・・と夢を見るんだろうなぁ。
そんな迷える読者様から、たまに依頼が来たりする。。。
さてと、依頼内容を理解して、仕様を起こしますか。
今回の依頼内容は: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.co.jp TOPページを表示する、表示完了を待つ。
は、解説の使い回しで
ア.初めは[IEの起動] CreateObject("InternetExplorer.application")でブラウザを起動させます
イ.次に[.Navigateで開く] 目的のページを開くために.Navigateメソッドでページを移動させます。
ウ.最後に[.Busyと.ReadyState]で表示の完了(ページの読み込み)を待ちます。
↓こんな感じで、書いてみました。
|
トップページから、雑誌のページに移動したいので
[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でクリックメソッドを実行しました。
|
動画解説:[こんな感じ?] ↑リンクのオブジェクトから雑誌を探してクリックしました |
リンクは、.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=を取り出し、セルに書き込みます。
プログラムが無駄に長くなってますが、こんな感じです。
|
動画解説:[m/d発売の文字を探しその下のリンクを書き出す] |
まだまだ、書かないといけないLink操作 プロパティやメソッドなどの組み合わせがあるのですが、このあたりで逃げるように失礼します(オイオイ)。更新が遅いけど温かく見守ってください 更新中 まだまだ書きかけ
いろいろな表現があって、かえって迷ってしまうかもしれませんが、数をこなすと見えてくるので、私のサンプルだけじゃなく、いろいろなサンプルを探して見てください。[番外編 GoogleでoIE,objIE,WebBrowserをKeyWordにして検索]にお勧めのキーワード検索方法を載せてます
ここまでのリンク先の取り出しサンプル[IE起動とリンクの取り出し サンプル 20080605_IE_Link.zip]←Excel VBAです
ダウンロードして遊んでみてください。
ドキュメントの探りやプロパティ、メソッド、イベント・・・とまだまだ、先は長い?全体の地図が見たいところだけど、未開拓の場所(未発掘のオブジェクト)が私も多くて、全体を示せずに今どこに居るのか?道に迷う感じですみません
読者の声:しっかりしろ、三流ガイド。IEオブジェクトの山で遭難しそうだよ。ken3.org 掲示板の過去LOG→:[保存された過去ログを見る]
Ken3の連絡先:[連絡先@メールアドレス]です。何か相談事があれば気軽に連絡してね(頼りないけど)
せっかくホームページに来ていただいたのに、検索の紹介 ぉぃぉぃ
サイト指定や期間の指定を組み合わせて実行してみてください。
ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOPへ)] / [VBAで楽しく] / [記事一覧] |
カスタム検索
|