VBA Internet Explorer下拉列表问题

时间:2017-02-28 03:07:27

标签: excel vba excel-vba internet-explorer

我试图通过Excel使用VBA抓取一些数据。我对VBA非常生疏,但我对我的google-fu充满信心,5个多小时后也没有运气。我已经看到很多方法可以使用下拉菜单,但似乎没有一种方法可以使用这个菜单。我已成功导航到https://www.kbb.com/used-cars/,但我无法使用"年"落下。也许我没有使用正确的ID /名称?如果我留下任何重要信息,请告知我们。

代码:

Sub WebForumEntry()
Dim IE As Object

Set IE = CreateObject("InternetExplorer.Application")
IE.Top = 0
IE.Left = 0
IE.Width = 800
IE.Height = 600
IE.AddressBar = 0
IE.StatusBar = 0
IE.Toolbar = 0

IE.Navigate "http://www.kbb.com"
IE.Visible = True

Do
DoEvents
Loop Until IE.ReadyState = 4


'Click on the "Used Car Values" link
Set AllHyperlinks = IE.document.getelementsbytagname("A")

    For Each hyper_link In AllHyperlinks

        If hyper_link.innertext = "Used Car Prices" Then
            hyper_link.Click
            Exit For

        End If
    Next


'Select model year"
Set e = IE.document.getElementbyid("yearDropdown")

Dim o
For Each o In e.Options
    If o.Value = "2012" Then
        o.Selected = True
        Exit For
    End If
Next

End Sub

2 个答案:

答案 0 :(得分:0)

在HTML中没有Option个标签供您选择:

<div class="form-group">
  <select id="yearDropdown" name="yearId" class="dropdown-one year-dropdown" data-default-option="Year" data-preselected-value=""></select>
</div>

这些年份是根据您是选择新的/使用的等动态生成的。因此您无法选择不存在的内容 - 也许您可以直接设置值,例如:

IE.document.getElementbyid("yearDropdown").value = "2012"

修改

请注意原始代码中存在问题:

'Click on the "Used Car Values" link
Set AllHyperlinks = IE.document.getelementsbytagname("A")
For Each hyper_link In AllHyperlinks
    If hyper_link.innertext = "Used Car Prices" Then
        hyper_link.Click
        Exit For 
    End If
Next

'Select model year"
Set e = IE.document.getElementbyid("yearDropdown") '<-- error here if page not loaded per hyper_link.Click

当您调用hyper_link.Click时,它将加载另一个页面(下拉列表所在的位置),然后根据Exit For运行的下一个命令是Set e = IE...,它将尝试访问一个元素尚不存在,因为页面仍按hyper_link.Click加载。要解决这个问题,你可以像下面这样暂停:

Application.Wait Now + TimeValue("0:00:04")

这有点像黑客 - 而且可能有更好的方法来解决它 - 但它会让你根据我的第一个建议设置下拉列表:

完整代码(重写你的代码):

Option Explicit

Sub WebForumEntry()

    Dim IE As Object
    Dim AllHyperLinks As Object
    Dim hyper_link As Object
    Dim e As Object

    Set IE = CreateObject("InternetExplorer.Application")
    IE.Top = 0
    IE.Left = 0
    IE.Width = 800
    IE.Height = 600
    IE.AddressBar = 0
    IE.StatusBar = 0
    IE.Toolbar = 0

    IE.Navigate "http://www.kbb.com"
    IE.Visible = True

    ' wait for page to load
    Do
        DoEvents
    Loop Until IE.ReadyState = 4

    'Click on the "Used Car Values" link
    Set AllHyperLinks = IE.document.getelementsbytagname("A")

    For Each hyper_link In AllHyperLinks
        If hyper_link.innertext = "Used Car Prices" Then
            hyper_link.Click
            Exit For
        End If
    Next

    'wait 4 seconds - so page fully loads
    Application.Wait Now + TimeValue("0:00:04")
    'Select model year"
    Set e = IE.document.getElementbyid("yearDropdown")

    ' set a year
    e.Value = "2016"

End Sub

答案 1 :(得分:0)

  

...尝试访问一个尚不存在的元素,因为页面仍在加载...只是暂停

太棒了,谢谢罗宾!