我希望我的代码执行以下一系列步骤:
需要在每个循环实例中打开和关闭IE,以避免使用太多选项卡阻塞IE。在工作表中最多可能有1000个URL。
这是我写的循环
For i = 14 To 13 + Count
'get the URL
URL = Range("F" & i)
'Open IE instance
Set IE = CreateObject("InternetExplorer.Application")
'navigate to the URL
With IE
.Visible = True
.Navigate URL
End With
'wait that the page is loaded
Application.Wait (Now() + TimeValue("0:00:4"))
'click on the create object button
Set Tags = IE.Document.GetElementsByTagname("Input")
For Each tagx In Tags
If tagx.alt = "Create object" Then
tagx.Click
End If
Next
'wait the page to be loaded
Application.Wait (Now() + TimeValue("0:00:10"))
'close the tab
IE.Quit
'update progess bar
Application.StatusBar = "Progress: " & i - 13 & " of " & Count & ": " & Format((i - 13) / Count, "0%")
Next i
当我逐步检查代码时出现此错误
在set Tags
行,我不知道如何修复它。
我已经尝试录制宏来查看VBA如何看到点击按钮的操作,但该动作根本没有录制。
答案 0 :(得分:2)
可能导致问题的事情:
我会将你的IE初始化和关闭移到循环之外 - 将它们留在里面只是让IE打开并反复关闭,但是IE的单个实例可以反复使用循环。< / p>
将等待函数替换为While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Wend
这将使应用程序等到页面完全加载后再继续。
通过点击该元素,我不清楚你在做什么,但我相信这可能是你的错误发生的地方 - 点击链接之后循环继续但IE已经导航到一个不同的页面,所以HTML已经改变 - 根据我的经验,这将导致元素集合重置,这将打破你的循环。
下面是我将使用的两个版本的代码 - 版本1点击满足If条件的第一个元素,然后不执行任何其他操作。如果有其他链接符合If条件,则不会被单击,因为一旦找到并单击了第一个元素,循环就会被破坏。见下文:
Sub version1()
Dim URL As String
Dim IE As InternetExplorer
Set IE = New InternetExplorer
For i = 14 To 13 + Count
URL = Range("F" & i)
With IE
.Visible = True
.Navigate URL
While .Busy Or .ReadyState <> READYSTATE_COMPLETE: Wend
End With
Set tags = IE.document.getElementsByTagName("Input")
For Each tagx In tags
If tagx.alt = "Create object" Then
tagx.Click
Exit For
End If
Next
While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Wend
Application.StatusBar = "Progress: " & i - 13 & " of " & Count & ": " _
& Format((i - 13) / Count, "0%")
Next i
IE.Quit
Set IE = Nothing
End Sub
版本2使用一个集合来存储满足if条件的所有元素,然后在最后通过并点击每个元素...见下文:
Sub version2()
Dim URL As String
Dim IE As InternetExplorer
Dim links As Collection
Set IE = New InternetExplorer
For i = 14 To 13 + Count
Set links = New Collection
URL = Range("F" & i)
With IE
.Visible = True
.Navigate URL
While .Busy Or .ReadyState <> READYSTATE_COMPLETE: Wend
End With
Set tags = IE.document.getElementsByTagName("Input")
For Each tagx In tags
If tagx.alt = "Create object" Then
links.Add tagx
End If
Next
For counter = 1 To links.Count
links.Item(counter).Click
While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Wend
Next
Set links = Nothing
Application.StatusBar = "Progress: " & i - 13 & " of " & Count _
& ": " & Format((i - 13) / Count, "0%")
Next i
IE.Quit
Set IE = Nothing
End Sub
根据您的意图和您想要做的事情,这两个版本中的一个应该适合您。
希望这有帮助