创建后访问IE选项卡

use*_*963 5 internet-explorer vba internet-explorer-10

使用VBA我可以使用以下内容创建一个包含3个不同选项卡的InternetExplorer对象

Option Explicit

Public Enum IE_READYSTATE
    Uninitialised = 0
    Loading = 1
    Loaded = 2
    Interactive = 3
    complete = 4
End Enum

Sub Example_Click()
Dim ieApp As clsIE

    'Create IE and login
    If ieApp Is Nothing Then
        Set ieApp = New clsIE
        With ieApp

            'IE Tab1
            .IE.Visible = True
            .IE.navigate "http://www.bbc.co.uk/news/"
            Do While .IE.Busy Or Not .IE.readyState = IE_READYSTATE.complete: DoEvents: Loop

            'IE Tab2
            .IE.Navigate2 "http://www.bbc.co.uk", CLng(2048)
            Do While .IE.Busy Or Not .IE.readyState = IE_READYSTATE.complete: DoEvents: Loop

            'IE Tab3
            .IE.Navigate2 "http://www.bbc.co.uk", CLng(2048)
            Do While .IE.Busy Or Not .IE.readyState = IE_READYSTATE.complete: DoEvents: Loop


        End With
    End If

End Sub
Run Code Online (Sandbox Code Playgroud)

我怎样才能访问这些标签....

  1. 退出/关闭特定选项卡?
  2. 导航到特定标签上的新网址?
  3. 访问特定的标签DOM?

我知道如何使用单个选项卡而不是多个选项卡执行所有这些操作?

Gra*_*son 5

虽然我没有做过严格的测试,但我找到了一个似乎有效的答案.我修改了你的代码,这样我就可以在没有你的clsIE模块的情况下运行它.此代码在打开它们时将标签导航到3个URL,然后使用shellwindows对象将它们导航到新的URL.

我更改了do而.busy ..行,因为它们不适用于第2和第3个选项卡,因为IE applecation的状态已准备好,而新选项卡仍在加载.

Sub Example_Click()
Dim ieApp As InternetExplorer
Dim SWs As ShellWindows
Dim IETab1Number As Integer
Dim IETab2Number  As Integer
Dim IETab3Number As Integer

Set SWs = New ShellWindows

'Create IE and login
If ieApp Is Nothing Then
    Set ieApp = CreateObject("InternetExplorer.Application")
    With ieApp

       'IE Tab1
       .Visible = True
       .Navigate "http://www.bbc.co.uk/news/"
       Do While .Busy Or Not .ReadyState = IE_READYSTATE.complete: DoEvents: Loop
       IETab1Number = SWs.Count

       'IE Tab2
       .Navigate2 "http://www.bbc.co.uk/news/uk-scotland-north-east-orkney-shetland-23822420", CLng(2048)
       'Do While .Busy Or Not .ReadyState = IE_READYSTATE.complete: DoEvents: Loop
       Do While SWs.Count = IETab1Number: DoEvents: Loop

       IETab2Number = SWs.Count

       'IE Tab3
       .Navigate2 "http://www.bbc.co.uk", CLng(2048)
       'Do While .Busy Or Not .ReadyState = IE_READYSTATE.complete: DoEvents: Loop
       Do While SWs.Count = IETab2Number: DoEvents: Loop
       IETab3Number = SWs.Count
       'ieApp.Visible = False

       SWs.Item(IETab1Number - 1).Navigate "http://www.bbc.co.uk/"
       SWs.Item(IETab2Number - 1).Navigate2 "http://www.bbc.co.uk/news/"
       SWs.Item(IETab3Number - 1).Navigate2 "http://www.bbc.co.uk/news/"


    End With
End If
Set ieApp = Nothing
Set SWs = Nothing

End Sub
Run Code Online (Sandbox Code Playgroud)

它使用ShellWindows来操作选项卡.这只是通过数字来完成的,所以我猜它可能容易出错.

为了使其更加健壮,您可能希望在操作后从选项卡中获取一些信息,并在返回时检查值是否相同.例如sPageTitle = SWs.Item(IETab3Number - 1).Document.Title,可以用于在选项卡中存储页面标题,下次要使用选项卡时,可以检查它是否未更改.


小智 5

简单的解决方法是将新选项卡重新分配给对象

IE.navigate "http://www.bbc.co.uk/news/", CLng(2048)
Do While IE.Busy Or Not IE.readyState = IE_READYSTATE.complete: DoEvents: Loop
With CreateObject("Shell.Application").Windows
Set IE = .Item(.Count - 1)
End With
Run Code Online (Sandbox Code Playgroud)