パソコンスキルの教科書

パソコンスキルの教科書

東京大学大学院卒。博士課程に進学を志すも、担当教授と折が合わず、無職になる。医者を目指すも結局断念。田舎で派遣社員として働く。「スキルがなければ、仕事ももらえない」と悟り、ビジネススキルを学ぶ。プログラミング、英語を学び、一部上場企業へ転職。年間100時間以上の業務効率化を行い、社内講師に抜擢。海外の案件を担当し、数億円のプロジェクトに携わる。個人の事業でも、月売上100万を達成。現在は、自分の価値を高めるためのスキル向上支援を行う

VBAでie操作!リンクやボタンを自動クリックしてウェブ情報を取得

f:id:gene320:20171119182453p:plain

VBAでインターネットから情報を取得するとき、リンクやボタンを自動クリックするプログラムを作る必要があります。

このプログラムを入れておくことで、自動で次のページへ移動させることができます。そうすれば、ウェブの2ページ以降も、自動で情報を取得できます。

しかし、リンクやボタンを自動クリックしてウェブ情報を取得するプログラムはあまり紹介されていません。

そこで、この記事では、リンクやボタンを自動クリックするプログラムを具体的な事例をもとに紹介します。

ウェブ情報を取得して、エクセルに出力する(ハイパーリンク付)

この記事で紹介するプログラムを使ってできることを説明します。

この記事で目指すこと

[1] 「パソコンスキルの教科書」の記事のタイトルとURLを取得して、エクセルに出力する。

[2] エクセルに出力すると同時に、ハイパーリンクをつけてエクセルから記事にアクセスできるようにする。

わかりやすくいうと、「パソコンスキルの教科書」のウェブページにおいて、以下の赤枠で囲んだ記事タイトルとリンク先を取得して、エクセルに出力します。

f:id:gene320:20171119172456p:plain

ただし、以下のように「次のぺージ」がありますので、次のページに自動で進むようにプログラムを組む必要があります。

f:id:gene320:20171119172542p:plain

そうしないと、情報をすべて取得できません。

この記事で紹介するプログラムを実行すると

この記事で紹介するプログラムを実行すると、「パソコンスキルの教科書」にアクセスして、記事タイトルとリンクを取得します。取得した記事タイトルとリンクは、エクセルに一覧で取得します。そのとき、ハイパーリンクを付けます。

マクロを起動前

f:id:gene320:20171119172645p:plain

マクロを起動後

f:id:gene320:20171119172654p:plain

ここでは、「パソコンスキルの教科書」にアクセスして、記事タイトルとリンクを取得しています。

実務では、定期更新されるサイト情報を取得して、エクセルに一覧にできればかなり使えます。実際に私が利用していたのは、団体が発出するガイダンス情報を取得していました。

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を開いて頂いて、「ツール」→「参照設定」

f:id:gene320:20170613213650p:plain

2.この二つのライブラリにチェックを入れて、OKをクリック
・Microsoft HTML Object Library
・Microsoft Internet Controls

f:id:gene320:20170613213737p:plain

これで、ウェブ操作するマクロが動くようになります。

ウェブ上のリンクをクリックしてエクセルに出力|サンプルコード

それでは、プログラムを解説していきます。

コードは以下の通りです。

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に関しては、説明を省略します。それ以外の部分については、こちらの記事で紹介していますので、参考にしてください。

www.fastclassinfo.com

それでは、コード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

このコードでは、記事のタイトルとリンクを取得して、エクセルに出力します。

このコードを組むときに大切なのは、ウェブページのソース情報を確認することです。

ソース情報とは、ウェブページを構成しているプログラム情報です。以下のようなものをさします。

f:id:gene320:20171119173545p:plain

ウェブページにアクセスした状態で、[Ctrl] + [U] のショートカットキーを押します。(ただし、このショートカットキーはインターネットエクスプローラーに限ります)

そうすると、ウェブページのソースが取得できます。

今回、取得するのは、記事のタイトルとリンクです。したがって、記事のタイトルやリンク付近のウェブソースを確認します。

そうすると、 とあるaタグ内に、記事のタイトルとURLが含まれていることが分かります。

f:id:gene320:20171119173729p:plain

そこで、このaタグを取得して、そこから記事のタイトルとURLを抜き出します。

つまり、以下の流れで、記事のタイトルとURLを抜き出します。

