FC2ブログ

EXCELのVBAでIEをコントロールその1

VBAでインターネットエクスプローラーを制御するプログラムを作っていて課題となっていたのがポップアップメッセージへの対応とモダールダイヤログへの対応だった。
スクリプトから表示されるメッセージボックスやアラート、コンファームについては「hwnd = FindWindow("#32770", "Web ページからのメッセージ")」なかんじで対応できていたけど、モダールダイヤログはどうしていいのかわからなかった。

さんざん調べて出てきたのがこれ
hWnd = FindWindow("Internet Explorer_TridentDlgFrame", vbNullString)
こいつでやっとこモダールダイヤログを捕まえることができた

さらには、このウインドウハンドルからIEのドキュメントを取得するすべも発見
ドキュメントさえ捕まえられれば、あとは通常のDOMへの処理となる

今回は前回記事にのせた参考ページから転載した一連のソースをのせておく
もとネタから変更を加えたのは
'-----編集したのはここだけ
のところ

だれかの参考になればと思う

〇おまけ
DOMの操作にはDOMの分析が必要
目でソースを眺めるのもいいのだが
それはあまりにも不効率

なので、DOM要素を分析してエクセルのシートに展開するVBAを作成済である
今回、モダールダイヤログのドキュメントを取得できたので
この分析にかければ、単純にメッセージボックスにOKキーをセンドするようなものではない
もっと複雑な処理も可能になる

DOM要素の分析ロジックソースについては
もう少しこなれてからご報告する

'--------------------------------------------------------------------
Option Explicit
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, _
ByRef lParam As Any, _
ByVal fuFlags As Long, _
ByVal uTimeout As Long, _
ByRef lpdwResult As Long) As Long
Private Declare Function ObjectFromLresult Lib "oleacc" _
(ByVal lResult As Long, _
ByVal riid As Long, _
ByVal wParam As Long, _
ByRef ppvObject As Any) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
(ByVal hwndParent As Long, _
ByVal hwndChildAfter As Long, _
ByVal lpszClass As String, _
ByVal lpszWindow As String) As Long
'--------------------------------------------------------------------
Public Type UUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
'--------------------------------------------------------------------
Sub ChildWindowDOM()
Dim objDocument As Object
Dim objA As Object
Dim hWnd As Long
'ハンドルの取得
hWnd = FindWindow("Internet Explorer_TridentDlgFrame", vbNullString)
hWnd = FindWindowEx(hWnd, 0&, "Internet Explorer_Server", vbNullString)
If hWnd = 0 Then
MsgBox "ハンドルが取得できませんでした。"
Exit Sub
End If
'IHTMLDocument取得
Set objDocument = WindowDOM(hWnd)
'-----編集したのはここだけ
'取得したダイヤログウインドウのID「OKButton」をクリック
objDocument.getElementById("OKButton").Click
'-----編集したのはここまで
Set objDocument = Nothing
End Sub
'-------------------------------------------------------------------------
Private Function WindowDOM(ByVal hWnd As Long) As Object ' IHTMLDocument
Dim lngMsg As Long
lngMsg = RegisterWindowMessage("WM_HTML_GETOBJECT")
If lngMsg = 0 Then
Exit Function
End If
Const SMTO_ABORTIFHUNG As Long = &H2
Dim lngRes As Long
SendMessageTimeout hWnd, lngMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, lngRes
If lngRes = 0 Then
Exit Function
End If
Dim IID_IHTMLDocument(3) As Long
IID_IHTMLDocument(0) = &H626FC520
IID_IHTMLDocument(1) = &H11CFA41E
IID_IHTMLDocument(2) = &HA00031A7
IID_IHTMLDocument(3) = &H372608C9
ObjectFromLresult lngRes, VarPtr(IID_IHTMLDocument(0)), 0, WindowDOM
End Function
'--------------------------------------------------------------------
関連記事
スポンサーサイト

コメントの投稿

非公開コメント

おもちゃ箱
Count from 2010/01/14

にほんブログ村 バイクブログ ドゥカティへ


カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
最新記事
最新コメント
カテゴリ
月別アーカイブ
リンク
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

全記事表示リンク

全ての記事を表示する