※下記情報は2021年5月時点の情報で、今後状況が変わっていく可能性があります。
先日、Microsoftから2022年6月にInternet Explorer 11デスクトップアプリケーションのサポートが終了されるとの発表がありました。
SNSでも大きな話題となっていましたが、VB/VBA界隈で著名な魔界の仮面弁士( @Benshi_Orator )さんが下記ツイートをされていました。
WebBrowser は生き残るらしいけれど…以下の技術はどうなるのかな。
⒈ .mht (Web アーカイブ)
⒉ .hta (HTA アプリケーション)
⒊ CreateObject("htmlfile")
⒋ CreateObject("InternetExplorer.Application")
⒌ IE モード利用時の ShellWindows コレクション列挙時の振る舞い https://t.co/3Hq3sV30vP— 弁士 (@Benshi_Orator) May 21, 2021
それに対するユスキィ( @ms_yuhara )さん ※マイクロソフトのブラウザー (Microsoft Edge / IE) の中の人 のご回答が下記になります。
IE11 デスクトップ アプリのサポート終了後
1. MHT は IE モード内で表示できる
2. HTA は引き続きサポートする
3. IHTMLDocument によるドキュメント操作は引き続きサポートする
4. オートメーションによる IE11 起動はできず、Edge にリダイレクトする
5. ShellWindows で IE モードは列挙できない https://t.co/a4qE5IugUm— ユスキィ (Yusuke Hara) (@ms_yuhara) May 21, 2021
もちろん、2021年5月時点での回答になりますので、実際には変更される可能性もあると思いますが、非常に参考になりました。
このIE11のサポート終了の知らせを受けて、MSDNフォーラムでもさっそくスレッドが立っていました。
上述の弁士さん含めて、何人かの方から回答が寄せられていて、いずれも参考になります。
(弁士さんにいたっては、すでにウィンドウからHTMLDocumentオブジェクトを取得するコードまで書かれています。)
とりあえず、WM_HTML_GETOBJECT を投げるところまでを VBA で実装してみた。
Edge から列挙するところも後で作りこむとしよう。https://t.co/S2OZ1RSEMB— 弁士 (@Benshi_Orator) May 21, 2021
このスピード感たるや、さすがと言わざるを得ません!素晴らしい!!✨
弁士さんのコードを用いれば、IEモードで表示中のページを操作できるようになるでしょう。
一方、ユスキィさんからは、“WebBrowserコントロールは引き続きサポートされるだろう”とのツイートもありました。
WebBrowser コントロールを含む IE のコンポーネント、WinINet などの API は引き続きサポートします。これらのサポート終了については現時点で未定ですが、やはり 2029 年をひとつの節目と捉えていただいた方が確実です (ここは個人の見解)。
— ユスキィ (Yusuke Hara) (@ms_yuhara) May 19, 2021
折角なので私も、動的に追加したWebBrowserコントロールでWebページ操作を行うマクロを書いてみました。
Option Explicit '動的にWebBrowserコントロールを追加してWebページ表示を行うサンプル '※[VBA プロジェクト オブジェクト モデルへのアクセスを信頼する]要有効 Public Sub Sample() Dim frmBrowser As Object Const ComponentName = "UserForm1" Const ControlName = "WebView" Const CtrlWidth = 640 Const CtrlHeight = 480 '事前にUserForm削除 On Error Resume Next With Application.VBE.ActiveVBProject.VBComponents .Remove .Item(ComponentName) End With On Error GoTo 0 'UserForm(VBIDE.VBComponent)追加 With Application.VBE.ActiveVBProject.VBComponents.Add(3) 'vbext_ct_MSForm .Name = ComponentName .Properties("Caption").Value = "WebBrowser" .Properties("BackColor").Value = &HFFFFFF .Properties("Width").Value = CtrlWidth .Properties("Height").Value = CtrlHeight .Properties("StartUpPosition").Value = 1 .Properties("ShowModal").Value = False 'WebBrowser(MSForms.Control)追加 With .Designer.Controls.Add("Shell.Explorer.2") .Name = ControlName .Top = 0 .Left = 0 .Width = CtrlWidth .Height = CtrlHeight End With End With Set frmBrowser = UserForms.Add(ComponentName) frmBrowser.Show 'WebBrowser操作 With frmBrowser.Controls(ControlName) '気休め程度にヘッダーにUser-Agent追加 .Navigate2 _ URL:="https://www.google.com/?hl=ja", _ Headers:="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Edg/90.0.818.66" Do While .Busy = True Or .ReadyState <> 4 DoEvents Loop .Document.getElementsByName("q")(0).Value = "初心者備忘録" .Document.getElementsByName("btnK")(0).Click End With End Sub
UserFormを動的に追加して、その上にWebBrowserコントロールを挿入しているだけのコードで、使い勝手はあまり良くありませんし、VBコンポーネントを動的に追加する都合上、「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」を有効にする必要が有ります(「Visual Basic Editor の自動化」参照)。
イベントを使いたいのであれば、下記コードのようにWithEventsを使用すれば良いでしょう。
'※ThisWorkbookに記述 '※[Microsoft Internet Controls]要参照 Option Explicit Private WithEvents WebView As SHDocVw.WebBrowser Public Sub Sample2() Dim frmBrowser As Object Const ComponentName = "UserForm1" Const ControlName = "WebView" Const CtrlWidth = 640 Const CtrlHeight = 480 '事前にUserForm削除 On Error Resume Next With Application.VBE.ActiveVBProject.VBComponents .Remove .Item(ComponentName) End With On Error GoTo 0 'UserForm(VBIDE.VBComponent)追加 With Application.VBE.ActiveVBProject.VBComponents.Add(3) 'vbext_ct_MSForm .Name = ComponentName .Properties("Caption").Value = "WebBrowser" .Properties("BackColor").Value = &HFFFFFF .Properties("Width").Value = CtrlWidth .Properties("Height").Value = CtrlHeight .Properties("StartUpPosition").Value = 1 .Properties("ShowModal").Value = False 'WebBrowser(MSForms.Control)追加 With .Designer.Controls.Add("Shell.Explorer.2") .Name = ControlName .Top = 0 .Left = 0 .Width = CtrlWidth .Height = CtrlHeight End With End With Set frmBrowser = UserForms.Add(ComponentName) frmBrowser.Show Set WebView = frmBrowser.Controls(ControlName) With WebView '気休め程度にヘッダーにUser-Agent追加 .Navigate2 _ URL:="https://www.google.com/?hl=ja", _ Headers:="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Edg/90.0.818.66" Do While .Busy = True Or .ReadyState <> 4 DoEvents Loop .Document.getElementsByName("q")(0).Value = "初心者備忘録" .Document.getElementsByName("btnK")(0).Click End With End Sub Private Sub WebView_DocumentComplete(ByVal pDisp As Object, URL As Variant) Debug.Print "DocumentComplete:" & URL End Sub
以上のように、IE11のサポート終了後は、基本的にはIEオートメーションによる操作(CreateObject(“InternetExplorer.Application”))はできなくなると思われますが、IEモードのウィンドウからHTMLDocumentオブジェクトを取得したり、WebBrowserコントロールを使用したりと、何らかの方法でIEによるWebページの表示・操作を行う手段は残されるようです。
(それすら2029年をひとつの節目と捉えた方が良いようですが)
ただ、MSDNフォーラムの回答にもありましたが、IEに対応していないWebサイトも増えてきましたし、今後もさらに増え続けていくはずですので、マクロからブラウザーの操作を行う際は、いまさら頑張ってIEをどうにかするよりは、Selenium WebDriverを使ってMicrosoft Edgeを操作するなり、公式に用意された手段を用いた方が良いだろうと、個人的には思います。あるいは、ブラウザーの操作をPower Automate DesktopのようなRPAソリューションに切り替えるのも一つの方法と言えるでしょう。
今回、魔界の仮面弁士さんとユスキィさんの一連のツイートが、IEを操作する系のVBAマクロが今後どのようになるのかを考える上で非常に参考になるものでしたので、大変勝手ではありますが、まとめさせていただきました。
2021/5/23 追記:
IEオートメーション系マクロの代替方法について、下記記事でもう少し具体的にまとめてみました。
WebBrowserコントロールですが、手動であらかじめ追加して使うことはできるのでしょうか?
> IKA様
もちろん手動で事前に追加して使用することもできます。
その場合は下記サイトのような手順になるかと思います。
https://www.atmarkit.co.jp/ait/articles/1502/06/news051.html