Accessing IE tabs once created

后端 未结 4 1010
南笙
南笙 2020-12-05 21:53

Using VBA I can create an InternetExplorer object with 3 different tabs using the following

Option Explicit

Public Enum IE_READYSTATE
    Uninitialised = 0
         


        
相关标签:
4条回答
  • 2020-12-05 22:16

    I have found an answer that appears to work, though I haven't done rigorous testing. I've modified your code so that I can run it without your clsIE module. This code navigates the tabs to 3 urls when opening them and then navigates them to new urls using the shellwindows object.

    I changed the do while .busy.. lines as they didn't work for the 2nd and 3rd tabs in that the state of the IE applecation was ready whilst the new tabs were still loading.

    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
    

    It uses the ShellWindows to manipulate the tabs. This is only done by number so I'm guessing it could be prone to errors.

    To make it more robust you may want to get some info from the tab after an operation and check that the value is the same when returning to it. For example sPageTitle = SWs.Item(IETab3Number - 1).Document.Title could be used to store the title of the page in a tab, the next time you want to use the tab you can check that it hasn't changed.

    0 讨论(0)
  • 2020-12-05 22:19

    Here is how I solved the problem of grouping tabs in one IE window using VBScript. If the function finds IE window with a tab whose URL starts with tabGroupS (e.g. "http://stackoverflow.com") then it adds a new tab to this window and returns this tab otherwise it opens a new window.

    Private Function getNewTab(tabGroupS)
        Dim i, objs, cnt, openflag
        Set objs = CreateObject("Scripting.Dictionary")
        Set SWObj = CreateObject("Shell.Application").Windows()
        For Each i In SWObj
            If LCase(Right(i.FullName, 12)) = "iexplore.exe" Then objs.Add objs.Count, i
        Next
        cnt = SWObj.Count
        For Each i In objs
            If Left(objs(i).LocationURL, Len(tabGroupS)) = tabGroupS Then
                openflag = True
                objs(i).Navigate2 "about:blank", &H800
                Exit For
            End If
        Next
        If Not openflag Then
            Set getNewTab = CreateObject("InternetExplorer.Application")
            getNewTab.Visible = True
            Exit Function
        End If
        Do: WScript.Sleep 100: Loop Until SWObj.Count > cnt 'wait until new tab is opened
        For Each i In SWObj
            If LCase(Right(i.FullName, 12)) = "iexplore.exe" Then
                If Not hasObj(i, objs) Then
                    Set getNewTab = i
                    Exit Function
                End If
            End If
        Next
    End Function
    
    Function hasObj(obj, col)
        For Each i In col
            If obj Is col(i) Then
                hasObj = True
                Exit Function
            End If
        Next
    End Function
    
    0 讨论(0)
  • 2020-12-05 22:29

    Try this code:

    Sub FillinternetForm()
        Dim ie As Object
        Set ie = CreateObject("Internetexplorer.Application")
        ie.Navigate "https://google.com"
        ie.Visible = True
        While ie.Busy
            DoEvents 'wait until IE is done loading page.
        Wend
        ie.Document.all("lst-ib").Value = "Fast Sub"
        ie.Navigate "https://google.com", CLng(2048)
        ie.Document.all("lst-ib").Value = "Fast slow Sub"
    End Sub
    
    0 讨论(0)
  • 2020-12-05 22:35

    Simple workaround is just reassign the new tab to the object

    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
    
    0 讨论(0)
提交回复
热议问题