我在尝试从javascript网页上的下拉菜单中选择项目时出现问题。我的最终目标是通过用户表单填写菜单值,但我没有成功创建VB来选择下拉列表。网页代码如下
<select name="dateSelector0" class="clsInputArea selectBox valid" style="display: none; "onchange="setDateRange(this, 'rtf[0].val1', 'rtf[0].val2')">
<option value="-1"></option>
<option value="1">Last Month</option>
<option value="2">Current Month</option>
<option value="3">Next Month</option>
<option value="4">Last Year</option>
<option value="5">Current Year</option>
<option value="6">Next Year</option>
<option value="7">First Quarter</option>
<option value="8">Second Quarter</option>
<option value="9">Third Quarter</option>
<option value="10">Fourth Quarter </option></select>
<a tabindex="NaN" title="" class="selectBox clsInputArea selectBox-dropdown" style="width: 147px; display: inline-block;" href="javascript:void(0);"><span class="selectBox-label" style="width: 127px;"> </span><span class="selectBox-arrow"></span></a>
我尝试了各种GetElementsBy,使用上述两个名称,尝试下面的名称和ID rtf [0] .val1,但无济于事,下面的示例。我相信通过dateSelector0名称会是最好的,但我会非常感谢你们这些人的投入比我更好。
ie.Document.Body.GetElementsByname("dateSelector0").Value = "1"
ie.Document.Body.GetElementsByname("dateSelector0").Item(0).FireEvent ("onchange")
答案 0 :(得分:1)
你几乎拥有它。我刚试过:
Sub IE_Navigate()
'Declare
Dim IE As Object
'Use IE
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate ("Website URL")
'Wait for Load to finish
While IE.readyState <> 4
DoEvents
Wend
Application.Wait (Now + TimeValue("0:00:01"))
这两种方法对我都有用。
通过ClassName从dropmenu中选择数据:
IE.document.getElementsByClassName("clsInputArea")(0).Value = 1
或
从名称
IE.document.getElementsByName("dateSelector0")(0).Value = 1
从下拉菜单中返回第一项。
EDITED
答案 1 :(得分:1)
如果您观察到以下CSS选择器,其中"." means class和" option"表示选择该类(clsInputArea selectBox valid
)元素内的所有“选项”标记,您将看到它正确选择。
注意:CSS选择器中不允许使用复合名称,这就是为什么用“。”替换空格的原因。在班级名称中。
示例CSS查询结果:
<强> VBA:强>
现在,我们可以将其翻译成以下语法:
ie.Document.getElementsByClassName("clsInputArea selectBox valid")(0).getElementsByTagName("option")
这假定索引0是用于“select_list”类的元素的正确索引。如果将集合设置为变量,则可以轻松检查集合以找到正确的索引,例如
Dim x As Object
Set x = ie.Document.getElementsByClassName("clsInputArea selectBox valid")(0).getElementsByTagName("option")
假设对象不是什么,那么我们可以通过其索引(即位置)选择一个选项,或者通过循环收集并选择何时满足某个条件,例如:它的innerText匹配一个想要的短语。
按索引选择
这意味着你可以说
x.SelectedIndex = 1
选择Last Month
通过循环选择:
Dim currentOption As Object
For Each currentOption In x
If InStr(currentOption.innerText, "Last Month") > 0 Then
currentOption.Selected = True
Exit For
End If
Next currentOption
选择下拉列表的完整示例:
由于您未提供网址,因此以下是使用其他网站的示例。网页目标下拉列表Código de Ativo
显示在此处:
要选择的目标选项为AALR21
,其为数字3,或第2项基于0的索引。
对项目innertext AAL21
进行循环和匹配:
Option Explicit
Public Sub MakeSelectiong()
Dim IE As New InternetExplorer
Const URL = "http://www.debentures.com.br/exploreosnd/consultaadados/sndemumclique/"
Const optionText As String = "AALR21" 'Number2
Application.ScreenUpdating = False ' a.selectedIndex = 2
With IE
.Visible = True
.navigate URL
While .Busy Or .readyState < 4: DoEvents: Wend
Dim a As Object, currentOption As Object
Set a = .document.getElementById("ctl00_ddlAti")
For Each currentOption In a.getElementsByTagName("Option")
If InStr(currentOption.innerText, optionText) > 0 Then
currentOption.Selected = True
Exit For
End If
Next currentOption
Stop
.Quit
End With
End Sub
按索引选择:
我可以删除整个循环并简单地说:
a.selectedIndex = 2