语言/软件:
语言是VBA。该应用程序是 Access 2003(我也可以使用 Excel)和 Internet Explorer(在 Windows XP/7 上)。
问题:
我正在开发一个 Access 宏,它可以打开和操作我工作的企业的 Intranet 站点。
我可以创建新的 IE 窗口并在表单中填写数据,但我需要能够拦截和操作其他 IE 窗口,例如当我单击链接时打开的弹出窗口,当我选择一个选择元素的选项或页面加载时。
语言/软件:
语言是VBA。该应用程序是 Access 2003(我也可以使用 Excel)和 Internet Explorer(在 Windows XP/7 上)。
问题:
我正在开发一个 Access 宏,它可以打开和操作我工作的企业的 Intranet 站点。
我可以创建新的 IE 窗口并在表单中填写数据,但我需要能够拦截和操作其他 IE 窗口,例如当我单击链接时打开的弹出窗口,当我选择一个选择元素的选项或页面加载时。
这是我用来从标题中获取 IE 窗口的一些代码。它分为两个功能,因为我的一个用户遇到了一个非常奇怪的问题,即没有正确捕获错误。您可能(可能会)能够将私有函数的主体移动到公共函数中。
此外,您需要设置对 Microsoft Internet 控件的引用(这是 shdocvw.dll 或 ieframe.dll,具体取决于您的 Windows 版本),我建议您设置对 Microsoft HTML 对象库的引用以使其更容易拥有 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
您几乎可以从窗口的任何属性或文档内容中找到一个窗口。如果您为此苦苦挣扎,请发表评论:)。