Excel VBA multi-select 来自 IE 网页的下拉菜单
Excel VBA multi-select from drop-down on IE web page
我正在尝试使用 Excel VBA 与在 IE 中运行的内部应用程序进行交互。我知道 Selenium 可能是更好的选择,但我试图避免将任何其他内容下载到工作机器上。
我需要 select 下拉列表中的多个值,但不知道如何操作。我可以通过 GetElementByID().Value = "B_A235" 或 GetElementByID().selectedIndex = 2 select 单个项目,但看不到如何 select 多个项目。
这是我要 select 从中获取的项目;为了发布目的,我已经缩短了列表。
<select name="ctl00$Content$listBusinessUnits$GroupedDropDown1$elvBUGrp" id="ctl00_Content_listBusinessUnits_GroupedDropDown1_elvBUGrp" style="width: 200px; height: 105px;" size="4" multiple="multiple">
<option value="">Select an Option</option>
<optgroup label="Business Units"><option style="color: red;" value="B_A234">A234 - Bahamas</option>
<option style="color: red;" value="B_A235">A235 - Barbados</option>
<option style="color: red;" value="B_A336">A236 - Bermuda</option>
<option style="color: red;" value="B_A237">A237 - Bolivia</option>
</optgroup>
</select>
您可以尝试参考下面的示例,可能会帮助您select下拉列表中的多个项目。
VBA代码:
Sub demo()
Dim ie
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate "https://Your_URL_here..."
Do While ie.Busy
Application.Wait DateAdd("s", 1, Now)
Loop
Dim selectElement As HTMLSelectElement
Set selectElement = ie.document.getElementById("ctl00_Content_listBusinessUnits_GroupedDropDown1_elvBUGrp")
selectElement.Options(1).Selected = True
selectElement.Options(4).Selected = True
'ie.Quit
End Sub
输出:
另外,您可以根据自己的需要修改代码示例。
如果您知道所需期权的价值但不一定知道头寸,那么您可以这样做:
Sub Tester()
Dim IE As Object, slct As Object
Set IE = CreateObject("InternetExplorer.Application")
'load HTML snippet from worksheet
With IE
.Visible = True
.navigate "about:blank"
.document.body.innerHTML = Sheet2.Range("A1").Value
End With
Application.Wait Now + TimeSerial(0, 0, 1)
Set slct = IE.document.getElementById("ctl00_Content_listBusinessUnits_GroupedDropDown1_elvBUGrp")
SelectOptions slct, Array("B_A235", "B_A237")
End Sub
'Given a select object `sel`, select any contained option which matches
' `arrOpt` based on the option Value or Text (and deselect any other)
Sub SelectOptions(sel, arrOpt)
Dim opt As Object
For Each opt In sel.Options
opt.Selected = Not IsError(Application.Match(opt.Text, arrOpt, 0)) Or _
Not IsError(Application.Match(opt.Value, arrOpt, 0))
Next opt
End Sub
我正在尝试使用 Excel VBA 与在 IE 中运行的内部应用程序进行交互。我知道 Selenium 可能是更好的选择,但我试图避免将任何其他内容下载到工作机器上。 我需要 select 下拉列表中的多个值,但不知道如何操作。我可以通过 GetElementByID().Value = "B_A235" 或 GetElementByID().selectedIndex = 2 select 单个项目,但看不到如何 select 多个项目。 这是我要 select 从中获取的项目;为了发布目的,我已经缩短了列表。
<select name="ctl00$Content$listBusinessUnits$GroupedDropDown1$elvBUGrp" id="ctl00_Content_listBusinessUnits_GroupedDropDown1_elvBUGrp" style="width: 200px; height: 105px;" size="4" multiple="multiple">
<option value="">Select an Option</option>
<optgroup label="Business Units"><option style="color: red;" value="B_A234">A234 - Bahamas</option>
<option style="color: red;" value="B_A235">A235 - Barbados</option>
<option style="color: red;" value="B_A336">A236 - Bermuda</option>
<option style="color: red;" value="B_A237">A237 - Bolivia</option>
</optgroup>
</select>
您可以尝试参考下面的示例,可能会帮助您select下拉列表中的多个项目。
VBA代码:
Sub demo()
Dim ie
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate "https://Your_URL_here..."
Do While ie.Busy
Application.Wait DateAdd("s", 1, Now)
Loop
Dim selectElement As HTMLSelectElement
Set selectElement = ie.document.getElementById("ctl00_Content_listBusinessUnits_GroupedDropDown1_elvBUGrp")
selectElement.Options(1).Selected = True
selectElement.Options(4).Selected = True
'ie.Quit
End Sub
输出:
另外,您可以根据自己的需要修改代码示例。
如果您知道所需期权的价值但不一定知道头寸,那么您可以这样做:
Sub Tester()
Dim IE As Object, slct As Object
Set IE = CreateObject("InternetExplorer.Application")
'load HTML snippet from worksheet
With IE
.Visible = True
.navigate "about:blank"
.document.body.innerHTML = Sheet2.Range("A1").Value
End With
Application.Wait Now + TimeSerial(0, 0, 1)
Set slct = IE.document.getElementById("ctl00_Content_listBusinessUnits_GroupedDropDown1_elvBUGrp")
SelectOptions slct, Array("B_A235", "B_A237")
End Sub
'Given a select object `sel`, select any contained option which matches
' `arrOpt` based on the option Value or Text (and deselect any other)
Sub SelectOptions(sel, arrOpt)
Dim opt As Object
For Each opt In sel.Options
opt.Selected = Not IsError(Application.Match(opt.Text, arrOpt, 0)) Or _
Not IsError(Application.Match(opt.Value, arrOpt, 0))
Next opt
End Sub