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