VBAではシート内だけではなく、ネットの情報も扱うことができます。
そして、その方法はいくつかありますが、本記事ではIE(Internet Explorer)を操作したやり方を紹介します。
また、本記事のゴールは「検索エンジンで検索したのちの検索結果画面の情報を取得し、その情報をシートに書き込む」となります。
では、さっそく解説していきます。
【前準備】検索結果のHTMLの確認
まず、ここでは検索結果の情報を取得するための知識を紹介します。
ここでの内容はザックリ理解してもらえればと思います。
※本記事では基本的なHTMLの説明は長くなるので省略します。
検索結果画面のURLを確認
まずは「取得したいキーワードを検索エンジンに入力して検索してください。
※本記事では「ボクログ VBA」と検索しています。
そうすると下のような検索結果が表示されます。
そして、検索結果画面のURLは「https://www.google.co.jp/search?q=〇〇(検索ワード)」という形になります。
※検索ワードが複数ある場合には、そのワードの間に「+」が入力される。
検索結果画面のHTMLを確認
次にネット上で表示された情報を取得する際には『HTML』を確認する必要があります。
その本記事で重要な確認方法の操作は下の通りです。
1.検索結果画面を表示した状態でキーボードの「F12」(もしくは「Ctrl+Shift+i」)を押します。
そうすると画面の右側に、その画面の構成であるHTMLが表示されます。
2.「表示された右側の画面を一度クリック」し、そのあとに「Ctrl+F」を押してください。
そうすると、右下に「ページ検索欄」が表示されるので、そこに「”g”」と入力してください。
その検索結果では「 “g”」部分に色が付きます。
その「”g”」が含まれた一行にカーソルをあてると、左側の検索結果画面のその一行に関連するページに色が付きます。
加えて、HTMLの「class = “g”」の全ては検索結果画面に表示されたページ情報に関連していることが分かるかと思います。
この知識は後にページの情報を取得するときに使うので、覚えておいてください。
HTML上の値を取得する方法
HTML上の値は主に「タグ・クラス・id」の3つで取得できます。
【タグ:.getElementsByTagName(tag名)】
例:見出し(h2 h3 h4)をよく使う
【クラス:.getElementsByClassName(class名)】
例:<div class=”〇〇“>
【id:.getElementById(id名)】
例:<div class=”〇〇” id=”△△“>
Google検索結果画面の情報を取得する
では、さっそく本題である「検索エンジンで検索したのちの検索結果画面の情報を取得し、その情報をシートに書き込む」の解説になります。
本記事では参照設定をしない方法でやっていきます。
ちなみに参照設定する場合は下を追加してください。
・Microsoft HTML Object Library
・Microsoft Internet Controls
ここでは下のように順を追って説明していきます。
1.IEを表示(起動)する
2.Googleの検索画面を表示する
3.検索結果画面の特定のデータを取得する
4.検索結果の一番目のページの「URL・タイトル・説明」を取得する
5.検索結果の全てのページの「URL・タイトル・説明」を取得する
6.IEを閉じる
では、さっそく解説をしていきます。
IEを表示(起動)する
まず、ネットにアクセスするための「IE(Internet Explorer)の起動」です。
下がIEを起動するためのコードになります。
1 2 3 4 5 6 7 8 |
Sub sample1() ' --- IEを表示(起動)する Dim objIE As Object Set objIE = CreateObject("Internetexplorer.Application") ' IEオブジェクトを生成 objIE.Visible = True 'IEを表示 End Sub |
5行目でInternetexplorer.Applicationをインスタンス化して、コード上で扱うことができるようにしています。
そして、6行目で上のオブジェクトのVisibleプロパティでIEを表示(True)にしています。
上のコードを実行すると、下のような真っ新なIEが表示されます。
Googleの検索画面を表示する
次に「Googleで任意のワードを検索したときの結果画面の表示」です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub sample2() ' --- IEを表示(起動)する Dim objIE As Object Set objIE = CreateObject("Internetexplorer.Application") ' IEオブジェクト objIE.Visible = True 'IEを表示 ' --- Googleの検索画面を表示する ' 今回は「ボクログ+VBA」で検索する Dim searchURL As String ' 表示するURL searchURL = "https://www.google.co.jp/search?q=ボクログ+VBA" objIE.Navigate searchURL '指定したURLを開く End Sub |
14行目でIEオブジェクトのNavigateメソッドで指定したURLをIEで表示させています。
上でも説明しましたが、検索エンジンで入力されたワードは「https://www.google.co.jp/search?q=ボクログ+VBA」とURLに追加されるので、コード上でも同様の記述にしています。
上のコードを実行すると下のような検索結果画面が表示されます。
検索結果画面の特定のデータを取得する
今回は「検索結果画面のヒットしたページの情報を取得」します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Sub sample3() ' --- IEを表示(起動)する Dim objIE As Object Set objIE = CreateObject("Internetexplorer.Application") ' IEオブジェクト objIE.Visible = True 'IEを表示 ' --- Googleの検索画面を表示する ' 今回は「ボクログ+VBA」で検索する Dim searchURL As String ' 表示するURL searchURL = "https://www.google.co.jp/search?q=ボクログ+VBA" objIE.Navigate searchURL '指定したURLを開く ' --- 画面が表示されるまでの待機時間を設定する ' ※画面がしっかり表示されないとエラーが生じる Application.Wait Now() + TimeValue("00:00:03") ' --- 検索結果画面の特定のデータを取得する ' --- 検索結果画面に表示されているページのデータは全てクラス"g"で指定されている Dim htmlDoc As Object Set htmlDoc = objIE.Document Dim pageData As Object Set pageData = htmlDoc.getElementsByClassName("g") End Sub |
上の章の「HTML上の値を取得する方法」でHTMLの情報を取得するときには『タグ・クラス・id』を使うと説明しました。
その知識を使います。
ここでは検索結果画面に表示されている9つのページの情報を取得するために『class=”g”』で取得しています。
※上の章の「検索結果画面のHTMLを確認」でも書いたが、ヒットしたページの情報は『class=”g”』で括られている。
そして、最終的に28行目でpageData変数には9ページ分の情報が格納されています。
検索結果の一番目のページの「URL・タイトル・説明」を取得する
ここでは「一番上のページのURL・タイトル・ページ説明を取得」して確認していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
Sub sample4() ' --- IEを表示(起動)する Dim objIE As Object Set objIE = CreateObject("Internetexplorer.Application") ' IEオブジェクト objIE.Visible = True 'IEを表示 ' --- Googleの検索画面を表示する ' 今回は「ボクログ+VBA」で検索する Dim searchURL As String ' 表示するURL searchURL = "https://www.google.co.jp/search?q=ボクログ+VBA" objIE.Navigate searchURL '指定したURLを開く ' --- 画面が表示されるまでの待機時間を設定する ' ※画面がしっかり表示されないとエラーが生じる Application.Wait Now() + TimeValue("00:00:03") ' --- 検索結果画面の特定のデータを取得する ' --- 検索結果画面に表示されているページのデータは全てクラス"g"で指定されている Dim htmlDoc As Object Set htmlDoc = objIE.Document Dim pageData As Object Set pageData = htmlDoc.getElementsByClassName("g") ' --- 検索結果の1つ目のページの「タイトル・URL・詳細説明」を取得する Dim title As String ' タイトル title = pageData(0).getElementsByTagName("h3")(0).innerText Dim url As String ' URL url = pageData(0).getElementsByClassName("iUh30 Zu0yb")(0).innerText Dim detail As String ' 詳細説明 detail = pageData(0).getElementsByClassName("aCOpRe")(0).innerText ' --- 結果確認 Debug.Print "URL:" & url & vbCrLf & _ "タイトル:" & title & vbCrLf & _ "ページの説明:" & detail End Sub |
上のコードではページの情報を取得する際の記述では「pageData(0)」としています。
この変数の中身は取得したページ情報はインデックス0から始まり、インデックス9までとなっています。
つまり、「このインデックス数を変えることで他のページの情報も取得できる」ということです。
そして、今回はインデックス0に格納された要素である1番上のページの情報を取得しています。
ちなみに上のコードを実行すると下のようにイミディエイトウィンドウに表示されます。
検索結果の全てのページの「URL・タイトル・説明」を取得する
上では一番上のページの情報取得をします。
ここでは、最後に検索結果画面全てのページの「URL・タイトル・ページの説明」を取得し、シートに書き込むまでをやってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
Sub sample5() ' --- IEを表示(起動)する Dim objIE As Object Set objIE = CreateObject("Internetexplorer.Application") ' IEオブジェクト objIE.Visible = True 'IEを表示 ' --- Googleの検索画面を表示する ' 今回は「VBAとは」で検索する Dim searchURL As String ' 表示するURL searchURL = "https://www.google.co.jp/search?q=VBAとは" objIE.Navigate searchURL '指定したURLを開く ' --- 画面が表示されるまでの待機時間を設定する ' ※画面がしっかり表示されないとエラーが生じる Application.Wait Now() + TimeValue("00:00:03") ' --- 検索結果画面の特定のデータを取得する ' --- 検索結果画面に表示されているページのデータは全てクラス"g"で指定されている Dim htmlDoc As Object Set htmlDoc = objIE.Document Dim pageData As Object Set pageData = htmlDoc.getElementsByClassName("tF2Cxc") ' ※ 2021/03/10 "g"だと余計な値が混ざるため、1つ深い"tF2Cxc"クラスを使ったほうがいいかも ' --- 検索結果の全てのページの「タイトル・URL・詳細説明」をシートに書き込む Dim i As Long: i = 0 Dim url As String Dim title As String Dim detail As String Dim data As Variant For Each data In pageData i = i + 1 url = data.getElementsByClassName("LC20lb DKV0Md")(0).innerText title = data.getElementsByTagName("h3")(0).innerText detail = data.getElementsByClassName("aCOpRe")(0).innerText Sheets("Sheet1").Cells(i + 1, 1).Value = i Sheets("Sheet1").Cells(i + 1, 2).Value = url Sheets("Sheet1").Cells(i + 1, 3).Value = title Sheets("Sheet1").Cells(i + 1, 4).Value = detail Next End Sub |
41~43行目で検索結果画面のヒットしたページの情報を取得しています。
そして、今回はFor Eachを使って、オブジェクト内の値を1つずつ取得できるようにしています。
加えて、オブジェクトの要素分、39~49行の間の処理(情報取得とシートへの書き込み)を繰り返します。
※For Eachが分からない方は『For文の使い方』を読んでみてください。
上のコードを実行すると下のような結果が得られます。
IEを閉じる
最後に「開いたIEを閉じる」て終了になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
Sub sample6() ' --- IEを表示(起動)する Dim objIE As Object Set objIE = CreateObject("Internetexplorer.Application") ' IEオブジェクト objIE.Visible = True 'IEを表示 ' --- Googleの検索画面を表示する ' 今回は「VBAとは」で検索する Dim searchURL As String ' 表示するURL searchURL = "https://www.google.co.jp/search?q=VBAとは" objIE.Navigate searchURL '指定したURLを開く ' --- 画面が表示されるまでの待機時間を設定する ' ※画面がしっかり表示されないとエラーが生じる Application.Wait Now() + TimeValue("00:00:03") ' --- 検索結果画面の特定のデータを取得する ' --- 検索結果画面に表示されているページのデータは全てクラス"g"で指定されている Dim htmlDoc As Object Set htmlDoc = objIE.Document Dim pageData As Object Set pageData = htmlDoc.getElementsByClassName("tF2Cxc") ' ※ 2021/03/10 "g"だと余計な値が混ざるため、1つ深い"tF2Cxc"クラスを使ったほうがいいかも ' --- 検索結果の全てのページの「タイトル・URL・詳細説明」をシートに書き込む Dim i As Long: i = 0 Dim url As String Dim title As String Dim detail As String Dim data As Variant For Each data In pageData i = i + 1 url = data.getElementsByClassName("LC20lb DKV0Md")(0).innerText title = data.getElementsByTagName("h3")(0).innerText detail = data.getElementsByClassName("aCOpRe")(0).innerText Sheets("Sheet1").Cells(i + 1, 1).Value = i Sheets("Sheet1").Cells(i + 1, 2).Value = url Sheets("Sheet1").Cells(i + 1, 3).Value = title Sheets("Sheet1").Cells(i + 1, 4).Value = detail Next ' --- IEを閉じる objIE.Quit Set objIE = Nothing End Sub |
53行目で初めに開いたIEを閉じています。
加えて、54行目で一応IEオブジェクトが入った変数にNothingを代入しておきます。
コレで「検索エンジンで検索したのちの検索結果画面の情報を取得し、その情報をシートに書き込む」は終わりになります。
1位 | 2位 | 3位 |
---|---|---|
Excel VBA 脱初心者のための集中講座 | パーフェクトExcel VBA | ExcelVBA 実戦のための技術 |
初心者~中級者 | 中級者 | 初心者~中級者 |
【初心者が手に取るべき参考書】 ・「書籍+動画」で圧倒的に理解しやすい入門書になっている。 ・丁寧で詳しい解説でボリューム感がある。 | 【より深い理解をしたい方にお勧めな参考書】 ・テーマに対して丁寧な解説・適度な深さで解説されている。 ・幅広くテーマを扱っていることから、基礎知識をあらかた網羅できる。 | 【入門書と一緒に買うべき参考書】 ・1つ1つのテーマを経験豊富なエンジニア視点で解説してくれている。 ・実践的で効果的なコードの書き方が理解できる。 |
【読んでみた一言】 正直、入門書はコレ一冊でいいかも。あとは中級者用の参考書に進むべし。 | 【読んでみた一言】 深く書かれているが、少々専門的に書かれていることから、読む前に数冊の入門書を読破したほうが良い。 | 【読んでみた一言】 基礎知識を持っている人が次のレベルに達するきっかけを与えてくれる参考書である。 |
スポンサーリンク