未设置对象变量或带有块变量的getelementsbyname vba [英] Object Variable or With Block Variable not set getelementsbyname vba
问题描述
我正在尝试从网站中提取数据。所以我想在下面的URL中选择3个下拉值,但是我无法更改这些值。例如,我要选择月份
I am trying to pull the data from websites. So I want to select 3 drop-down values in below URL but i cant change those values. example i want to select month
<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>
我在更改下拉列表中的值时遇到的错误。我从两天开始尝试所有可能的方法。任何建议,将不胜感激。
the error i am getting while changing the value in drop-down. I am trying all the possible ways from two days. Any suggestion would be appreciated.
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
推荐答案
您可以在以下位置使用css id选择器具有属性=值选择器的后代组合
You can use css id selector in descendant combination with attribute = value selector
#fmonth1 option[value='1']
即:
ie.document.querySelector("#fmonth1 option[value='1']")
您可能需要。单击末尾以进行选择。无法测试该网址,但也可以尝试:
You may need .Click on the end for selected. Can't test that url but also try:
ie.document.querySelector("#fmonth1 option[value='1']").Selected = True
更一般而言,如果您知道元素存在,并且语法为正确,但是您仍然没有设置好,这可能是一个计时问题,您需要更长的等待时间(例如定时循环)才能尝试访问,例如
More generally, if you know an element exists, and your syntax is correct, but you are still getting not set then it may be a timing issue where you need a longer wait (e.g. timed loop) before attempting to access, e.g.
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 /框架内,则需要先导航,例如
If inside of a parent iframe/frame you will need to navigate that first e.g.
ie.document.getElementsByTagName("iframe")(0).contentDocument.querySelector("#fmonth1 option[value='1']").Selected = True
我已经测试了以下内容,现在可以访问该页面:
I tested the following now I can access the page:
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
这篇关于未设置对象变量或带有块变量的getelementsbyname vba的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!