使用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
我如何才能访问这些标签....
我知道如何使用单个标签但不是多个标签来完成所有这些操作?
答案 0 :(得分:5)
虽然我没有进行严格的测试,但我找到了一个似乎有效的答案。我修改了你的代码,这样我就可以在没有你的clsIE模块的情况下运行它。此代码在打开它们时将标签导航到3个URL,然后使用shellwindows对象将它们导航到新的URL。
我更改了do而.busy ..行,因为它们不适用于第二和第三个标签,因为IE应用程序的状态已准备好,而新标签仍在加载。
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
它使用ShellWindows来操作选项卡。这只是通过数字来完成的,所以我猜它可能容易出错。
为了使其更加健壮,您可能希望在操作后从选项卡中获取一些信息,并在返回时检查值是否相同。例如,sPageTitle = SWs.Item(IETab3Number - 1).Document.Title
可用于在选项卡中存储页面标题,下次要使用选项卡时,可以检查它是否未更改。
答案 1 :(得分:3)
简单的解决方法是将新标签重新分配给对象
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
答案 2 :(得分:1)
以下是我如何解决使用VBScript在一个IE窗口中对选项卡进行分组的问题。如果函数找到带有以tabGroupS
开头的标签的IE窗口(例如“http://stackoverflow.com”),那么它会在此窗口中添加一个新标签并返回此标签,否则会打开一个新窗口。
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
答案 3 :(得分:0)
试试这段代码:
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