【问题标题】:Object Variable or With Block Variable not set getelementsbyname vba对象变量或带块变量未设置getelementsbyname vba
【发布时间】:2019-05-27 19:49:06
【问题描述】:

我正在尝试从网站中提取数据。所以我想在下面的 URL 中选择 3 个下拉值,但我无法更改这些值。例如我想选择月份

<select name="fmonth1" id="fmonth1" class="dropdownboxlang" size="1" style="width:60px;">
    <option value="0">MM</option>
    <option value="1">Jan</option>
    <option value="2">Feb</option>
    <option value="3">Mar</option>
    <option value="4">Apr</option>
    <option value="5">May</option>
    <option value="6">Jun</option>
    <option value="7">Jul</option>
    <option value="8">Aug</option>
    <option value="9">Sep</option>
    <option value="10">Oct</option>
    <option value="11">Nov</option>
    <option value="12">Dec</option>

</select> 

我在更改下拉列表中的值时遇到的错误。我从两天开始尝试所有可能的方法。任何建议将不胜感激。

Public Sub bse()

    Dim IE As InternetExplorer
    Dim HTML As HTMLDocument
    Dim Dropdown As IHTMLElement
    Dim dropOption As IHTMLElement
Set IE = CreateObject("InternetExplorer.Application")
    With IE
        .Visible = True
        .Navigate "https://www.bseindia.com/markets/debt/BhavCopyDebt.aspx?expandable=6"
    End With

    Do
        DoEvents
        Application.Wait Now() + TimeValue("00:00:01")
    Loop Until IE.ReadyState = 4 And Not IE.Busy

    Set HTML = IE.Document

HTML.getElementsByName("fmonth1")(0).Value = "1" error line 




    IE.Quit

End Sub

【问题讨论】:

    标签: html vba dom web-scraping


    【解决方案1】:

    您可以在后代组合中使用 css id 选择器与属性 = 值选择器

    #fmonth1 option[value='1']
    

    即:

    ie.document.querySelector("#fmonth1 option[value='1']")
    

    您可能需要。单击末尾进行选择。无法测试该网址,但也可以尝试:

    ie.document.querySelector("#fmonth1 option[value='1']").Selected = True
    

    更一般地说,如果您知道一个元素存在,并且您的语法是正确的,但您仍然没有设置,那么这可能是一个时间问题,您需要在尝试访问之前等待更长的时间(例如定时循环),例如

    Const MAX_WAIT_SEC As Long = 10
    Dim t As Date, ele As Object
    t = Timer
    Do
        DoEvents
        On Error Resume Next
        Set ele = ie.document.querySelector("#fmonth1")
        On Error GoTo 0
        If Timer - t > MAX_WAIT_SEC Then Exit Do
    Loop While ele Is Nothing
    
    If Not ele Is Nothing Then
        ele.Click 'may be needed to expose options
        ie.document.querySelector("#fmonth1 option[value='1']").Selected = True
    End If
    

    如果在父 iframe/frame 内,您需要先导航,例如

    ie.document.getElementsByTagName("iframe")(0).contentDocument.querySelector("#fmonth1 option[value='1']").Selected = True
    

    我测试了以下内容,现在我可以访问该页面了:

    Public Sub MakeSelection()
        Dim ie As New InternetExplorer
    
        With ie
            .Visible = True
            .navigate "https://www.bseindia.com/markets/debt/BhavCopyDebt.aspx?expandable=6"
    
            While .Busy Or .readyState < 4: DoEvents: Wend
    
            .document.getElementsByTagName("iframe")(0).contentDocument.querySelector("#fmonth1 option[value='1']").Selected = True
    
             Stop  '<==Delete me later
    
            .Quit
        End With
    End Sub
    

    【讨论】:

    • 感谢您的建议 - 我尝试使用 Css id Selector - 出现这样的错误Object Required
    • 我尝试使用 Set a = ie.document.querySelector("#fmonth1") 并在此行上遇到相同的错误(需要对象 - 运行时错误 424)
    • 查看我的使用定时循环的更新。此外,请检查下拉菜单是否不在父 iframe/框架内。再次检查 html 并查看是否有包含此下拉列表的 iframe/frame 标记。
    • 我检查了 - iframe 内部的下拉菜单
    • 我更新了答案,因为我现在可以访问该页面并测试了作品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多