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)] |
全ての質問には、答えられませんが、リクエストや質問があったら、[作者(三流君)に質問する] から 気軽に送ってください
挨拶:IE操作 メルマガ バックナンバーです。
概要を見て、これは?と思ったら、タイトルをクリックして本文を読んでください
※ココから下のサンプル、XP+IE6の1つ前の古い環境で作成したメルマガです。そのまま動かない場合もありますが、何かの参考となれば幸いです。
読者様より、IE7対応で↓下記のサイトを勧めていただきました
<www.happy2-island.com 7.1 IEオブジェクトを作る(IE7編)>
↑IE7のオブジェクトの対応が丁寧に書いてありました。VBSだけど参考になると思います
※あと、毎日のようにIE操作はUWSCを使え とメッセージをいただくので、IE操作の人はUWSCもググってみては??
※※私もザボってないで、がんばらねば・・・ってことでやっと三流的なIE7対応方法として[Vista IE7 で CreateObject("InternetExplorer.application") 後 操作できない]をUPしました(2008/05/24)IE8の背中が見えてきたのに遅すぎ(ゴメンなさい)
ここからメールマガジンで書いたIE関係の記事です [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 _ なんて感じで識別して、取り込んでみました。 [No.179 IE操作 .tags("TD") で TDタグを抜いて遊ぶ] テーブルから項目を抜きたかったので、 '.tags("TD")でTDタグを抜く Set objTD = objIE.document.all.tags("TD") でTDの集合を抜き出し、nを使ったループで現在値の文字を探し、次のデータを取り出しました。 '左から3文字が[現在値]のデータを探す 文字現在値の隣の値を抜き出す・・ lngKABUKA = -1 'ありえない価格 −1を入れる※あとでエラーチェックで使う For n = 0 To objTD.Length - 1 'カウンタ0から.length - 1 までまわす。 If Left(objTD(n).InnerTEXT, 3) = "現在値" Then '左から3文字をチェックする lngKABUKA = CLng(objTD(n + 1).InnerTEXT) 'n+1番目を変換し 株価・現在値 Exit For '探し終わったので、TDのループを抜けます End If Next n ↑完成すると、なんでもない処理なんですが、意外とハマりました。 [No.180 IE操作 .parentElement で親のタグを参照?] IEのドキュメント オブジェクトの操作で、 .parentElement で親のタグを参照できたので、調子に乗って株価の取り出し処理を作りチェックしてみました Dim objParent As Object '親のタグ オブジェクト Dim objTagSTRONG As Object 'STRONG の タグを保存する変数 '.tags("DT") で DTタグを抜き出す Dim objDT As Object 'DTの格納用 Set objDT = objIE.document.all.tags("DT") '.tags("DT")でDTタグを抜く 'いろいろなループを作れるけど、カウンタ n でまわしてみる Dim n As Integer Dim x As Integer Dim BOX As Variant BOX = Array("始値", "安値", "高値", "出来高") For n = 0 To objDT.Length - 1 'カウンタ0から.length - 1 までまわす。 For x = 0 To 3 If Left(objDT(n).InnerHTML, 1 + Len(BOX(x))) = BOX(x) & "<" Then '[始値<]を探す Set objParent = objDT(n).parentElement '親オブジェクトを代入 '次にSTRONG 強調表示の値を探す Set objTagSTRONG = objParent.all.tags("STRONG") '.tags("STRONG")でSTRONGタグを抜く '値の表示 Debug.Print BOX(x) & " = " & objTagSTRONG.Item(0).InnerText 'STRONG タグ のテキスト End If Next x Next n ↑ですが、別に無理して .parentElement で親のタグを参照しなくてもよかったり(笑)
まだまだ、書かないといけないIE操作 プロパティやメソッドなどの組み合わせがあるのですが、このあたりで逃げるように失礼します(オイオイ)。更新が遅いけど温かく見守ってください 更新中 まだまだ書きかけ
過去のメールマガジンのリンクが長かったので、下記に移動しました。
[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]
もあわせてみてください。
(↑もしかして書き直さない過去の解説の方がよかったかも?(笑))
せっかくホームページに来ていただいたのに、検索の紹介 ぉぃぉぃ
サイト指定や期間の指定を組み合わせて実行してみてください。
ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOPへ)] / [VBAで楽しく] / [記事一覧] |
カスタム検索
|