Excel VBA IE 对象和使用下拉列表

Excel VBA IE Object and using dropdown list

我正在试验 Web 自动化,并在尝试使用下拉列表时遇到一些困难。

我的代码可以搜索公司名称并点击“开始”。在新页面上,我似乎找不到 select 代表下拉列表的元素组的正确代码。然后我想 select “100” 个条目,但我什至无法获取代表此列表的节点。

我一直在浏览 Whosebug 上的多个不同页面,这些页面讨论 CSS select 或查看教程,但这似乎也没有帮助。我要么最终什么也没抓到,要么我抓到的任何东西都不能使用 getElementsByTagName 方法,最终我试图深入到 tdselect 节点。还不确定如何处理这些,但我什至无法抓住它们。想法?

(注意停止线只是我使用断点停止我的代码的一行)

CSS 帮助网站:https://www.w3schools.com/cssref/trysel.asp

代码:

Option Explicit

Sub test()
    On Error GoTo ErrHandle
    
    Dim ie As New InternetExplorer
    Dim doc As New HTMLDocument
    Dim ws As Worksheet
    Dim stopLine As Integer
    
    Dim oSearch As Object, oSearchButton As Object
    
    Dim oForm As Object
    Dim oSelect As Object
    Dim list As Object
    
    
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    
    ie.Visible = True
    ie.navigate "https://www.sec.gov/edgar/searchedgar/companysearch.html"
    
    Do
    DoEvents
    Loop Until ie.readyState = READYSTATE_COMPLETE
    
    Set doc = ie.Document
    
    Set oSearch = doc.getElementById("companysearchform")
    Set oSearchButton = oSearch.getElementsByTagName("input")(1)
    Set oSearch = oSearch.getElementsByTagName("input")(0)
    oSearch.Value = "Summit Midstream Partners, LP"
    
    oSearchButton.Click
    
    Do
    DoEvents
    Loop Until ie.readyState = READYSTATE_COMPLETE
    
    Set doc = ie.Document
    
    Set list = doc.querySelectorAll("td select")
    
    
    stopLine = 1
    
    Exit Sub
    
ErrHandle:
        MsgBox Err.Number & " - " & Err.Description, vbCritical
        Exit Sub
        
    
End Sub

td select 将 return 一个节点,因此您只需要 querySelector。该节点有一个 id,因此您也可以使用更快的 querySelector("#count") 来定位父节点 select。要更改选项,您可以在父 select 上使用 SelectedIndex,或者通过其 value 属性 querySelector("[value='100']").Selected = True 来定位子选项。然后,您可能需要附加并触发 change/onchange htmlevent 到父级 select 以注册更改。

但是,我只是从当前页面中提取公司 CIK,然后使用以下格式将 count=100 参数连接到 url 和 .Navigate2 中:

https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0001549922&type=&dateb=&owner=include&count=100&search_text=

您可以提取 CIK,在初始搜索公司点击并等待页面加载后,使用:

Dim cik As String

cik = ie.document.querySelector("[name=CIK]").value

ie.Navigate2 "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=" & cik & "&type=&dateb=&owner=include&count=100&search_text="

鉴于有几个参数留空,您可以缩短为:

"https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=" & cik & "&owner=include&count=100"

如果您无法获得初始父元素 select,您可能需要一个定时循环,等待该元素在单击搜索按钮后出现。 Whosebug 答案中显示了一个示例