【问题标题】:How to select an option with fireevent “on change” using VBA如何使用VBA选择带有fireevent“on change”的选项
【发布时间】:2020-11-23 00:26:52
【问题描述】:

我是一个真正的初学者,很抱歉语法垃圾。

我正在尝试选择(单击)一个选项(使用“onchange”),但我不能(我在一个多月内尝试了很多东西,但没有任何效果)。我试图将 obj 声明为 iHtmlFormElement / SelectionElement - 没有任何效果。

感谢您的帮助!

到目前为止我的代码:

Sub PL()

Dim DOC As MSHTML.HTMLDocument
Dim IE As InternetExplorer
Dim obj As Object

Set IE = New InternetExplorer
IE.Visible = True
IE.navigate "link"

Do While IE.readyState <> READYSTATE_COMPLETE
    DoEvents
Loop

Set DOC = IE.document

DOC.getElementById("txtUsername").Value = "user"
DOC.getElementById("USMPWD").Value = "pass"
DOC.getElementById("BTNSUB").click

Do While IE.readyState <> READYSTATE_COMPLETE
    DoEvents
Loop

Set DOC = IE.document
Set obj = DOC.getElementsByTagName("listBox")

???here I'm stuck


End Sub

html代码:

<select name="listBox" id="listBox" style="width: 240px;" onchange="javascript:setTimeout('__doPostBack(\'listBox\',\'\')', 0)" size="18">
    <option value="1">20</option>
    <option value="2">30</option>
    <option value="3">50</option>
    <option value="5">51</option>
    <option value="4">60</option>

</select>

【问题讨论】:

  • 应该是Set obj = DOC.getElementsByTagName("listBox")(0),因为该方法返回一个集合,而不是单个项目。展示您尝试过的一些事情并描述您尝试它们时发生的事情总是很有用的。
  • 谢谢。你说得对。我花了几个小时才发布这个消息(作为最后的手段)。我实际上已经尝试过 Set obj = DOC.getElementsByTagName("listBox")(0)。问题是随后出现的选择部分..
  • Set obj = DOC.getElementsByTagName("select")(0) 抱歉,我之前错过了标记名部分。或者您可以使用Set obj = DOC.getElementById("listBox") 当您引用选择时,您可以设置其selectedIndex 以选择特定值。
  • 我已经尝试过(obj 标为 HtmlFormElement):Set obj = DOC.getElementById("listBox")obj.selectedIndex = 1,我得到错误 91 - “对象变量或未设置块变量”在这一行=> obj.selectedIndex = 1
  • 没有可用于测试的 URL,我真的无法提出任何其他建议。如果 getElementById 失败,则说明脚本运行时页面上没有具有该 ID 的元素。您可以尝试引入一个短暂的等待,以防在主页完成后动态加载选择。

标签: javascript html vba


【解决方案1】:

在“设置 DOC = IE.document”下面:

'Your target object has a name="listBox" and an id="listBox", but your TagName is "select". Adjust accordingly.
Set obj = DOC.getElementById("listBox")
'Your value ranges from 1 to 5. Don't pay attention to the real numbers shown in your page.
obj.value = "1"
'Let's fire the "onchange" event like pros!
DOC.parentWindow.execscript "javascript:setTimeout('__doPostBack(\'listBox\',\'\')', 0)"

就是这样。当然你可以把它复杂化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 2015-05-01
    • 2020-03-06
    • 1970-01-01
    • 2015-03-25
    • 2012-01-15
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多