【SeleniumVBA】最速の導入･運用手順

# １　はじめに
説明はExcelVBAの操作をある程度行っている方向け
まったく初めての方は[こちら](https://note.com/sele_chan/n/n61a67c4379de)を参照

:::note
**SeleniumBasicとの比較**
**【メリット】**
・インストール不要のためファイルのやりとりが容易
・WebDriver自動更新機能が標準装備
・バージョンアップ、バグフィックスへの対応
**【デメリット】**
・一般事務員向けの参考記事が少なく、未更新が多い
⇒私が経験した事をnote記事に書きまくりました
・高機能の代償としてMicrosoft Defenderの誤検知が発生しやすい
⇒他社製セキュリティソフト導入で無効化 ※[「９ おわりに」](https://qiita.com/sele_chan/items/a650e8587fb24ace4389#%EF%BC%99%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)参照
:::
# ２　SeleniumVBA.xlsmのダウンロード
[こちら](https://github.com/GCuser99/SeleniumVBA/raw/refs/heads/main/dist/SeleniumVBA.xlsm)(GitHub)からファイルを直接ダウンロード

:::note
2025年3月11日時点の最新バージョンは`6.5` 
**xlam(アドイン)形式のファイルは、2024年3月以降、提供停止**
:::

# ３　セキュリティおよびVBEの設定
<dl>
<dt>・「SeleniumVBA.xlsm」アイコン右クリック　⇒ 「プロパティ」 ⇒ 「許可する」</dt>
<dt>・「開発」タブ　⇒ 「Visual Basic」ボタン ⇒ 「ツール」⇒ 「オプション」</dt>
<dd>・「編集」タブ　⇒ 「変数の宣言を強制する」にチェック
<dd>・「全般」タブ　⇒ エラートラップ「エラー処理対象外のエラーで中断」
</dl>

:::note
エラートラップで「エラー発生時に中断」にしない理由は、SeleniumVBAのプログラムは至るところに「On Error GoTo 〜」が使用されており、その箇所で中断してしまうため。また「クラスモジュールで中断」にしない理由は、独自に実装するプログラムは標準モジュールで行うことが想定され、クラスモジュールで中断してしまうとデバッグが行いづらくなるため。
:::

# ４　動作確認
「SeleniumVBA.xlsm」内の標準モジュール「test_ActionChains」をVBE上から実行して、Edgeが起動して画面が動いていればOK

:::note
Chromeブラウザの利用はコードを「driver.StartEdge」を「driver.StartChrome」に変更してから実行
Edge IEモードはサポート継続が難しくなったことから、バージョン5.9から非対応
:::

:::note
この時点でWebDriverがダウンロードフォルダに自動ダウンロードされる。ここでエラーとなる場合[「８ ここからは苦労話」](https://qiita.com/sele_chan/items/a650e8587fb24ace4389#%EF%BC%98%E3%81%93%E3%81%93%E3%81%8B%E3%82%89%E3%81%AF%E8%8B%A6%E5%8A%B4%E8%A9%B1)を参考に。
:::

# ５　運用
この「SeleniumVBA.xlsm」一つで運用でき、ファイル名を変更しても動作に支障はなし。なお、配布する場合は[こちら](https://note.com/sele_chan/n/nb44f33c60422)を参照

運用開始時は、新規に標準モジュールを作成してコードを記述。ワークシートにはデータ入出力および実行ボタン作成エリアとして運用

# ６　公式Wiki及びサンプルコード
公式Wikiページは[こちら](https://github.com/GCuser99/SeleniumVBA/wiki)(GitHub)。困った時は[Dicussion](https://github.com/GCuser99/SeleniumVBA/discussions)で質問することも可
英語なので下記に**SeleniumVBAでGoogle翻訳を使用できるコード**を掲載

https://qiita.com/sele_chan/items/f59fe72ef4de5995a526

:::note
サンプルコードはSeleniumVBA.xlsmの「test_」で始まる標準モジュールに、多数のコードが掲載
:::

# ７　参考記事
私が実務で経験したノウハウをnote記事に掲載

https://note.com/sele_chan/n/nf0058f4fca61

https://note.com/sele_chan/n/n98c1af32bcb7

https://note.com/sele_chan/n/n10c91bffa1cb

https://note.com/sele_chan/n/nd2f36a3e0193

https://note.com/sele_chan/n/nb44f33c60422

https://note.com/sele_chan/n/ncbed3739bd7c

https://note.com/sele_chan/n/n4f6fee34b5bb

https://note.com/sele_chan/n/nfa5c1513ab71

# ８　ここからは苦労話
一般事務員しかいない**弊社の環境**では、**以前まで**セキュリティソフトの設定等によりWebDriverの自動ダウンロードができずに下記画面のようなエラーが出ていました。

![1734557353-oib8GRA2YCDgaLBrk4H1FcKf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972727/e78d6c97-1026-ab54-2b74-dba7d9c12f4b.png)

このままでは、WebDriverの更新頻度が１か月に１回程度あるため、その環境で継続運用することは困難となってしまいます。

WebDriverのダウンロードはWindowsAPIであるUrlDownloadToFile(クラスモジュールWebDriverManager内)で実行していますが、環境によって動作しないことが判明しています。

動作しない場合、以下の画像のようにUrlDownloadToFileにブレークポイントを設定して、ローカルウインドウに表示されるurlをコピーします。そしてブラウザを手動で立ちあげ、アドレス欄にurlをペースト＋Enterしてみてください。

![taiou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972727/9dc0f096-9328-44a6-8362-ba98c367443b.png)

上記の操作でダウンロードできる環境であれば、完全にはブロックされていないため、**暫定的に以下のコードによりブラウザ経由によるダウンロードに変更したところ動作**しました。

コード変更箇所は以下の画像のとおり、クラスモジュール「WebDriverManager」内あるプロシージャ「DownloadAndInstallDriver」のうち「UrlDownloadToFile」以降から「End Sub」までを上書きしました。

![タイトルなし２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972727/8ed94ea1-6d7c-098a-b1ce-9f365169c8c0.png)

```vb:VBA
'*************************************************************************************************
'【改変コード】（Edge/Chrome限定。動作保証はありません）
'「UrlDownloadToFile」が動作しないが、Edge/Chromeを起動してURLを直接打ち込むとダウンロードできる場合に有効
'クラスモジュール「WebDriverManager」プロシージャ「DownloadAndInstallDriver」のうち「UrlDownloadToFile」以降から「End Sub」まで改変
'*************************************************************************************************
    'i-Filterが原因でUrlDownloadToFileが動作しないためコメント化
    'UrlDownloadToFile 0&, StrPtr(Url), StrPtr(tmpInstallZipPath), 0&, 0&
    'make sure driver zip file was created successfully
    If Not fso.FileExists(tmpInstallZipPath) Then
    'Edge/Chromeを立ち上げてzipファイルをdownload直下に保存する
     Dim Br As Object
     Set Br = CreateObject("WScript.Shell")
     
     Dim brName As String, zipName As String
     Select Case browser
      Case svbaBrowser.Edge
        brName = "msedge"
        zipName = "edgedriver_"
      Case svbaBrowser.Chrome
        brName = "chrome"
        zipName = "chromedriver-"
     End Select
     
     Br.Run (brName & ".exe -url " & URL)
    'dawnload完了まで待つ
     Dim i As Long
     Do Until fso.FileExists(driverFolder & "\" & zipName & platformString & ".zip")
       If i <= 20 Then '20秒以内の場合
         Sleep 1000    '1秒待つ
         i = i + 1
       Else
         AppActivate Application.caption
         MsgBox "WEBドライバのファイルが指定フォルダに格納されていません" & Chr(10) & _
                "以下のとおり対処してください" & Chr(10) & _
                "１　ブラウザの「設定」-「ダウンロード」の画面から" & Chr(10) & _
                "　　①保存先を「ダウンロード」フォルダ直下に変更" & Chr(10) & _
                "　　②「ダウンロード前に各ファイルの保存場所を確認する」をoff" & Chr(10) & _
                "２　設定完了後、OKボタンでExcel画面に戻って再試行する", vbCritical + vbOKOnly
         End
      End If
     Loop
     'Edge/Chromeを終了する
     Set Br = Nothing
     'zipファイルをdownload直下からtmpフォルダに移動する
     fso.MoveFile driverFolder & "\" & zipName & platformString & ".zip", tmpInstallFolder
    End If
    If fso.FileExists(tmpInstallDriverpath) Then fso.DeleteFile tmpInstallDriverpath, True
    shll.Namespace(tmpInstallFolder).CopyHere shll.Namespace(tmpInstallZipPath).Items.Item(tmpZipDriverFilename)
    'check if driver exists and if it does, make sure it isn't in use before overwrite
    If fso.FileExists(driverPath) Then
        If isProcessRunning(driverFileName) Then taskKillByImage (driverFileName): WebShared.SleepWinAPI 100
    End If
    'copy file from temp folder to driver path
    fso.CopyFile tmpInstallDriverpath, driverPath, True
    'if created tmp folder, then delete it
    If Dir(tmpInstallFolder) <> "" Then fso.DeleteFolder Left$(tmpInstallFolder, Len(tmpInstallFolder) - 1), True
'*************************************************************************************************
'改変箇所 ここまで
'*************************************************************************************************
End Sub
```
:::note warn
上記コードは**Edge/Chrome限定であり動作保証はありません**ので、自己責任での御利用でお願いします。【注】2025年3月8日にEdge/Chromeの両対応とするようにプログラムを更新しました。
:::

:::note
理由は不明ですが、弊社の私のPCでは現在は標準状態でもダウンロードできるようになっていましたので、上記コードは使用していません。もし他の方に役に立つことがあればと思い、掲載しています。
:::

# ９　おわりに
SeleniumVBAは、Excel版とコードが同一の**Access版も提供**されています。Access版は**Microsoft Defenderに誤検知されない**というメリットがあります。
また「Microsoft Excel ×× Object Library」を参照設定すればExcelも操作可能です。