web-dev-qa-db-ja.com

VBAを使用してInternetExplorerポップアップを傍受して操作する方法

言語/ソフトウェア:

言語はVBAです。アプリケーションはAccess2003(Excelも使用できます)とInternet Explorer(Windows XP/Seven)です。

問題:

私が働いている企業のイントラネットサイトを開いて操作するAccessマクロを開発しています。

新しいIEウィンドウを作成し、フォームにデータを入力することはできますが、ポップアップなどの他のIEウィンドウをインターセプトして操作できる必要があります。リンクをクリックしたとき、選択要素のオプションを選択したとき、またはページが読み込まれたときに開きます。

10
Nathan Nathan

タイトルからIEウィンドウを取得するために使用するコードを次に示します。ユーザーの1人がエラーを適切にキャッチできないという非常に奇妙な問題を抱えていたため、2つの関数に分割されています。 (おそらく)プライベート関数の本体をパブリック関数に移動することができます。

さらに、Microsoft Internet Controls(Windowsのバージョンに応じてshdocvw.dllまたはieframe.dllのいずれか)への参照を設定する必要があります。簡単にするために、MicrosoftHTMLオブジェクトライブラリへの参照を設定することをお勧めします。 IEオブジェクトを取得したら、DOMをトラバースします。

Function oGetIEWindowFromTitle(sTitle As String, _
                               Optional bCaseSensitive As Boolean = False, _
                               Optional bExact As Boolean = False) As SHDocVw.InternetExplorer

    Dim objShellWindows As New SHDocVw.ShellWindows
    Dim found As Boolean
    Dim startTime As Single

    found = False
    'Loop through Shell windows
    For Each oGetIEWindowFromTitle In objShellWindows
        found = oGetIEWindowFromTitleHandler(oGetIEWindowFromTitle, sTitle, bCaseSensitive, bExact)
        If found Then Exit For
    Next

    'Check whether a window was found
    If Not found Then
        Set oGetIEWindowFromTitle = Nothing
    Else
        pauseUntilIEReady oGetIEWindowFromTitle
    End If

End Function

Private Function oGetIEWindowFromTitleHandler(win As SHDocVw.InternetExplorer, _
                                      sTitle As String, _
                                      bCaseSensitive As Boolean, _
                                      bExact As Boolean) As Boolean

    oGetIEWindowFromTitleHandler = False

    On Error GoTo handler
    'If the document is of type HTMLDocument, it is an IE window
    If TypeName(win.Document) = "HTMLDocument" Then
        'Check whether the title contains the passed title
        If bExact Then
            If (win.Document.title = sTitle) Or ((Not bCaseSensitive) And (LCase(sTitle) = LCase(win.Document.title))) Then oGetIEWindowFromTitleHandler = True
        Else
            If InStr(1, win.Document.title, sTitle) Or ((Not bCaseSensitive) And (InStr(1, LCase(win.Document.title), LCase(sTitle), vbTextCompare) <> 0)) Then oGetIEWindowFromTitleHandler = True
        End If
    End If
handler:
    'We assume here that if an error is raised it's because
    'the window is not of the correct type. Therefore we
    'simply ignore it and carry on.

End Function

上記のコードを次のように使用します。

Sub test()

    Dim ie As SHDocVw.InternetExplorer
    Dim doc As HTMLDocument 'If you have a reference to the HTML Object Library
    'Dim doc as Object 'If you do not have a reference to the HTML Object Library

    ' Change the title here as required
    Set ie = oGetIEWindowFromTitle("My popup window")
    Set doc = ie.Document

    Debug.Print doc.getElementsByTagName("body").Item(0).innerText

End Sub

ウィンドウのほぼすべてのプロパティ、またはそのドキュメントの内容からウィンドウを見つけることができます。これに苦労している場合は、コメントしてください:)。

5
mkingston