[1] ウェブページのaタグを取得する
[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タグは、以下のようなコードです。

f:id:gene320:20171119174051p:plain

今回のウェブソースであれば、"permalink"の文字列が含まれていれば、、記事のタイトルとURLが含まれています。(これは、ウェブソース内ので検索をかけて、チェックしておく必要があります)

したがって、"permalink"の文字列が含まれているかどうかを確認します。

10行目:kenmei = objtag.innerText

kenmei に objtag.innerTextを入れ込みます。このプログラムでは、innerTextとは、そのまま記事タイトルになります。

innerTextとは、タグにはさまれている文字列の部分です。具体的に言うと、以下の赤枠の部分です。

f:id:gene320:20171119174126p:plain

このプログラムでは、そのまま記事のタイトルになりますので、そのまま記事タイトルとして利用します。

11行目:n1 = InStr(objtag.outerHTML, "href=")

今回は、URLのみを取得したい。つまり、以下のコードから

f:id:gene320:20171119173729p:plain

余計な部分を削ぎ落して、以下の部分だけを取得したいわけです。

f:id:gene320:20171119174232p:plain

そこで、instr関数を使って、前半部分①と後半部分②の余分をカットします。

f:id:gene320:20171119174251p:plain

まずは、前半部分①は、instr関数を使って、そぎ落とし部分を見つけます。今回のプログラムでは、「href=」 の部分を利用することにしました。

なお、あなたのやりたいことに応じて、「href=」でいいかどうかは変わります。この部分は、取得したい情報やウェブソースによって、毎回変更させる必要があります。

12行目:n2 = InStr(objtag.outerHTML, """>")

後半部分②も、instr関数を使って、そぎ落とし部分を見つけます。

f:id:gene320:20171119174251p:plain

今回のプログラムでは、「">」 の部分を利用することにしました。

繰り返しになりますが、やりたいことに応じて、「">」でいいかどうかは変わります。

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タグの内、"次のページ"の文字列が含まれるのは、以下の一箇所だけです。

f:id:gene320:20171119180349p:plain

この場合、innerTextを取得すれば、以下のウェブソースの内、赤枠だけを取得できます。

f:id:gene320:20171119180513p:plain

今回のウェブソースであれば、紹介したプログラムで作動します。しかし、次のページが数箇所あるウェブソースの場合、少し工夫が必要になります

そのため、あなたがプログラムを作るときは、ウェブソース内で一度検索をかけます。そして、次のページへが複数箇所あるかどうかチェックしておく必要があります)

5行目:objtag.Click

このプログラムを使えば、指定したリンクをクリックさせることができます。今回の事例でいえば、「次のページへ」をクリックします。

6行目以降

こちらの記事で紹介していますので、省略します。

www.fastclassinfo.com

テンプレートファイルをダウンロードしたい方はコチラから

紹介したIEを操作するコードを一から作るのは大変なので、記事の中で紹介したマクロのコードが入ったファイルは無料でダウンロードできるようにします。以下のフォームにメールアドレスを入力いただくと、返信メールからエクセルファイルをダウンロードできます。

ぜひご活用ください。

IE操作をもっと知りたい!高度なレベルにチャレンジしてみたいなら

もし、もっと具体的にIE操作について知りたいなら、こちらの記事を読んでみてください。VBAでヤフオクのデータを取得し、Excelへ出力するマクロを紹介しています。ダウンロードしてすぐに使えるテンプレート付ですので、きっとお役に立てるはずです。

www.fastclassinfo.com

IE操作のコードを自力で書くには?

この記事を読んだけど、「よくわからない」、「自分で編集できそうにない」と感じるかもしれません。

もし、そう感じる場合は、基礎を完全に理解できていない可能性があります。マクロの基礎を理解していない場合、IE操作はかなりハードルが高いです。

まずは、エクセルマクロの基礎から学ぶことをオススメします。土台ができていない内に学ぶと、使いこなす前に挫折にしてしまいます。

もしきちんと学ぶなら、こちらの無料動画がオススメです。基礎を確実に学んでから、トライしてみてください。

この記事を読んだ方へのオススメ

「マクロの力を実感したい」と感じているなら、こちらの記事がオススメです。マクロが入ったエクセルファイルをダウンロードできるようにしています。もし詳細が知りたいなら、以下の記事で紹介していますので、合わせて読んでみてください。

サンプル1|月末処理の自動処理する
サンプル2|エクセルで在庫管理するマクロ
サンプル3|outlookのメールを自動送信する
サンプル4|outlookの受信メールをエクセルに一覧にして、添付ファイルも保管する
サンプル5|エクセルマクロVBAで大量データを比較・照合してマッチングする方法
サンプル6|ヤフオクの情報を自動取得して、エクセルに出力する
サンプル7|エクセルの情報をワードに差し込み、印刷まで行う

ぜひご活用ください。

エクセルマクロでできることを知りたいなら

www.fastclassinfo.com

エクセルマクロを独学で習得したいなら

www.fastclassinfo.com

エクセルマクロとは?もっと詳しく知りたいなら

www.fastclassinfo.com

エクセルマクロの難易度や習得までの期間を知りたいなら

www.fastclassinfo.com