Office関連

【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 2013 アイコン一覧(E)

    ・Office 2013 アイコン一覧 NUM…

  2. Office関連

    SmartArtからテキストを取得するPowerPointマクロ

    Twitterで@terrysaitoさんが下記のようなツイートをされ…

  3. Excel

    [リボン・カスタマイズ]toggleButtonのオン・オフを動的に変更する。

    “リボン上のトグルボタンをマクロで押し下げすることはできないか?”、と…

  4. Office関連

    右クリックメニューを非表示にするExcelマクロ

    Answersに図形を右クリックしたときのメニューをマクロで非表示にし…

  5. Windows関連

    Windows 8.1をインストールしてみました。

    下記の記事にもあるように、開発者向けにWindows 8.1の製品版(…

  6. Office関連

    Word 2013では文書にオンライン ビデオを挿入できるようになりました。

    ※ この情報はOffice 2013 カスタマー プレビュー版を元にし…

コメント

  • コメント (1)

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

    • 中松拓也
    • 2018年 11月 11日 9:08pm

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP