如何使用excelvba在网页下拉框中输入值

如何使用excelvba在网页下拉框中输入值,excel,drop-down-menu,web-scraping,html-select,vba,Excel,Drop Down Menu,Web Scraping,Html Select,Vba,我正在尝试操作一个网站,用Excel VBA宏显示所需的选项链数据。该网站CBOE.com有一个输入字段,用于输入所需期权链的股票代码。我的代码已经能够驱动网页的该部分,并显示默认选项链。它默认为期权到期的最近一个月(截至本附注的2018年5月)。从那里,用户可以输入其他到期日期,以便检索和显示其他选项链(对于同一符号)。这就是我的代码出现故障的地方 在默认选项链显示的正上方是一个标签为“到期:”的下拉输入框,其中可以选择其他到期月份的列表。选择后,必须单击绿色提交按钮以获取所选过期月份的指定选

我正在尝试操作一个网站,用Excel VBA宏显示所需的选项链数据。该网站CBOE.com有一个输入字段,用于输入所需期权链的股票代码。我的代码已经能够驱动网页的该部分,并显示默认选项链。它默认为期权到期的最近一个月(截至本附注的2018年5月)。从那里,用户可以输入其他到期日期,以便检索和显示其他选项链(对于同一符号)。这就是我的代码出现故障的地方

在默认选项链显示的正上方是一个标签为“到期:”的下拉输入框,其中可以选择其他到期月份的列表。选择后,必须单击绿色提交按钮以获取所选过期月份的指定选项链。或者,在默认选项链的下面是到期月份的显式筛选按钮

如前所述,我的代码已经到了指定符号并显示默认选项链的地步,但我似乎无法在其他到期月份获得下拉输入字段

如果有人能看到我的代码在何处以及如何存在缺陷,我将非常感激这种洞察力

非常感谢。 --马克。 以下是我的核心代码:

Sub getmarketdata_V3()

Dim mybrowser As Object, myhtml As String
Dim htmltables As Object, htmltable As Object
Dim htmlrows As Object, htmlrow As Object
Dim htmlcells As Object, htmlcell As Object
Dim xlrow As Long, xlcol As Integer
Dim exitat As Date, symbol As String
Dim flag As Integer

On Error GoTo errhdl

Const myurl = "http://www.cboe.com/delayedquote/quote-table"

symbol = UCase(Trim(Range("ticker").Text))

With Range("ticker").Worksheet
    Range(Range("ticker").Offset(1, 0), Cells(Rows.Count, Range("ticker").Column + 13)).ClearContents
End With

Set mybrowser = CreateObject("internetexplorer.application")

mybrowser.Visible = True

mybrowser.navigate myurl

While mybrowser.busy Or mybrowser.readyState <> 4
    DoEvents
Wend

With mybrowser.document.all

    exitat = Now + TimeValue("00:00:05")
    Do
        .Item("ctl00$ContentTop$C002$txtSymbol").Value = symbol
        .Item("ctl00$ContentTop$C002$btnSubmit").Value = "Submit"
        .Item("ctl00$ContentTop$C002$btnSubmit").Click
        If Err.Number = 0 Then Exit Do
        Err.Clear
        DoEvents
        If Now > exitat Then Exit Do
    Loop
End With

'This With statement is to refresh the mybrowser.document since the prior With statement pulls up a partially new webpage
With mybrowser.document.all
    On Error Resume Next
    exitat = Now + TimeValue("00:00:05")

'Tried using "ID" label to select desired month--in this case 2018 July is a dropdown option:
'Usind this label seems to blank out the value displayed in the dropdown input box, but does not cause
'any of the options to display nor implant "2018 July" in it either. It just remains blank and no new option
'chain is retrieved.
    .Item("ContentTop_C002_ddlMonth").Select
    .Item("ContentTop_C002_ddlMonth").Value = "2018 July"
    .Item("ContentTop_C002_ddlMonth").Click

'Then tried using "Name" label to select desired month--in this case 2018 July is an option:

  '  .Item("ctl00$ContentTop$C002$ddlMonth").Value = "2018 July"
  '  .Item("ctl00$ContentTop$C002$ddlMonth").Click

  '  .Item("ctl00$ContentTop$C002$btnFilter").Value = "View Chain"

  '  .Item("ctl00$ContentTop$C002$btnFilter").Click


    End With

While mybrowser.busy Or mybrowser.readyState <> 4
    DoEvents
Wend

'Remaining logic, except for this error trap logic deals with the option chain results once it has been successfully retrieved.
'For purposes of focus on the issue of not being able to successfully have such a table displayed, that remaining process logic is not
'included here.


errhdl:
If Err.Number Then MsgBox Err.Description, vbCritical, "Get data"
On Error Resume Next
mybrowser.Quit
Set mybrowser = Nothing
Set htmltables = Nothing

