やばいです。ブレイクスルーです。
IEサポート終了の話が出てから、Excel VBA開発者たちの中では
「モダンブラウザをVBAから如何に制御するか?」は大きな課題となっています。
昨今のスタンダードはSelenium VBAによる外部ブラウザの制御かと思いますが、
この度、ユーザーフォーム上にWebView2コントロールを配置する
というアプローチにおいて、大きな進展がありました。
これまではWebView2を使うと言っても.NET系アプリに実装したWebView2コントロールを、
そのアプリのCOMインターフェースを用意してタイプライブラリを作成し、
それをインストールした上で参照設定を通すというような非現実的な手法しかありませんでした。
そんな中、https://eschamali.github.io/StarterWebScrapingKit/#userform-powershell
こちらの記事で紹介されていますが、もっくんさんが重要な事実を発見しました。
その中で今回のプロジェクトの直接的なきっかけとなったのが、
C:\Program Files\Microsoft Office\root\Office16\ADDINS\Microsoft Power Query for Excel Integrated\bin
こちらのパス内に、WebView2のプログラム群(dll)が最初からインストール済みである
という事実です。
少し使い方を調べてみると、WebView2Loader.dllの関数は
DecleareステートメントによってVBAから直接呼び出せることが分かりました。
後はひたすら泥臭いコーディング&テストを重ねた末、
以下のような手順で、フォーム上に配置したWebVeiw2を制御できるようになりました。
<WebView2オブジェクト取得まで>
Declareステートメント宣言でWebView2Loader.dllのCreateCoreWebView2EnvironmentWithOptionsをコール
↓
Microsoft.Web.WebView2.Core.dllがロードされ、
WebView2Environmentオブジェクトが作成される
↓
標準モジュールに準備したWebView2Environmentの
作成完了通知を受け取る関数がコールされる
↓
VBAからWebView2Environment.CreateCoreWebView2Controllerメソッドを呼ぶ
↓
WebView2.exe内でWebView2Controllerが作成される
↓
標準モジュールに準備したWebView2Controllerの
作成完了通知を受け取る関数がコールされる
↓
VBAからWebView2Controller.GetWebView2メソッドでWebView2オブジェクトを取得
↓
WindowsAPI等でChrome_WidgetWin_0クラスウィンドウの位置とサイズを調整
<WebView2の制御:イベントハンドラの登録例>
WebView2.add_NavigationCompletedを実行
(実行時にAddress of演算子でコールバック関数のポインタを渡す)
↓
WebView2.Navigateメソッドを実行
↓
ページ読み込みが完了したら、
標準モジュールに配置したイベントハンドラがコールされる
なお、WebView2Environmentオブジェクト取得以降の関数は、
全部DispCallFuncを使用してコールする必要がありますし、
コールバック関数をWebView2側から呼び出してもらうためには
COMの仮想関数テーブルをメモリ上に捏造しなければならないため、
VBA超上級者でないとライブラリ開発は難しいでしょう。
以下のリポジトリで開発を進めていきますので、
興味のある方は各種イベントハンドラの実装に挑戦してみてください。
また、このプロジェクトの果てに得られる機能として
・モダンなWebブラウザコントロールをユーザーフォーム配下に実装し、完全なコントロール権を得ること
・ユーザーフォーム上でのマウスホイールにるスクロール操作や右クリックによるコンテキストメニューが使えるようになること
・ActiveXコントロールに依存しないTreeViewやListViewコントロールを使えるようになること
などを期待しています。
もしかすると、ユーザーフォーム上のコントロールは全部WebView2上に描画するのが常識という時代が来るかもしれません。