※下記情報は2021年5月時点の情報で、今後状況が変わっていく可能性があります。
前回の記事でInternet Explorer 11デスクトップアプリケーションのサポート終了に伴ってVBAマクロ周りがどう変わるのか、魔界の仮面弁士さんとユスキィさんのツイートを中心にまとめてみました。
早い話が
Set objIE = CreateObject("InternetExplorer.Application")
や
Set objIE = New InternetExplorer
といったIEオートメーション系のマクロが使えなくなるわけですが、ではどうすれば良いのか?、今回はもう少し突っ込んで考えてみたいと思います。
2022/05/16 追記:
公式ブログにIEサポート終了後もCOMオートメーション(「CreateObject(“InternetExplorer.Application”)」を使うようなシナリオ)が機能するとの記載がありました。
自動化を通じて、 IE を利用するアプリケーションで問題が発生しました。これは修正されるのでしょうか? (2022 年4 月14日 更新)
IE11アプリケーションのサポート終了の一環として、特定の COM オートメーション シナリオが破損したケースが報告されていました。対象の IE COM オブジェクトは、Windows 11 November 2021 Update の「C」リリースと Windows 10 March 2022 Update の「B」リリースで元の機能に復元されています。COM シナリオは、2022 年 6 月 15 日以降に IE11 デスクトップ アプリケーションが無効化された後も引き続き機能します。上記の更新プログラムのインストール後も問題が発生する場合は、App Assure に連絡して修復サポートを受けてください。
https://blogs.windows.com/japan/2022/02/21/internet-explorer-11-desktop-app-retirement-faq/ より
ただし下記記事中でも記載していますが、これはあくまでも救済措置であり、IEオートメーションを使い続けることは推奨されていない点はご注意ください。
マクロによるブラウザーの操作を止める
まず一つ目、マクロによるブラウザーの操作自体を止めてしまう方法が考えられます。
最近では公式にAPIを提供しているWebサービスも多く、APIを実行することによってブラウザーを操作しなくても目的の処理を実行できる可能性がありますし、Power AutomateやZapierといったiPaaSも非常に多くのサービスに対応しているため、それらを活用すればコードを書く必要すら無くなるかもしれません。
あるいは、WinActorやPower Automate Desktopといった、RPAソリューションにブラウザーの操作(もちろんIEを除く)を任せてしまうのも一つの手段と言えるでしょう。
Seleniumを使う
Windows 10の標準ブラウザーであるMicrosoft Edgeには、操作を自動化するための「WebDriver」という仕組みが用意されています。
Seleniumは現在最も広く使われている、Webブラウザの自動化・テストフレームワークです。 多くの言語をサポートしており、JavaやC#などの言語から、Webページを開いたり要素の検証ができます。 そのためWebサービスのEnd-to-end (E2E) テストの自動化で主に利用されています。
Selenium 1 (Selenium RC) と呼ばれていた時代は、ブラウザを操作するためにSelenium CoreというJavaScriptをブラウザ上でロードしてました。 しかしブラウザのセキュリティ強化により、Selenium CoreのJavaScript実行が難しくなったため、モダンブラウザではSelenium Coreが動かなくなりました。
SeleniumのヘビーユーザーだったGoogleは、Selenium Coreとは別のアプローチをとるため、WebDriverというプロジェクトをスタートしました。 WebDriverはJavaScriptではなく、各ブラウザが実装する ドライバ によってブラウザを操作します。 クライアントは標準化されたAPIによってブラウザを制御できます。
https://i-beam.org/2019/09/08/webdriver-with-curl-01/ より
WebDriver単体でもJSONデータを投げればブラウザーを操作できますが、各言語別に用意されたライブラリを活用した方が効率的です。
下記記事では.NET用のライブラリを使ってPowerShellでEdgeの操作を行うサンプルを載せています。
VBA向けには(恐らく)有志の方が開発された「SeleniumBasic」があるので、こちらを使うことによって、Microsoft Edge含めてブラウザーを操作することができます。
具体的な使い方は下記のサイトが分かりやすいかと思います。
(古い情報になりますが、当ブログでも紹介しています。)
コードの書き方が比較的IEオートメーションに近いので、コードを修正する範囲を抑えられる点がSeleniumBasicの利点と言えるでしょう。
ただし、SeleniumBasicの更新は数年止まっています。
同梱されているWebDriverの入れ替えで何とか動くようにはなりますが、このまま更新されなければ今後動作しなくなる可能性がありますので、その点はご注意ください。
(ソースは公開されているので、SeleniumBasic自体を自分で修正するのも有りかもしれませんが・・・)
2021/08/23 追記:
うえぞうさん( @uezochan )がWebDriverを使ってブラウザー操作を行うSeleniumクライアント「TinySeleniumVBA」を公開されています。
SeleniumBasicと違って端末にインストールする必要は無く、必要なモジュールをインポートするだけで使える点は大きなメリットと言えます。
ライセンス含め、詳細は上記GitHubをご参照ください。
2021/08/29 追記:
Edgeのバージョンに合わせてWebDriverをダウンロードするVBAマクロについて記事を書きました。SeleniumBasicやTinySeleniumVBAと組み合わせて使えるかと思います。
2021/12/23 追記:
TinySeleniumVBAをインポートする際の注意事項をやじゅ(@yaju)さんがまとめてくださっていますので下記記事をご参照ください。
DevTools ProtocolによるEdgeの操作
EdgeやChromeはDevTools Protocolを使ったオートメーションにも対応していて、WebDriver不要でブラウザーを操作できます。
CodeProjectで有志の方がVBA向けのライブラリ(ライセンス:CPOL)を公開されており、こちらを使うことで簡単にVBAからEdgeを操作できます。
使用方法
- CodeProjectからZipファイルをダウンロードします。
- Zipファイルを解凍し中に含まれるモジュールをインポートします。
- Dictionaryを使用するため、「Microsoft Scripting Runtime」を参照します。
- Edgeを終了した状態でコードを実行します。
2021/10/01 追記:
具体的な使い方を別の記事として簡単にまとめてみました。
IEモードで表示されたWebページを操作する
「ブラウザーの操作自体を止めてAPIを叩けば良い。」
「そもそも未だにIE使っているのが間違っている。」
そう言うのは簡単ですが、現実問題としてはそう上手く切り替えられない場合も多いでしょう。
「顧客都合でどうしても“IE限定”のシステムを使わなければならないが、手動で作業していたら何時間掛かるか分からないのでマクロで操作している。」
「止められるならとっくに止めている!」
そう悩む管理者の方も多いだろうと思います。
そういった方向けに、Edgeでは「IEモード」が用意されています。
このIEモードを使うことで、Edge内でIE用のページを開くことが出来るようになるわけですが、基本的にはIEモードで表示したWebページを操作することは難しく、ユスキィさんが下記ツイートされているように、IEモードではこれまで使えていたShellWindowsからのブラウザー操作ができません。
5. について、ShellWindows から IE モードは拾えないが、EnumWindows 関数などでウィンドウ ツリーから InternetExplorer_Server のハンドルの取得は可能。ウィンドウ ハンドルから IHTMLDocument の取得は可能なので、IE モードのドキュメントの操作はできる。
— ユスキィ (Yusuke Hara) (@ms_yuhara) May 21, 2021
ただ、IEモードのウィンドウからHTMLDocumentオブジェクトの取得はできるため、VBAマクロからの操作も一応可能であり、そのためのコードを魔界の仮面弁士さんがすでに書かれています。
とりあえず、WM_HTML_GETOBJECT を投げるところまでを VBA で実装してみた。
Edge から列挙するところも後で作りこむとしよう。https://t.co/S2OZ1RSEMB— 弁士 (@Benshi_Orator) May 21, 2021
このコードを活用すればIEモードで表示したWebページを操作できますが、コードを見れば分かる通りWindows APIを呼び出す必要がある複雑なコードになっているので、こちらの方法はあくまでも“最終手段”として考えておいた方が良さそうです。
2021/08/29 追記:
UI Automationを使用してInternet Explorer_Serverウィンドウのハンドルを取得するマクロを書きました。
2022/3/28 追記:
IEのオートメーションについて、一部方針が変更されたようです。
オートメーションでの IE11 起動も Edge にリダイレクトされる…という仕様は撤回されていた模様。
つまり、引き続き IE を使い続ける事も一応できるわけで。
『 powershell.exe -Command "(New-Object -ComObject InternetExplorer.Application).Visible = $true" 』
https://t.co/A5fVk3PGEV— 弁士 (@Benshi_Orator) March 28, 2022
こちらお客様から多数のフィードバックをいただき議論した結果、4. と 5. については方針が変わりました。
✅ IE11 デスクトップ アプリのサポート終了後もオートメーションによる IE11 起動は引き続きサポート
✅ ShellWindows で IE モードを列挙するように変更できるグループ ポリシーを提供予定 https://t.co/gSdTdRXiC1— ユスキィ (Yusuke Hara) (@ms_yuhara) January 7, 2022
Windows 11 については、以下の FAQ に記載の通り、KB5007262 (2021.11 C) 以降を適用した環境であれば、既にオートメーションで IE11 を起動できるように変更されています。https://t.co/a1CsqZJajs
— ユスキィ (Yusuke Hara) (@ms_yuhara) January 7, 2022
念のため補足しますと、これは既にオートメーションによる自動化のシステムを運用中のシナリオの救済を意図した変更です。そのため、いまからオートメーション起動するようにシステムを改修したり、通常のブラウザーとして使い続けたりすることを推奨もサポートもしないです。
— ユスキィ (Yusuke Hara) (@ms_yuhara) March 29, 2022
WebBrowserコントロールを使う
WebBrowserコントロールは、現時点では少なくとも2029年まではサポートされるようなので、使い勝手が良いかどうかは別として、UserFormにWebBrowserコントロールを挿入すれば、IE限定ページの表示や操作ができるでしょう。
前回の記事では、動的にUserFormを追加し、その上にWebBrowserコントロールを挿入してWebサイトの表示・操作を行うコードを紹介していますが、必ずしも動的に作成する必要はありません。
Power Queryを使う
.NETラボの2021年6月勉強会で、Microsoft MVPの村地さんが、スクレイピングによるデータの取得であれば、IEオートメーションの代替として「Power Query」が使えることを紹介されていました。
Power Queryの使い方に関しては、下記サイトが参考になるかと思います。
以上、IEオートメーションの代替方法をいくつか考えてみました。
前回の記事でも書きましたが、いまさらIEの操作にこだわるよりも他の手段を検討した方が良いだろうと個人的には思うのですが、“IE限定”でAPIも用意されていないシステムもまだまだ残っており、マクロでブラウザーを操作せざるを得ない状況の方も多いでしょう。
その場合はIEモードの操作やWebBrowserコントロールの活用といった抜け道もあるわけですが、IE非対応のWebサイトが増えてきている現状を踏まえると、やはり早急に脱・IE、脱・IE操作マクロに踏み切った方が良いだろうと思います。
(使用OSをIE11サポート終了の対象となっていない、Windows 10 LTSC等に切り替える方法も一応ありますが・・・💦)
編集履歴
- 2021/07/06:「Power Queryを使う」を追加しました。
- 2021/08/23:「TinySeleniumVBA」を追加しました。
- 2021/08/29:WebDriverをダウンロードするマクロとInternet Explorer_Serverウィンドウのハンドルを取得するマクロを追加しました。
- 2021/09/28:「DevTools ProtocolによるEdgeの操作」を追加しました。
- 2021/12/23:TinySeleniumVBAの関連リンクを追加しました。
- 2022/03/28:魔界の仮面弁士さんとユスキィさんのツイートを追加しました。
- 2022/05/16:冒頭の注意事項を追加しました。
ここまでまとまっているページは他にないですね。
ありがとうございます。