Windows 10

【2017年1月版】Microsoft Edgeを操作するVBAマクロ(DOM編)

2021/10/1 追記:
本記事は公開されてから大分時間が経っており内容も古くなっております。
VBAからのブラウザー操作につきましては下記記事もご参照ください。


Microsoft Edge VBA 操作」こういったキーワード検索での、下記記事へのアクセスが結構あります。

Edge内にある「Internet Explorer_Server」クラスのウィンドウからIHTMLDocument経由で無理やりDOM操作するマクロですが、このコードを書いたのは2015年の8月です。

今は2017年、Windows 10も何度もバージョンアップを重ね、さすがにもうこのコードも動かないだろうと思って、久々にマクロを実行してみたところ・・・。

動きませんでした!

それはそうです。
Edgeだって改良され、ウィンドウの構造だって変わっているはずです。
Spy++で確認してみても、やはりEdgeの下に「Internet Explorer_Server」クラスのウィンドウは見つかりません。

「あー、やっぱりこんな無理やりなコードは動かなくなるよなー!そりゃ当然だよ」と思っていたところ、ふと下の方のウィンドウを見ると・・・。

有りました!
TabWindowClass」クラスのウィンドウの下に「Internet Explorer_Server」クラスのウィンドウが!!

プロセスIDからプロセスを確認してみると、「Microsoft Edge」となっています。

未だにEdgeはInternet Explorer_Serverを持っているのか!
なら先のコードはまだ動くんじゃないか!?

・・・というわけで修正したのが下記のコードです。

Option Explicit

Private Type UUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(0 To 7) As Byte
End Type

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare Function ObjectFromLresult Lib "oleacc" (ByVal lResult As Long, riid As Any, ByVal wParam As Long, ppvObject As Object) As Long
Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" (ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Const SMTO_ABORTIFHUNG = &H2

Public Sub Sample_EdgeDOM()
'Microsoft EdgeをDOM操作(64ビット版Excelではコード要変更)
'http://www.mvps.org/emorcillo/en/code/vb6/iedom.shtml 参照
'
'※下記環境で動作確認
'Microsoft Windows 10 Pro Insider Preview バージョン:10.0.15019 ビルド 15019
'Microsoft Edge 40.15019.1000.0
'Microsoft Excel 2016 MSO (16.0.7668.7078) 32 ビット

  Dim hEdge As Long
  Dim hIES As Long
  Dim msg As Long
  Dim res As Long
  Dim d As Object
  Dim IID_IHTMLDocument2 As UUID
  
  'Edge起動
  CreateObject("Shell.Application").ShellExecute "microsoft-edge:http://www.yahoo.co.jp/"
  Sleep 2000
  
  'TabWindowClassウィンドウ取得
  hEdge = FindWindowEx(0, 0, "TabWindowClass", vbNullString)
  If hEdge = 0 Then Exit Sub
  
  'Internet Explorer_Serverウィンドウ取得
  hIES = FindWindowEx(hEdge, 0, "Internet Explorer_Server", vbNullString)
  If hIES = 0 Then Exit Sub
  
  'IHTMLDocument2取得
  msg = RegisterWindowMessage("WM_HTML_GETOBJECT")
  SendMessageTimeout hIES, msg, 0, 0, SMTO_ABORTIFHUNG, 1000, res
  If res Then
    With IID_IHTMLDocument2
      .Data1 = &H332C4425
      .Data2 = &H26CB
      .Data3 = &H11D0
      .Data4(0) = &HB4
      .Data4(1) = &H83
      .Data4(2) = &H0
      .Data4(3) = &HC0
      .Data4(4) = &H4F
      .Data4(5) = &HD9
      .Data4(6) = &H1
      .Data4(7) = &H19
    End With
    If ObjectFromLresult(res, IID_IHTMLDocument2, 0, d) = 0 Then
      'DOM操作
      d.getElementById("srchtxt").Value = "初心者備忘録ブログ"
      d.getElementById("srchbtn").Click
      While LCase(d.ReadyState) <> "complete"
        Sleep 100
      Wend
      MsgBox d.Title, vbInformation + vbSystemModal
    End If
  End If
End Sub

上記コードを実行すると、何の問題もなく、意図した通りにマクロが実行されます。

コード中にコメントで書いている通り、実行環境は下記の通りで、この記事を書いている2017年1月時点では最新の環境です。

  1. Microsoft Windows 10 Pro Insider Preview バージョン:10.0.15019 ビルド 15019
  2. Microsoft Edge 40.15019.1000.0
  3. Microsoft Excel 2016 MSO (16.0.7668.7078) 32 ビット

まさか未だにこんなやり方が通用するとは・・・。
Edge恐るべし、です。

※ 動くといっても上記方法はMicrosoftが推奨している方法ではありません。いつ使えなくなるかも分かりませんので、Edge操作の自動化を行いたい場合には、正式にサポートされている「WebDriver」を使うことをお薦めします。


2017/2/1 追記:
Edgeのプロセスからウィンドウを探すコードも書いてみました。


2019/6/5 追記:
SeleniumBasicを使ってMicrosoft Edgeを操作する方法についても記事を書きました。

Adobe IDによるサインイン無しでAcrobat DCをインストールする方法前のページ

2017年1月の人気記事次のページ

関連記事

  1. Office関連

    【2017年7月版】ポータブル デバイスからファイルをコピーするVBAマクロ

    4年ほど前に、PCに接続したスマートフォン等のWindows ポータブ…

  2. Office関連

    図形の結合を行うPowerPoint マクロ(ExecuteMsoメソッド編)

    Excel MVPの伊藤さんのブログで、PowerPointの「図形の…

  3. Office関連

    オデッセイ コミュニケーションズ主催のExcel VBA入門セミナーに参加しました。

    今月19日に開催されたオデッセイ コミュニケーションズさん主催の「Ex…

  4. Office アドイン

    [Office用アプリ]開発入門の記事を書かせていただきました。

    日経ソフトウエア 2014年3月号から連載の「Office用アプリ開発…

  5. Office関連

    文字列を横方向に移動するWordマクロ(WordBasic編)

    いつもお世話になっているWord MVPの新田さんが、まるでカニの動き…

  6. Windows関連

    CSMenuをWindows 8で使ってみました。

    ※ 下記はWindows Developer Preview(英語版・…

コメント

  • コメント (1)

  • トラックバックは利用できません。

    • 中松拓也
    • 2018年 11月 11日

    edgeのvbaについて教えていただきたいのですが、可能でしょうか?
    よろしくお願いします

Time limit is exhausted. Please reload CAPTCHA.

Translate

Chinese (Simplified)Chinese (Traditional)EnglishFrenchGermanJapaneseKoreanRussianSpanish

最近の記事

アーカイブ

PAGE TOP