はじめに
この記事は次のような人に向けて書かれています
・VBAからIEを操作してなんやかんやするマクロを動かしていた
・IEが消えてしまった(情シスに消された)ので今すぐEdgeかChromeを動かす感じに作り直さないといけない
・基本よくわからんものをおいそれとインストールできない環境である
・正直何からやっていいか不明だし何で検索すればいいのかもよくわからない
・こんなことをやっている場合ではないが意外と困っている
要点
WebDriver
Edge、ChromeをVBAから動かす場合、WebDriverという公式アプリをいったん立ち上げて、そいつにWebブラウザを開いてもらい、Inputなりボタンなりを操作する。(これは、Web画面のテスト実行を目的として公式配布されているもので、ふつうに安全だと説明してもらって大丈夫です)
こんな感じ
[Excel] -> [Edge用WebDriver or Chrome用WebDriver] -> [Edge or Chrome]
WebDriverは以下のページからダウンロードできます。
※正確には、EdgeのWebDriverは公式配布ですが、ChromeのWebDriverはchromium系統なのでOSSと言えなくもないです
Selenium
WebDriverの操作がそのままだとちょっとだるいため、SeleniumというOSS開発のモジュールを使う。これをVBA内にぶちこむことで、関数とかの指定がすごく楽になる。ぶちこむだけなので、インストールしなくていい。
TinySeleniumVBA、SeleniumBasicとかいくつか種類があるみたい。これらは神が作成している。
本エントリでは、TinySeleniumVBAを使います。
WebDriver使う際の注意
実はとんでもないことに、WebDriverとWebブラウザーのバージョンは一致している必要があります!
しかし、「ブラウザとWebDriverが一致しているかチェックしてダメそうだったら公式からWebDriverをダウンロードしなおせる関数」が入ってるOSSモジュールが存在するので、それを使う。これも神が作成した。
準備
1)TinySeleniumVBAというクラスモジュールをエクセルに突っ込む
(WebDriver.cls、WebElement.cls、JsonConverter.basの3つ。.clsの2つがクラスモジュールとして取り込まれない場合は、改行コードをCRLFに直してあげる。)
↓こちらの記事がとても参考になります!
2)WebDriverManager-for-VBAのWebDriverManager4TinySelenium.basを標準モジュールとしてエクセルに突っ込む
↓作った方の記事で参考になります!
3)VBA編集ウィンドウで、ツール>参照設定から Microsoft Scripting Runtime にチェック。参照を通す。
これで準備完了!
コード例
・ユーザにWebDriverをダウンロードもしくは更新してもらうボタン
Sub onPressInstallWebDriver()
MsgBox "The appropriate version webdriver will be installed to C:\Users\" + Environ("USERNAME") + "\Documents\WebDriver\edgedriver.exe"
installWebDriver Edge, "C:\Users\" + Environ("USERNAME") + "\Documents\WebDriver\edgedriver.exe"
MsgBox "Installation done successfully."
End Sub
これにより公式からC:\Users\ユーザ名\Documents\WebDriver\にedgedriver.exeがインストールされる。
(ちょっとドキドキするので、WebDriverManager4TinySelenium.basをインポートする前に、ソースコード内のDL元URLを確認しておいてください。当方が記事を書く前に確認した時点では、公式のURLと相違ないようでした。)
chromeを操作させたい場合は、名前をchromedriver.exeなどとして、installWebDriver Chromeとして指定すればよいです。
・ブラウザを開いてinputタグのNameで見つけた要素に特定セルの文字列を入力する
Sub openBrowserAndInputValues()
Dim Driver As New WebDriver
Driver.Edge "C:\Users\" + Environ("USERNAME") + "\Documents\WebDriver\edgedriver.exe"
Driver.OpenBrowser
Driver.Navigate "http://hogehoge.hugahuga.html"
Driver.FindElement(By.Name, "your_elementname").SetValue Cells(1, 1).value
End Sub
Nameでなく、IDで指定することもできます。その場合、Driver.FindElement(By.ID, "your_elementid")となります。
・WebDriverが入ってないPCに適切なWebdriverをDLさせ、さらにブラウザを開いてinputタグのNameで見つけた要素に特定セルの文字列を入力する
Sub safeOpenBrowserAndInputValues()
Dim Driver As New WebDriver
SafeOpen Driver, Edge
Driver.Navigate "http://hogehoge.hugahuga.html"
Driver.FindElement(By.Name, "your_elementname").SetValue Cells(1, 1).value
End Sub
SafeOpen関数を使うとWebDriverを一旦ダウンロードする工程を隠蔽してくれるので、ほぼIEの時と同じような動作を実現できます。ちなみにこの場合、デフォルトのWebDriverの保存先はC:\Users\USERNAME\Documents\WebDriverとなるそうです。
・ブラウザを開いてinputタグのNameで見つけた要素にjavascriptで特定セルの文字列を入力する
Sub safeOpenBrowserAndInputValues()
Dim Driver As New WebDriver
SafeOpen Driver, Edge
Driver.Navigate "http://hogehoge.hugahuga.html"
Driver.ExecuteScript "document.getElementsByName( 'your_elementname' )[0].value= '" + Cells(1, 1).value + "' "
End Sub
javaScriptを叩けます。これが特に便利です。
実はSetValueで16桁以上の数字のみで構成した文字列を指定すると文字として認識してくれないバグがあって痺れたのですが、この裏技で解決しました。
おわりに
ほかにも一通りの操作ができるので、READMEを読んでいろいろ試してみるとよいのではと思います。
良きVBAライフを…