End Sub
Sub-getmarketdata_V3()
Dim mybrowser作为对象,myhtml作为字符串
Dim htmltables作为对象,htmltable作为对象
将htmlrow变暗为对象,将htmlrow变暗为对象
将htmlcell变暗为对象,htmlcell变暗为对象
Dim xlrow为长,xlcol为整数
Dim exitat作为日期,符号作为字符串
作为整数的Dim标志
关于错误转到errhdl
常量myurl=”http://www.cboe.com/delayedquote/quote-table"
symbol=UCase(修剪(范围(“ticker”).Text))
带范围(“股票代码”)。工作表
范围(范围(“标记器”)。偏移量(1,0),单元格(行数,范围(“标记器”)。列+13))。ClearContents
以
设置mybrowser=CreateObject(“internetexplorer.application”)
mybrowser.Visible=True
mybrowser.navigate myurl
mybrowser.busy或mybrowser.readyState 4时
多芬特
温德
使用mybrowser.document.all
exitat=现在+时间值(“00:00:05”)
做
.Item(“ctl00$ContentTop$C002$txtSymbol”)。值=符号
.Item(“ctl00$ContentTop$C002$btnSubmit”).Value=“提交”
.Item(“ctl00$ContentTop$C002$btnSubmit”)。单击
如果Err.Number=0,则退出Do
呃,明白了
多芬特
如果现在>退出,则退出Do
环
以
'此With语句用于刷新mybrowser.document,因为先前的With语句会拉起部分新网页
使用mybrowser.document.all
出错时继续下一步
exitat=现在+时间值(“00:00:05”)
'尝试使用“ID”标签选择所需月份——在这种情况下,2018年7月是一个下拉选项:
'使用此标签似乎会清空下拉输入框中显示的值,但不会导致
任何显示或植入“2018年7月”的选项。它只是保持空白,没有新的选项
'链被检索。
.Item(“ContentTop\u C002\u ddlu month”)。选择
.Item(“ContentTop\u C002\u ddlu month”).Value=“2018年7月”
.Item(“ContentTop\u C002\u ddlu month”)。单击
'然后尝试使用“名称”标签选择所需月份——在本例中,2018年7月是一个选项:
.Item(“ctl00$ContentTop$C002$ddlmount”).Value=“2018年7月”
“.项(“ctl00$ContentTop$C002$ddlmount”)。单击
'.Item(“ctl00$ContentTop$C002$btnFilter”).Value=“查看链”
“.项(“ctl00$ContentTop$C002$btnFilter”)。单击
以
mybrowser.busy或mybrowser.readyState 4时
多芬特
温德
'成功检索选项链结果后,剩余逻辑(此错误陷阱逻辑除外)处理选项链结果。
'为了关注无法成功显示这样一个表的问题,剩余的流程逻辑不可用
“包括在这里。
errhdl:
如果为错误编号,则为MsgBox Err.Description,vbCritical,“获取数据”
出错时继续下一步
我的浏览器,退出
设置mybrowser=Nothing
设置htmltables=Nothing
端接头

对于您的代码:

这两行更改月份并单击视图链(我使用符号FLWS测试)。确保有足够的延迟,页面才能真正加载

mybrowser.document.querySelector("#ContentTop_C002_ddlMonth").Value = "201809"
mybrowser.document.querySelector("#ContentTop_C002_btnFilter").Click

当添加到您的代码中时,我发现上面的时间安排很粗略,所以我也快速地使用了它。以下是硒的一个例子:

Option Explicit
'Tools > references > selenium type library 

Public Sub GetMarketData()
   
    Const URL As String = "http://www.cboe.com/delayedquote/quote-table"
    Dim d As ChromeDriver, symbol As String
    
    symbol = "FLWS"
    Set d = New ChromeDriver
    
    With d
        .Start
        .Get URL

        Dim b As Object, c As Object, keys As New keys
        
        Set b = .FindElementById("ContentTop_C002_txtSymbol")
        b.SendKeys symbol
        .FindElementById("ContentTop_C002_btnSubmit").Click
        Set c = .FindElementById("ContentTop_C002_ddlMonth")
        c.Click
        c.SendKeys keys.Down                     'move one month down
        .FindElementById("ContentTop_C002_btnFilter").Click
        
        Stop '<<delete me later
        .Quit
        
    End With
  
End Sub
选项显式
'工具>引用>selenium类型库
公共子市场数据()
常量URL作为字符串=”http://www.cboe.com/delayedquote/quote-table"
尺寸d为镀铬驱动器,符号为字符串
symbol=“FLWS”
设置d=新的色度驱动器
与d
开始
.获取URL
将b设置为对象,将c设置为对象,将关键帧设置为新关键帧
集合b=.FindElementById(“ContentTop\u C002\u txtmsymbol”)
b、 发送键符号
.FindElementById(“ContentTop\u C002\u btnSubmit”)。单击
集合c=.FindElementById(“ContentTop\u C002\u ddlmount”)
c、 点击
c、 SendKeys.Down“向下移动一个月”
.FindElementById(“ContentTop\u C002\u btnFilter”)。单击

停止“尝试下面的方法,以防你想坚持IE。我试图从脚本中剔除硬编码的延迟。它应该能把你带到那里。在执行之前,请确保使用下面脚本中的
适当的勾号
填写
文本字段

好了:

Sub HandleDropDown()
    Const url As String = "http://www.cboe.com/delayedquote/quote-table"
    Dim IE As New InternetExplorer, Html As HTMLDocument, post As Object, elem As Object

    With IE
        .Visible = True
        .navigate url
        While .Busy Or .readyState <> 4: DoEvents: Wend
        Set Html = .document
    End With

    Do: Set post = Html.getElementById("ContentTop_C002_txtSymbol"): DoEvents: Loop While post Is Nothing
    post.Value = "tickername"  ''make sure to fill in this box with appropriate symbol

    Html.getElementById("ContentTop_C002_btnSubmit").Click

    Do: Set elem = Html.getElementById("ContentTop_C002_ddlMonth"): DoEvents: Loop While elem Is Nothing
    elem.selectedIndex = 2 ''just select the month using it's dropdown order

    Html.getElementById("ContentTop_C002_btnFilter").Click
End Sub

谢谢大家的及时回复。我将尝试所有的建议和指导,并汇报结果。问候马克,谢谢你。我明天会看这篇文章,并报告这篇文章。直到……马克。第一个建议只涉及两行代码就行了。在我的总体编程目标中,我还没有走出困境,但由于这个建议,我已经越过了阻碍我前进的“倒下的树”。谢谢你的帮助。就基于硒的建议/方法而言,它看起来很有趣
Microsoft Internet Controls
Microsoft HTML Object Library