Excel VBAからIEを自動操作できなくなって困っている方も増えてきているようですね。
今回はVBAからIEに代わるブラウザとしてedgeやchromeを自動操作する方法をご紹介します。
VBA+DOMを使う
DOM(Document Object Model)はIEの操作でも使われてきた技術であり、ウィンドウハンドルを掴まえてgetElementByIdでHTMLソースのIDを操作することができるもの。
普段からVBAの操作に慣れている人であれば実装は難しくなく、IE操作の代替案として利用可能でしょう。
とはいえ、従来のIE設定とやり方が違うこともあり、根気強くできる方・スキルに自信のある方にはお勧めできます。
こちらのブログに丁寧に書かれていましたので、ご紹介のみさせていただきます。
WebDriverを使う
Microsoftが公開しているWebDriverを利用することでEdgeの操作を自動化できます。
WebDriver自体はブラウザを操作するドライバでありインタフェースにすぎないため、別途SeleniumとPython、Java、C#、Ruby、JavaScriptなどの言語スキルが必要になります。
プログラムスキルが初級以上であれば、ライブラリが充実しているpythonでのコーディングをおすすめします。
ただし、ブラウザのバージョンに合ったWebDriverを適用する必要があるため以下の2択だと思います。
- ブラウザのバージョンアップ毎に適合したWebDriverを充てる運用
- 閉鎖的なネットワーク環境でのみ利用しブラウザをバージョンアップさせない
VBA標準のSendKeysステートメントを使う
VBAには標準で”SendKeysステートメント”というコマンドが用意されています。
要は、打鍵(キータイプ)のコードをVBAから送る技術ですね。
例えばEnterキーを押させたいのであれば「SendKeys "{ENTER}", True」をVBAで書くだけです。
まず、VBAからEdgeでgoogleを開きます。
1 |
Shell "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" & " " & "https://google.co.jp/", vbNormalFocus |
Chromeを開きたい場合はパスを差し替えてください。
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
SendKeysステートメントを利用しブラウザを操作
Edgeを起動しGoogleを開くと、検索ボックスにマウスカーソルが合わさった状態で開始されるため、検索したいワードを入力しEnterキーを送ってあげればググることもできます。
下記をそのままVBAにコピペし実行してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'sleep用関数定義 Sub VBAからEdgeを開いてGoogleで検索するテスト() Dim sWord As String sWord = "ExcelのVBAからedgeブラウザを自動操作する3つの方法" 'Edge起動 Shell "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" & " " & "https://google.co.jp/", vbNormalFocus Sleep (3000) SendKeys sWord, True SendKeys "{ENTER}", True End Sub |
あとはマウスやキー操作をトレースし、どういった操作をしたいかを組み合わせることである程度の自動化はできます。
環境構築が不要ですぐに使えて、1つ1つの操作を追っていくだけなのでごく簡単な作業であればおすすめです。
Webの体裁・仕様が変わらなければメンテナンスもほぼ不要となります。
SendKeys ステートメントの詳細(他のキー)は下記リンクを参照してください。
VBAからブラウザ操作するデメリット
デメリットとしては、先述したDOMの様にgetElementByIdでHTMLのIDを取得できないためinputboxやbuttonを直接指定できません。
Tabキー・Shiftキー・Enterキーを組み合わせてボタンを押すことになり、VBAを実行している間ほかのPC操作が何もできない状態になります。
また、画面描画遅延でタブオーダーのタイミングがずれた場合、自動操作の精度が落ちます。
画面描画にかかる時間分スリープすれば良いので、ここはトライ&エラーでほぼ回避できます。
上記を理解しVBAで組み合わせ自動操作すれば特に問題ありません。
実際、ぼくも定常業務で使っており、日々1時間の時短になりました。