0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SeleniumVBA】最速の導入・運用手順(2025年1月)

Last updated at Posted at 2024-12-29

1 はじめに

説明はExcelVBAの操作をある程度行っている方向け
まったく初めての方はこちらを参照

SeleniumBasicとの比較
【メリット】
・インストール不要のためファイルのやりとりが容易
・WebDriver自動更新機能が標準装備
・バージョンアップ、バグフィックスへの対応
【デメリット】
・一般事務員向けの参考記事が少なく、未更新が多い
⇒私が経験した事をnote記事に書きまくりました
・高機能の代償としてMicrosoft Defenderの誤検知が発生しやすい
⇒他社製セキュリティソフト導入で無効化

2 SeleniumVBA.xlsmのダウンロード

こちら(GitHub)からファイルを直接ダウンロード

2025年1月5日時点の最新バージョンは6.3
xlam(アドイン)形式のファイルは、2024年3月以降、提供停止

3 セキュリティおよびVBEの設定

・「SeleniumVBA.xlsm」アイコン右クリック ⇒ 「プロパティ」 ⇒ 「許可する」
・「開発」タブ ⇒ 「Visual Basic」ボタン ⇒ 「ツール」⇒ 「オプション」
・「編集」タブ ⇒ 「変数の宣言を強制する」にチェック
・「全般」タブ ⇒ エラートラップ「エラー処理対象外のエラーで中断」

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

4 動作確認

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

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

この時点でWebDriverがダウンロードフォルダに自動ダウンロードされる。ここでエラーとなる場合「8 ここからは苦労話」を参考に。

5 運用

この「SeleniumVBA.xlsm」一つで運用でき、ファイル名を変更しても動作に支障はなし。なお、配布する場合はこちらを参照

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

6 公式Wiki及びサンプルコード

公式Wikiページはこちら(GitHub)。困った時はDicussionで質問することも可
英語なので下記にSeleniumVBAでGoogle翻訳を使用できるコードを掲載

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

7 参考記事

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

8 ここからは苦労話

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

1734557353-oib8GRA2YCDgaLBrk4H1FcKf.png

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

ただ、通常使用しているChromeを手動で起動してURLを直接打ち込むとダウンロードできる環境であったことから、完全にはブロックされていないと判断して、暫定的に独自に以下のコードにより改変したところ動作しました。

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

タイトルなし2.png

VBA
*************************************************************************************************
'【改変コード】(Chrome限定。動作保証はありません)
'「UrlDownloadToFile」が動作しないが、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
    'Chromeを立ち上げてzipファイルをdownload直下に保存する
     Dim Ch As Variant
     Set Ch = CreateObject("WScript.Shell")
     Ch.Run ("chrome.exe -url " & Url)
    'dawnload完了まで待つ
     Dim i As Long
     Do Until fso.FileExists(driverFolder & "\" & "chromedriver-" & platformString & ".zip")
       If i <= 20 Then '20秒以内の場合
         sleep 1000    '1秒待つ
         i = i + 1
       Else
         AppActivate Application.caption
         MsgBox "WEBドライバのファイルが指定フォルダに格納されていません" & Chr(10) & _
                "以下のとおり対処してください" & Chr(10) & _
                "1 Chromeの「設定」-「ダウンロード」の画面から" & Chr(10) & _
                "  ①保存先を「ダウンロード」フォルダ直下に変更" & Chr(10) & _
                "  ②「ダウンロード前に各ファイルの保存場所を確認する」をoff" & Chr(10) & _
                "2 設定完了後、OKボタンでExcel画面に戻って再試行する", vbCritical + vbOKOnly
         End
      End If
     Loop
     'Chromeを終了する
     Set Ch = Nothing
     'zipファイルをdownload直下からtmpフォルダに移動する
     fso.MoveFile driverFolder & "\" & "chromedriver-" & 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

上記コードはChrome限定(Edge版の書き換えは可能と思われます)であり動作保証はありませんので、自己責任での御利用でお願いします。

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

9 おわりに

この記事における動作確認は2025年1月5日時点です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?