Excel VBA と SeleniumBasic で Microsoft Edge から任意要素を抽出する方法

目次

はじめに

Windows 10 以降では Internet Explorer の自動操作が推奨されておらず、Microsoft Edge を用いたスクレイピングが主流です。本記事では SeleniumBasicEdgeDriver を使用し、ページ読み込み後に特定クラスの要素を取得して Excel シートへ書き込む手順を解説いたします。例としてサイト https://morinokabu.com/ を対象とします。


前提環境

項目内容
OSWindows 10 / 11
ExcelMicrosoft 365 または Excel 2016 以降
追加ツールSeleniumBasic(VBA ラッパー)
ドライバmsedgedriver.exe(Edge のバージョンに合わせて入手)
  1. SeleniumBasic をインストールします(既定先は C:\SeleniumBasic)。
  2. Edge のバージョンに一致する msedgedriver.exe をダウンロードし、同フォルダーに配置します。
  3. VBA エディターで [ツール] → [参照設定] → “Selenium Type Library” を有効にします。

サンプルコード

Option Explicit     ' 参照設定: Selenium Type Library が必要です

Sub ScrapeMorinokabuData()

    Dim siteURL    As String
    Dim driver     As New Selenium.EdgeDriver
    Dim itemList   As Selenium.WebElements
    Dim element    As Selenium.WebElement
    Dim rowIndex   As Long
    
    siteURL = "https://morinokabu.com/"
    
    ' Edge 起動
    driver.Start
    driver.Get siteURL
    
    ' ページ読み込み完了待機
    Do While driver.ExecuteScript("return document.readyState") <> "complete"
        DoEvents
    Loop
    
    ' クラス名 "data" を持つ要素群を取得
    Set itemList = driver.FindElementsByCss(".data")
    
    rowIndex = 1
    For Each element In itemList
        ' 列 A: 最初の子要素テキスト
        Cells(rowIndex, 1).Value = element.FindElementsByCss("*")(0).Text
        
        ' 列 B: 3 番目の <p> 要素の HTML
        Cells(rowIndex, 2).Value = _
            element.FindElementsByTag("p")(2).Attribute("outerHTML")
        
        ' 列 C: 最初の <a> 要素の href
        Cells(rowIndex, 3).Value = _
            element.FindElementsByTag("a")(0).Attribute("href")
        
        rowIndex = rowIndex + 1
    Next element
    
    driver.Quit

End Sub

コード解説

処理説明
driver.ExecuteScript("return document.readyState")JavaScript で読み込み状態を確認します。"complete" になるまでループします。
FindElementsByCss(".data")CSS セレクターでクラス data を持つ要素群を取得します。
FindElementsByCss("*")(0)取得した要素の最初の子要素を参照します。
Attribute("outerHTML")要素自身を含む HTML 文字列を取得します。
Attribute("href")<a> 要素のリンク先を取得します。

主な DOM アクセス手段と用途

メソッド取得対象
FindElementById("id名")一意の ID を持つ要素を取得
FindElementsByName("name属性")指定 name を持つ要素群を配列取得
FindElementsByClass("class名")指定クラスを持つ要素群を配列取得
FindElementsByTag("tag名")指定タグ名を持つ要素群を配列取得

取得後は InnerText, Attribute(“outerHTML”), Attribute(“src”) などを組み合わせて情報を抽出できます。


応用アイデア

  1. 可変待機時間
    driver.Wait 10000, "css=.data" で最大 10 秒待機し、要素が現れ次第処理を継続できます。
  2. スクロールが必要なページ
    driver.ExecuteScript "window.scrollTo(0, document.body.scrollHeight);" で最下部まで読み込ませてから要素を検索します。
  3. 複数ページ巡回
    URL を配列化し、ループで driver.Get を呼び出すと大量ページを順次処理できます。

まとめ

SeleniumBasic と EdgeDriver を併用することで、Excel VBA でも Microsoft Edge の DOM へ直接アクセスし、任意の要素を抽出できます。旧来の IE 自動化コードを移行する際は、FindElement 系メソッドと JavaScript 待機ロジックを組み合わせると安定して動作します。社内レポートやデータ収集の自動化にぜひご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次