ExcelVBAを使ってWebスクレイピングを行う

Webスクレイピングは、Webページから情報を抽出する強力な方法です。ExcelVBAを使ってWebスクレイピングを行うことで、データの自動取得、時間と労力の節約、データの正確性といったメリットがあります。手動で情報を入力する手間を省き、自動的にデータを取得することができるため、大量の情報を収集する場合でも短時間で処理することができます。また、人手による入力ミスを避けることができるため、正確なデータを取得することが可能です。サンプルアプリでは、和暦と西暦の早見表を指定されたURLのWebページからデータを読み込み、Excelに書き込んでいます。次項でサンプルアプリの使い方を説明しますので、Webスクレイピングを実際に試してみて下さい。

サンプルアプリの使い方

シート上に配置した「和暦西暦早見表取込み」ボタンをクリックするだけで、指定されたURLのWebページからデータを読み込むことができます。読み込んだデータは、Excelシートの5行目以降に表示されます。

                  ↓

サンプルコードの処理内容

まず、ExcelVBAを使ってWebスクレイピングを行うためには、「SeleniumBasic」というオープンソースの外部ライブラリーをインストール必要があります。また、パソコンの環境によっては、「.NET Framework3.5」を有効にする必要があります。具体的なインストール手順・設定手順については、下記リンク先をご覧ください。
   https://scodebank.com/?p=1492

インストールおよび設定が完了したら、Excelの「開発」メニューから「コード表示」→「ツール」→「参照設定」を表示して、「Selenium Type Library」にレ点マークがついていることを確認します。
付いていない場合は、「Selenium Type Library」にレ点マークをつけて下さい。


今回のサンプルアプリの処理内容は以下の通りです。

1.WebDriverオブジェクトの宣言
  myDriver As New WebDriverでWebDriverオブジェクトを宣言します。
  これはWEBブラウザを制御するために使用されます。
       ↓
2.Webページへのアクセス
  「 .Start “edge"」によりMicrosoft Edgeブラウザを開始し、
  「.Get」で指定されたURLにアクセスします。
       ↓
3.テーブルデータの取得:
  myTable = .FindElementById(“Table")で「Table」というIDを持つテーブル要素を取得します。
       ↓
4.データの読み込みとExcelへの書き込み
   myTDs = myTable.FindElementsByTag(“td")でテーブル内のすべてのセルを取得し、
  For Eachループを使って各セルのテキストをExcelシートに書き込みます。
       ↓
5.データの整形
  1行の処理が終わったら、次の行に移動してデータを書き込むようにしています。
       ↓
6.ブラウザの終了
  「.Close」でブラウザを閉じます。

サンプルコード   アプリの作成手順はこちら

サンプルコードは以下の通りです。
各コードの説明はコメント行に記載していますのでご覧ください。

Option Explicit

Sub 和暦西暦早見表取込み()

   'WebDriverオブジェクトを宣言しています。これはWEBブラウザを制御するために使用されます。
    Dim myDriver As New WebDriver
      
   'WebElementオブジェクトを宣言しています。これはWEBページ内のテーブル要素を表します。
    Dim myTable As WebElement
    
   'WebElementsオブジェクトを宣言しています。これはWEBページ内の複数の要素(テーブルのセルなど)を表します。
    Dim myTDs As WebElements
    
   'WebElementオブジェクトを宣言しています。これはテーブルのセル要素を表します。
    Dim myTD As WebElement
    
   '整数型変数「myRowNo」を宣言しています。これはテーブルの行番号を表します。
    Dim myRowNo As Integer
    
   '整数型変数「i」を宣言しています。これは列番号を表します。
    Dim i As Integer
    
   'myDriverオブジェクトを使用して、複数のコマンドをブロックでまとめて実行します。
    With myDriver
        
       'Microsoft Edgeブラウザを開始します。chromeを利用する場合は「.Start "chrome"」にします。
        .Start "edge"
        
       '指定されたURLに対してブラウザを起動し、WEBページにアクセスします。
        .Get "https://scodebank.com/WarekiSeireki/WarekiSeirekiIchiran.html"
        
       '「Table」というIDを持つ要素を検索して、「myTable」変数に代入します。この行では、指定したIDを持つテーブル要素を見つけています。
        Set myTable = .FindElementById("Table")
        
       '「myRowNo」変数に5を代入しています。これはデータを書き込むExcelの行番号を表します。
        myRowNo = 5
        
       '「i」変数に2を代入しています。これはデータを書き込むExcelの列番号を表します。
        i = 2
        
       '「myTable」内のすべての`td`要素(テーブルセル)を検索して、「myTDs」変数に代入します。
        Set myTDs = myTable.FindElementsByTag("td")
        
       ' 「myTDs」内のすべての「myTD」要素に対してループを開始します。
        For Each myTD In myTDs
        
           '「myTD」のテキストを「myRowNo」行「i」列のExcelセルに書き込みます。
            Cells(myRowNo, i).Value = myTD.Text
            
           '列番号「i」を1増やします。
            i = i + 1
            
           'もし「i」が6であれば(6列目までデータを書き込んだ場合)以下の処理を実行します。
            If i = 6 Then
            
               '列番号「i」を2にリセットします(次の行の2列目にデータを書き込むため)。
                i = 2
                
               '行番号「myRowNo」を1増やします(次の行にデータを書き込むため)。
                myRowNo = myRowNo + 1
            
            End If
            
       '「For Each」ループを次の要素に進めます。
        Next
        
       'ブラウザを閉じます。
        .Close
    
   '「With」ブロックを終了します。
    End With
    
   '「myDriver」オブジェクトを解放(開放)します。これにより、メモリを解放し、オブジェクトを破棄します。
    Set myDriver = Nothing
    
End Sub