VBA代码循环链接,单击它们并关闭浏览器

时间:2017-01-17 09:01:16

标签: vba internet-explorer url

我希望我的代码执行以下一系列步骤:

  1. 从单元格中获取网址
  2. 打开网址
  3. 等待几秒钟让页面加载
  4. 单击页面上的按钮以创建数据库对象
  5. 等待一段时间让页面加载
  6. 关闭页面
  7. 更新状态栏以显示进度
  8. 需要在每个循环实例中打开和关闭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
    

    当我逐步检查代码时出现此错误

    enter image description here

    set Tags行,我不知道如何修复它。

    我已经尝试录制宏来查看VBA如何看到点击按钮的操作,但该动作根本没有录制。

1 个答案:

答案 0 :(得分:2)

可能导致问题的事情:

  1. 我会将你的IE初始化和关闭移到循环之外 - 将它们留在里面只是让IE打开并反复关闭,但是IE的单个实例可以反复使用循环。< / p>

  2. 将等待函数替换为While IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Wend这将使应用程序等到页面完全加载后再继续。

  3. 通过点击该元素,我不清楚你在做什么,但我相信这可能是你的错误发生的地方 - 点击链接之后循环继续但IE已经导航到一个不同的页面,所以HTML已经改变 - 根据我的经验,这将导致元素集合重置,这将打破你的循环。

  4. 下面是我将使用的两个版本的代码 - 版本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
    

    根据您的意图和您想要做的事情,这两个版本中的一个应该适合您。

    希望这有帮助