VBAでインターネットから情報を取得するとき、リンクやボタンを自動クリックするプログラムを作る必要があります。
このプログラムを入れておくことで、自動で次のページへ移動させることができます。そうすれば、ウェブの2ページ以降も、自動で情報を取得できます。
しかし、リンクやボタンを自動クリックしてウェブ情報を取得するプログラムはあまり紹介されていません。
そこで、この記事では、リンクやボタンを自動クリックするプログラムを具体的な事例をもとに紹介します。
ウェブ情報を取得して、エクセルに出力する(ハイパーリンク付)
この記事で紹介するプログラムを使ってできることを説明します。
[1] 「パソコンスキルの教科書」の記事のタイトルとURLを取得して、エクセルに出力する。
[2] エクセルに出力すると同時に、ハイパーリンクをつけてエクセルから記事にアクセスできるようにする。
わかりやすくいうと、「パソコンスキルの教科書」のウェブページにおいて、以下の赤枠で囲んだ記事タイトルとリンク先を取得して、エクセルに出力します。
ただし、以下のように「次のぺージ」がありますので、次のページに自動で進むようにプログラムを組む必要があります。
そうしないと、情報をすべて取得できません。
この記事で紹介するプログラムを実行すると
この記事で紹介するプログラムを実行すると、「パソコンスキルの教科書」にアクセスして、記事タイトルとリンクを取得します。取得した記事タイトルとリンクは、エクセルに一覧で取得します。そのとき、ハイパーリンクを付けます。
ここでは、「パソコンスキルの教科書」にアクセスして、記事タイトルとリンクを取得しています。
実務では、定期更新されるサイト情報を取得して、エクセルに一覧にできればかなり使えます。実際に私が利用していたのは、団体が発出するガイダンス情報を取得していました。
1週間に一度、アクセスして、新着のガイダンス情報があれば、更新するようにしておきました。outlookと連動させれば、チーム内で新着情報を共有させることところまでできます。
それでは、実際にプログラムの作り方を解説していきます。
VBAのプログラムを作る前にIE操作の参照設定を行う
エクセルVBAでIEを操作するためのプログラミングに入る前に準備することがあります。
それは、VBEの参照設定を変更することです。参照設定とは、機能拡張させること、です。
エクセルVBAでIEを操作するためには、参照設定で以下の2つをライブラリに追加する必要があります。
1.VBEを開いて頂いて、「ツール」→「参照設定」
2.この二つのライブラリにチェックを入れて、OKをクリック
・Microsoft HTML Object Library
・Microsoft Internet Controls
この設定を変更しないとマクロが動きません。忘れずに設定するようにしてください。
VBEの参照設定でInternetExplorer型を追加する方法
Microsoft Internet Controlsにチェックを入れることで、IE操作の設定ができるようになります。
具体的な設定方法は以下の通りです。
1.VBEを開いて頂いて、「ツール」→「参照設定」
2.この二つのライブラリにチェックを入れて、OKをクリック
・Microsoft HTML Object Library
・Microsoft Internet Controls
これで、ウェブ操作するマクロが動くようになります。
ウェブ上のリンクをクリックしてエクセルに出力|サンプルコード
それでは、プログラムを解説していきます。
コードは以下の通りです。
Option Explicit Sub jouhou_syutoku() '''---コード1|インターネットに接続してブラウザを開く Dim objIE As Object Dim ws As Worksheet Set ws = Worksheets("一覧表") Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.fastclassinfo.com/archive" Call IEWait(objIE) Call WaitFor(5) Call title(objIE, ws) Call nextpage(objIE) Call title(objIE, ws) objIE.Quit Set objIE = Nothing End Sub '''---コード2|件名とURLを取得 Sub title(ByRef objIE As Object, ByRef ws As Worksheet) Dim i, n1, n2 As Long Dim kenmei, url As String Dim objtag As Object i = Range("A65536").End(xlUp).Row + 1 For Each objtag In objIE.Document.getElementsByTagName("a") If InStr(objtag.outerHTML, "permalink") > 0 Then kenmei = objtag.innerText n1 = InStr(objtag.outerHTML, "href=") n2 = InStr(objtag.outerHTML, """>") url = Mid(objtag.outerHTML, n1 + 6, n2 - n1 - 6) Range("A" & i).Value = i - 1 Range("B" & i).Value = kenmei ws.Hyperlinks.Add anchor:=ws.Range("B" & i), Address:=url i = i + 1 End If Next End Sub '''---コード3|次のページへ Sub nextpage(ByRef objIE As Object) Dim objtag As Object For Each objtag In objIE.Document.getElementsByTagName("a") If InStr(objtag.innerText, "次のページ") > 0 Then objtag.Click Call IEWait(objIE) Call WaitFor(5) Exit For End If Next End Sub '''---コード4|IEを待機する関数 Function IEWait(ByRef objIE As Object) Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop End Function '''---コード5|指定した秒だけ停止する関数 Function WaitFor(ByVal second As Integer) Dim futureTime As Date futureTime = DateAdd("s", second, Now) While Now < futureTime DoEvents Wend End Function
リンクやボタンをクリックするコードの解説
この記事で紹介しているプログラムの中で、リンクやボタンをクリックするプログラムに関わるのは、コード2とコード3です。
コード1、コード4、コード5に関しては、説明を省略します。それ以外の部分については、こちらの記事で紹介していますので、参考にしてください。
それでは、コード2とコード3について解説します。
コード2|件名とURLを取得 を詳しく解説
Sub title(ByRef objIE As Object, ByRef ws As Worksheet) Dim i, n1, n2 As Long Dim kenmei, url As String Dim objtag As Object i = Range("A65536").End(xlUp).Row + 1 For Each objtag In objIE.Document.getElementsByTagName("a") If InStr(objtag.outerHTML, "permalink") > 0 Then kenmei = objtag.innerText n1 = InStr(objtag.outerHTML, "href=") n2 = InStr(objtag.outerHTML, """>") url = Mid(objtag.outerHTML, n1 + 6, n2 - n1 - 6) Range("A" & i).Value = i - 1 Range("B" & i).Value = kenmei ws.Hyperlinks.Add anchor:=ws.Range("B" & i), Address:=url i = i + 1 End If Next End Sub
このコードでは、記事のタイトルとリンクを取得して、エクセルに出力します。
このコードを組むときに大切なのは、ウェブページのソース情報を確認することです。
ソース情報とは、ウェブページを構成しているプログラム情報です。以下のようなものをさします。
ウェブページにアクセスした状態で、[Ctrl] + [U] のショートカットキーを押します。(ただし、このショートカットキーはインターネットエクスプローラーに限ります)
そうすると、ウェブページのソースが取得できます。
今回、取得するのは、記事のタイトルとリンクです。したがって、記事のタイトルやリンク付近のウェブソースを確認します。
そうすると、 とあるaタグ内に、記事のタイトルとURLが含まれていることが分かります。
そこで、このaタグを取得して、そこから記事のタイトルとURLを抜き出します。
つまり、以下の流れで、記事のタイトルとURLを抜き出します。
[2] aタグの内、記事タイトルとURLを含んでいるものだけを拾う
[3] 記事タイトルとURLの情報だけを抜き出す
それでは、具体的にプログラムを解説します。
とくに重要な8行目以降のみに限定します。
8行目:For Each objtag In objIE.Document.getElementsByTagName("a")
ウェブソースのaタグ情報をすべて取得する
9行目:If InStr(objtag.outerHTML, "permalink") > 0 Then
aタグの情報をouterHTMLとして取得し、"permalink"の文字列が含まれているかどうかチェックします。
今回、扱うウェブソースの場合、"permalink"の文字列が含まれるaタグは、以下のようなコードです。
今回のウェブソースであれば、"permalink"の文字列が含まれていれば、、記事のタイトルとURLが含まれています。(これは、ウェブソース内ので検索をかけて、チェックしておく必要があります)
したがって、"permalink"の文字列が含まれているかどうかを確認します。
10行目:kenmei = objtag.innerText
kenmei に objtag.innerTextを入れ込みます。このプログラムでは、innerTextとは、そのまま記事タイトルになります。
innerTextとは、タグにはさまれている文字列の部分です。具体的に言うと、以下の赤枠の部分です。
このプログラムでは、そのまま記事のタイトルになりますので、そのまま記事タイトルとして利用します。
11行目:n1 = InStr(objtag.outerHTML, "href=")
今回は、URLのみを取得したい。つまり、以下のコードから
余計な部分を削ぎ落して、以下の部分だけを取得したいわけです。
そこで、instr関数を使って、前半部分①と後半部分②の余分をカットします。
まずは、前半部分①は、instr関数を使って、そぎ落とし部分を見つけます。今回のプログラムでは、「href=」 の部分を利用することにしました。
なお、あなたのやりたいことに応じて、「href=」でいいかどうかは変わります。この部分は、取得したい情報やウェブソースによって、毎回変更させる必要があります。
12行目:n2 = InStr(objtag.outerHTML, """>")
後半部分②も、instr関数を使って、そぎ落とし部分を見つけます。
今回のプログラムでは、「">」 の部分を利用することにしました。
繰り返しになりますが、やりたいことに応じて、「">」でいいかどうかは変わります。
13行目:url = Mid(objtag.outerHTML, n1 + 6, n2 - n1 - 6)
Mid関数を使って、このaタグの内、(n1+6)番目の文字列から、(n2-n1-6)分の文字列を取得します。
instr関数は、「href=」の内、「h」がある場所を取得します。そのため、帳尻を合わせるために、n1 + 6 を付けます。そうすることで、urlに、http://www.fastclassinfo.com/entry/vba_outlook_subfolder_analysisをずれることなく格納できます。
また、n2-n1-6としているのも、urlにhttp://www.fastclassinfo.com/entry/vba_outlook_subfolder_analysisをずれることなく格納するためです。
これを5にしたり、7にしたりすると、ずれが生じます。ttp://www.fastclassinfo.com/entry/vba_outlook_subfolder_analysis" になってしまい、エラーが出ます。
14行目:Range("A" & i).Value = i - 1
エクセルシートのA列に No を出力する。Noは(i-1)で取得できる。
15行目:Range("B" & i).Value = kenmei
エクセルシートのB列に 記事タイトル を出力する。
16行目:ws.Hyperlinks.Add anchor:=ws.Range("B" & i), Address:=url
エクセルシートのB列に 記事タイトル にハイパーリンクをつける
17行目:i = i + 1
i = i +1 をして、エクセルの行を一つ下へすすめる
このように、ウェブ解析を進めていきます。
コード3|次のページへ を詳しく解説
コード3をおさらいすると、以下のプログラムです。
Sub nextpage(ByRef objIE As Object) Dim objtag As Object For Each objtag In objIE.Document.getElementsByTagName("a") If InStr(objtag.innerText, "次のページ") > 0 Then objtag.Click Call IEWait(objIE) Call WaitFor(5) Exit For End If Next End Sub
それでは、詳しく解説してきます。
3行目:For Each objtag In objIE.Document.getElementsByTagName("a")
このプログラムを使うことで、ウェブソースのaタグ情報を一つずつ取得できます。。
4行目:If InStr(objtag.innerText, "次のページ") > 0 Then
取得したaタグの情報のinnerTextの中に、"次のページ"の文字列が含まれているかどうかチェックします。
今回、扱うウェブソースの場合、aタグの内、"次のページ"の文字列が含まれるのは、以下の一箇所だけです。
この場合、innerTextを取得すれば、以下のウェブソースの内、赤枠だけを取得できます。
今回のウェブソースであれば、紹介したプログラムで作動します。しかし、次のページが数箇所あるウェブソースの場合、少し工夫が必要になります。
そのため、あなたがプログラムを作るときは、ウェブソース内で一度検索をかけます。そして、次のページへが複数箇所あるかどうかチェックしておく必要があります)
5行目:objtag.Click
このプログラムを使えば、指定したリンクをクリックさせることができます。今回の事例でいえば、「次のページへ」をクリックします。
6行目以降
こちらの記事で紹介していますので、省略します。
テンプレートファイルをダウンロードしたい方はコチラから
紹介したIEを操作するコードを一から作るのは大変なので、記事の中で紹介したマクロのコードが入ったファイルは無料でダウンロードできるようにします。以下のフォームにメールアドレスを入力いただくと、返信メールからエクセルファイルをダウンロードできます。
ぜひご活用ください。
IE操作をもっと知りたい!高度なレベルにチャレンジしてみたいなら
もし、もっと具体的にIE操作について知りたいなら、こちらの記事を読んでみてください。VBAでヤフオクのデータを取得し、Excelへ出力するマクロを紹介しています。ダウンロードしてすぐに使えるテンプレート付ですので、きっとお役に立てるはずです。
IE操作のコードを自力で書くには?
この記事を読んだけど、「よくわからない」、「自分で編集できそうにない」と感じるかもしれません。
もし、そう感じる場合は、基礎を完全に理解できていない可能性があります。マクロの基礎を理解していない場合、IE操作はかなりハードルが高いです。
まずは、エクセルマクロの基礎から学ぶことをオススメします。土台ができていない内に学ぶと、使いこなす前に挫折にしてしまいます。
もしきちんと学ぶなら、こちらの無料動画がオススメです。基礎を確実に学んでから、トライしてみてください。
「マクロの力を実感したい」と感じているなら、こちらの記事がオススメです。マクロが入ったエクセルファイルをダウンロードできるようにしています。もし詳細が知りたいなら、以下の記事で紹介していますので、合わせて読んでみてください。
サンプル1|月末処理の自動処理する
サンプル2|エクセルで在庫管理するマクロ
サンプル3|outlookのメールを自動送信する
サンプル4|outlookの受信メールをエクセルに一覧にして、添付ファイルも保管する
サンプル5|エクセルマクロVBAで大量データを比較・照合してマッチングする方法
サンプル6|ヤフオクの情報を自動取得して、エクセルに出力する
サンプル7|エクセルの情報をワードに差し込み、印刷まで行う
ぜひご活用ください。