2015.09.28みなさん、こんにちは!タカハシ(@ntakahashi0505)です。初心者向けエクセルVBAでIEを操作するシリーズの第4回目です。前回はこちらの記事で【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのですエクセルVBAでIEを操作するシリーズの第3回、今回はIEの読み込み待ちの処理を入れていきます。この処理はVBAでIEを扱う限りはほとんどの場合で必要となる処理ですので、ぜひ覚えて頂ければと思います。tonari-it.com2015.09.22エラーを発生させずにHTMLドキュメントを取得するためにブラウザの読み込み待ち処理を入れる方法をお伝えしました。今回からいよいよ開いたページに対して色々な操作をしていきたいと思います。Each~Nextという繰り返し処理を用いてページ内のリンク先URLを全て取得する方法についてお伝えします。前回のおさらいHTMLのアンカータグの仕組みLinksプロパティでa要素をコレクションとして取得コレクションに含まれる全てのa要素からhref属性の値を取り出すまとめ連載目次:エクセルVBAでIEを操作してWEBスクレイピング前回のおさらい前回のプログラムはこちらでした。Sub「いつも隣にITのお仕事」トップページからHTMLドキュメントを取得して、そのページタイトルを表示するという内容です。While~Loopで読み込み待ちの処理を入れております。ページタイトルは単純にhtmlDoc.Titleで取得することができましたが、今回はこのページ内のリンク先URLをゴソっと取得していきたいと思います。HTMLのアンカータグの仕組みまずVBAでリンク先URLを取得するに先立って、リンク先URLがHTMLではどのように表現されているかを知っておく必要があります。サイト上での表現はいつも隣にITのお仕事こんな感じですね。href="http://tonari-it.com/">いつも隣にITのお仕事</a>こんな風になっています。リンクについては「<a>~</a>」と記述されるタグを使いまして、アンカータグと言います。「href=”~”」の部分はhref属性と言いまして、実際のリンク先のURLをこのダブルクォーテーションで囲っています。このhref属性の値を取得するというのが今回のお題の最終目的となります。Linksプロパティでa要素をコレクションとして取得ページタイトルは1つのページ(つまりHTMLドキュメント)に対して1つしかありませんので、htmlDoc.Titleとすれば簡単に取得することができました。リンク先URLは1つのページに1つしかないということはほとんどありません。JR東日本さんのトップページもたくさんのリンクがあります。エクセルVBAではオブジェクトをゴソっと集合として取り扱うことができる「コレクション」という概念があります。任意のページのa要素をコレクションとして取得する場合は、HTMLDocumentオブジェクトのLinksプロパティを使います。HTMLDocumentオブジェクト.Linksと書きます。コレクションに含まれる全てのa要素からhref属性の値を取り出すLinksプロパティでa要素のコレクションを取得できたら、次はそのコレクションに含まれる全てのa要素からhref属性の値を取り出す作業をします。Each~Nextを使えばOKです。繰り返しの際に都度要素を格納するオブジェクト変数を用意します。HTMLAnchorElement今回、格納するのはa要素ですから、HTMLAnchorElementとしました。Each~Next文を使います。anchorとなります。a要素からhref属性の値を取得する場合は、hrefプロパティを使います。HTMLAnchorElementオブジェクト.hrefHTMLドキュメントが全部を含んでいて大きな器になっていて、その中に色々なものが入れ子構造で含まれていますので、欲しいものを次々に取得していくというのが、WEBスクレイピングの基本の進め方になります。マトリョーシカみたいな感じです。なんとなくノリは理解できますかね?今回はhrefをDebug.Printでイミディエイトウィンドウに出力したいと思います。以上を踏まえてプログラム全文です。Sub実行をしますと無事に全てのリンク先URLを出力することができました。まとめHTMLドキュメントからそのページのa要素を全て取得して、そのリンク先URLつまりhref属性の値を出力することができました。Each~Nextでコレクション内の要素全てについて繰り返す記述方法も理解していただけたと思います。HTMLドキュメントを取り扱う場合は、コレクションはかなり使いますので、使い方に慣れていっていただければと思います。次回はHTMLドキュメントからmetaタグのディスクリプションを取得する方法をお伝えしています。【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする初心者向けエクセルVBAでIEを操作するシリーズ第5回目です。getElementsByNameでディスクリプションなどの要素をname属性を条件として取得する方法についてお伝えします。tonari-it.com2015.10.04SEO好きにはたまりませんね...!連載目次:エクセルVBAでIEを操作してWEBスクレイピングIEを操作してWEBページのデータを取得して、エクセルのデータとして取り込む、つまりWEBスクレイピングをエクセルVBAで実現します。各種WEBページを課題として様々なデータの取得の仕方を解説していきたいと思います。プランノーツ代表、コミュニティ「ノンプロ研」主宰。ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ★フォロー頂ければ嬉しいです。「コミュニティ+講座」形式で継続性&教え合える環境も提供。!ノンプログラマーがプログラミングスキルを身に着ける支援ををするコミュニティ。セミナー・もくもく会・Facebookグループのサポートで「自らで学び続ける力をつける」支援、「教え合うことで学びの価値を上げる」場の提供をしています。関連記事Excel・VBA活用術エクセルVBAでIEを操作するクラスにテーブルのデータを取得するメソッドを追加する方法エクセルVBAでIEスクレイピングをするときに便利なクラスの作り方をお伝えしております。今回は、エクセルVBAでIEを操作するクラスにテーブルのデータを取得してデバッグ出力するメソッドを追加していきます。2019.04.21Excel・VBA活用術OFFSET・INDEX・MATCHでVLOOKUPに出来ないマイナス方向にある列の値を取得しようVLOOKUPでは検索値と左端の範囲が紐付けないといけないため、検索列のマイナス方向つまり左側にある値を取得ができない仕様になっていますよね。諦めて表を組み替えることをせずに関数OFFSET・INDEXを組み合わせることでVLOOKUPに出来なかったマイナス方向にある値の取得をご紹介いたします。Each~Next文でフォルダ内のブック全てを開く方法エクセルVBAを使ってバラバラの経費精算書のデータを集約するシリーズです。Each~Next文でフォルダ内の複数のワークブックの全てを順番に参照して処理していく方法についてお伝えします。【初心者向けエクセルVBA】日付データから年・月・日を取り出す初心者向けエクセルVBAのシリーズということで請求書を作成するマクロについてお伝えしています。いうことで、今回はエクセルVBAで日付データから年、月、日をそれぞれ取り出す関数を紹介します。【エクセルVBA】GetNamespaceメソッドでOutlookのデータフォルダにアクセスする方法GetNameSpaceメソッドでOutlookのデータフォルダにアクセスする方法をご紹介しています。このメソッドでOutlookのNameSpaceオブジェクトを取得すれば、メール、連絡先、予定表などのデータフォルダにアクセスして、更にその中のデータを読込んだり、エクセルシートに書き出したりすることができますよ。不要なシートを作らせない!エクセルのデフォルトシート数を変更する方法エクセルのブックを開いたときに自動的に作成されるシート数を、任意の数に変更する方法をご紹介しています。オプションから基本設定を開いて、該当項目の値を設定するだけで変更完了!「ブックを開いたときに不要なシートがある!」「毎回不要なシートを削除するのが面倒だ!」という方にオススメです。AM楽しく読ませていただいております。LINKSでURLが全部出てくることがわかりました。AMtakaさんコメントありがとうございます。「abc.com/123/」を含むという条件式で取り出せば良いということですよね。elとすればよいかと思います。PMタカハシ様VBA初心者の横山と申します。楽しい記事をありがとうございます。分かりやすく丁寧な解説でとても役に立っています。貴方様の本記事の最終のプログラム全文をコピーしてテストしたら、16行目の下記の命令で,「型が一致していない」のエラーが発生します。解決策のご指導を頂けたら嬉しいです。‘objIEで読み込まれているHTMLドキュメントをセット★この記事に先だって、ツール>参照設定>を実施済みで現状を確認したら以下のライブラリにチェックがありました。登さんコメントありがとうございます。私の環境で再度確認しましたが、特に問題なく動作しているようです。PMタカハシ様お世話になります。別コメントで質問を送信した横山です。迅速なお返事に感謝します。その後、自分で下記の調査をしましたので、参考として送ります。お返事の作成に参考になればとしてお報せします。変数の型を調べたら、?typename(objIE.documen)...>HTMLDocument?typename(htmlDoc)...>Nothingとなり、確かに型が一致していません。‘HTMLドキュメントオブジェクトを準備と有るので、この型宣言分が無視されています。PMタカハシ様お世話になります。別コメントで質問した横山です。自分努力により以下の手順により解決できたので報告します。(解決できた手順)1)VBE画面>ツール>オプション>”□変数の宣言を強制する。型宣言文を無視させる。なり、処理もOKでした。セットされたのではないでしょうか?★なお、上記手順1)で、”□変数の宣言を強制する。15行目をコメントアウトしたままでも実行時にエラーになりませんでした。この為、このトラブルは自分環境特有の問題ではないかと吸いさるする次第です。この状態で実行すると、やはり正常動作しました。結論として、15行目の型宣言があるとNG,なければOKという事です。15行目が問題でした。今回は、自分の問題で貴殿の貴重な時間を浪費させてしまい、ごめんなさいです。今後もぜひ楽しい解説を期待しています。上記と同様趣旨の報告を送信していますが、正しく送信できたのか分からないので再入力・再送信しました、もしもダブっていたら帆面あさいです。「コミュニティ+講座」形式で継続性&教え合える環境も提供。詳細・お申込はこちら隣ITを応援する当ブログを「応援したい!」「役に立ったよ!」というお気持ちを、コチラからお支払いただくことができます。日々更新の活力倍増いたします。※PayPalアカウントが必要です。※金額は変更可能です。Platform23HTML・CSS32iPhone・アプリ29Monaca・スマホアプリ開発7PC全般・Windows86PowerPoint・VBA28Python87RPA1VBScript15Vue.js・JavaScript13WEBサービス・クラウド68WordPress・ブログ88Word・VBA42コミュニティ・イベント109セミナーのお知らせ11チャットワーク72データ分析・アクセス解析40仕事・生産性・働き方73動画配信8商業出版21起業・フリーランス72電子書籍・Kindle3運営会社プランノーツは"IT×働き方改革"をお手伝いする会社です。「コミュニティ+講座」形式で継続性&教え合える環境も提供。詳細・お申込はこちら隣ITを応援する当ブログを「応援したい!」「役に立ったよ!」というお気持ちを、コチラからお支払いただくことができます。日々更新の活力倍増いたします。※PayPalアカウントが必要です。※金額は変更可能です。Platform23HTML・CSS32iPhone・アプリ29Monaca・スマホアプリ開発7PC全般・Windows86PowerPoint・VBA28Python87RPA1VBScript15Vue.js・JavaScript13WEBサービス・クラウド68WordPress・ブログ88Word・VBA42コミュニティ・イベント109セミナーのお知らせ11チャットワーク72データ分析・アクセス解析40仕事・生産性・働き方73動画配信8商業出版21起業・フリーランス72電子書籍・Kindle3運営会社プランノーツは"IT×働き方改革"をお手伝いする会社です。Scriptが「V8ランタイム」をサポート!モダンなECMAScript構文が使えるようになった2020.02.072020.02.08GASでコピーしたGoogleスライドのプレゼンテーションを取得する方法2020.02.052020.02.05Facebookページいつも隣にitのお仕事タイトルとURLをコピーしました。