VBA更改Internet Explorer中的下拉值

时间:2015-01-02 11:10:04

标签: vba automation scrape

我希望使用Excel VBA自动化Internet Explorer以从网站中提取足球结果,并且在更改下拉值时我真的很难获取数据更新。

网站是:http://www.whoscored.com/Regions/250/Tournaments/30/Seasons/3871/Stages/8209/Fixtures/Europe-UEFA-Europa-League-2013-2014

我希望改变'阶段的价值。下拉并刮掉比赛结果。

我的代码可以正常打开IE,更改' scrape'下拉列表,但我无法获取要更新的数据。虽然我对VBA感到满意,但我对HTML和Javascript知之甚少,尽管我可以猜到一些行在做什么。从我可以看到有javascript代码处理更改事件,我只是无法看到如何让它运行 - 我已经尝试触发' onchange'我的代码中的事件是根据我的搜索建议的,但我无法让它发挥作用。

这是我可以看到的控制下拉列表的代码(我删除了很多其他下拉列表的下拉值,因为它使这篇文章的篇幅更长:

<div id="breadcrumb-nav">
.
.
<span><select id="stages" name="stages"><option selected="selected"     value="/Regions/250/Tournaments/30/Seasons/3871/Stages/8209">Europa League Group Stages</option>
<option value="/Regions/250/Tournaments/30/Seasons/3871/Stages/7816">Europa League  Qualification</option>
<option value="/Regions/250/Tournaments/30/Seasons/3871/Stages/8158">Europa League Grp. A</option>
<option value="/Regions/250/Tournaments/30/Seasons/3871/Stages/8159">Europa League Grp. B</option>
.
.
<option value="/Regions/250/Tournaments/30/Seasons/3871/Stages/8466">Europa League</option>
</select></span>


</div>


<script type="text/javascript">

$('#breadcrumb-nav select').change(function () {
NG.GA.trackEvent('BreadcrumbNav', this.id);
window.location.href = this.value;
// TODO: Disable all selects?
});

</script>

我的代码:

Sub ScrapeData()
Dim ie As InternetExplorer
Dim URL As String

URL = "http://www.whoscored.com/Regions/250/Tournaments/30/Seasons/3871/Stages/8466/Fixtures/Europe-UEFA-Europa-League-2013-2014"

Set ie = New InternetExplorer
ie.Visible = True
ie.navigate (URL)

Do
    DoEvents
Loop Until ie.readyState = 4

SelectValue ie, "/Regions/250/Tournaments/30/Seasons/3871/Stages/7816"
SelectValue ie, "/Regions/250/Tournaments/30/Seasons/3871/Stages/8209"

End Sub

Sub SelectValue(ByVal ie As InternetExplorer, ByVal value As String)
Dim htmlDoc As HTMLDocument
Dim ddStages As HTMLSelectElement
Dim idBreadCrumb As Object

Set htmlDoc = ie.document

With ie.document
    Set idBreadCrumb = .getelementbyid("breadcrumb-nav")
    Set ddStages = .getelementbyid("stages")
End With

ddStages.value = value
ddStages.FireEvent ("onchange")
'fireevent on ddStages didn't work so tried here too
idBreadCrumb.FireEvent ("onchange")

Do
    DoEvents
Loop Until ie.readyState = 4

End Sub

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

必须在事件上执行一些JavaScript“select元素已更改其值”。我的建议,比执行JavaScript更容易,只是导航链接(因为JS在这里只是改变你看到的HTML页面,而不是同一网页中的元素)。

所以,例如,我只想替换它:

SelectValue ie, "/Regions/250/Tournaments/30/Seasons/3871/Stages/7816"

用这个

ie.Navigate "http://www.whoscored.com/" & "/Regions/250/Tournaments/30/Seasons/3871/Stages/7816"

获得完全相同的结果。