仕事のによっては、偶にセキュリティ制限がかなり厳しい所があるんでしょう。
普段Python+Seleniumで簡単にブラウザーを自動化操作する方法は、セキュリティの制限により、Pythonがインストールできないか、Seleniumライブラリのインストールできないか、または、Chrome/Edge/Firefoxなどのブラウザーがないから、使えなくなります。
この時はExcelのVBAを使ってIEを自動化しましょう!どういう環境でもほとんどExcelがあるし、IEがWindowsでデフォルトのブラウザーなので、勿論あります。
昔々、VBAを触ったことがあり、地味なIDEなのでなんか前世代の言語で使いにくいかと思いました。今回真面目に使ったら意外的に使えるじゃんと思っていましたね。
Excelファイル中のデータの読み取りはすごく簡単のほか、文法も簡単だし、コード補完もあるし、改行なども自動認識できるし、なんかPythonと意外的に似ているイメージでした。とはいえ、前世代の言語は実事なので、罠もありました。
罠
0、型を使用する前にインポートが必要
「0」番にした理由は、罠ではないですが、知らないとあれれくらいです。
「Visual Basic > ツール > 参照設定...」からMicrosoft Internet Contols
とMicrosoft HTML Library
をインポートすれば、下記の変数を定義する時は具体的な型で定義できます。
Public IE As InternetExplorer
Public DOC As HTMLDocument
1、IEのセキュリティ設定
IEは Protect Mode またはセキュリティレベルが低い以外の場合、下記みたいなエラーが表示されます。
Run-time error 'xxxxxxx': Automation Error The object involved has disconnected from it clients.
解決案は幾つありますが、私は下記の案を採用しました。IEインスタンスを作成する時、New InternetExplorer
の代わりにNew InternetExplorerMedium
を使います。
Set IE = New InternetExplorerMedium
2、必須フィールドのValue設定は認識できない
画面上の入力欄などの必須フィールドの.Value
属性を設定しても未設定と見做すことがあります。HTMLソースを見ても設定ができている状態なのに。。。
解決案は、.Value
属性の設定の代わりにSendKeys
を利用します。
Public Sub SetValue(ele, value)
ele.Focus
Application.Wait (Now + TimeValue("00:00:01"))
SendKeys value
Application.Wait (Now + TimeValue("00:00:01"))
End Sub
3、日本語入力問題
上記の 2 のSendKeys
で値を設定する方法は、日本語の設定はできないです。
解決案は簡単で、.Value
属性を設定したあと、上記のSetValue
関数で一つスペースを入れます。
4、Wait
が重要
上記のソースコードを見てもWait
が多いですね、本来は下記のコードでロード未完了の画面を待てますが、実際に使用する時何かの原因でロード未完了のままに次のコードが実行されてしまいますね。
IE.navigate "https://www.google.jp"
Do While IE.readyState < READYSTATE_COMPLETE Or IE.Busy: DoEvents: Loop
また、画面上のポップアップやプルダウンなどのアニメーションがある場合、すぐには後ろの操作を実行すると対象が見つからない可能性があります。
そのため、Wait
がすごく重要です、疑えるところはWait
を入れましょう!
Application.Wait (Now + TimeValue("00:00:01"))
感想
環境上は何もない、途方に暮れる時、ExcelとIEはきっとあるでしょう、この二つものがあればなにかなるでしょう!