【问题标题】:Using VBA to select drop-down values on a website使用 VBA 在网站上选择下拉值
【发布时间】:2018-02-07 16:31:32
【问题描述】:

我正在尝试创建一个从网站提取报告的宏,它有四个下拉列表来选择值。 我能够登录该页面并将自己定向到报告页面,但由于某种原因,下拉列表出现问题。我尝试了几种在线提供的“解决方案”,但我不断收到错误消息:

运行时错误“438”:对象不支持此属性或方法。

以下是可供选择的下拉菜单之一:

<select name="LocationID">
<option value="0" selected="">All Location</option>
<option value="9">Atlanta</option>
<option value="7">Denver</option>
<option value="3">Las Vegas</option>
<option value="1">Los Angeles</option>
<option value="4">Miami</option>
<option value="6">New Jersey</option>
<option value="10">Phoenix</option>
<option value="2">San Francisco</option>
<option value="8">Seattle</option>
<option value="11">Vancouver</option>
</select>

这是我目前在 VBA 中的内容:

Option Explicit
Const MyUserID As String = "test123"
Const MyPassword As String = "test123"
Const READYSTATE_COMPLETE As Integer = 4
Dim objIE As Object


Public Sub LoginScript()

Set objIE = CreateObject("InternetExplorer.Application")

With objIE
.Visible = True
.Silent = True
.navigate ("https://wwww.mywebsite.com")
Do Until .readyState = READYSTATE_COMPLETE
DoEvents
Loop
Application.Wait Now() + TimeValue("00:00:02")
.document.all.txtuserid.Value = MyUserID
.document.all.txtPassword.Value = MyPassword
objIE.document.getElementsByName("btnSubmit")(0).Click
Do Until .readyState = READYSTATE_COMPLETE
DoEvents
Loop
Application.Wait Now() + TimeValue("00:00:02")
.navigate("https://www.mywebsite.com/sample.html")
Do Until .readyState = READYSTATE_COMPLETE
DoEvents
Loop
.document.getElementByName("LocationID").Value = "7"
objIE.document.getElementsByName("view")(0).Click
End With
End Sub

【问题讨论】:

  • 你得到什么错误信息,在哪里?
  • 在上面给出的示例中,我收到以下消息:运行时错误“438”:对象不支持此属性或方法。在调试它突出显示这一行: .document.getElementByName("LocationID").Value = "7"
  • 它应该是getElementsByName(复数) - 你在其他行上是正确的,但不是那个。
  • 我更正了,谢谢。但仍然得到同样的错误。

标签: vba excel ie-automation


【解决方案1】:

我假设您在此行收到错误消息?..

.document.getElementByName("LocationID").Value = "7"

那是因为Name 是一个元素集合。与 ID (getElementByID) 不同,元素在 collections 上是复数。

在这种情况下,正确的语法是:

.document.getElementsByName("LocationID")(0).Value = "7"

注意到附加的(0) 了吗?这是因为它又是一个集合,因此您还需要选择集合项。 (可能不一定是(0),但如果不查看整个 HTML 代码,我无法确定。)

【讨论】:

  • 太棒了。这完成了工作!谢谢大家,K.Davis :) 我假设对于其他下拉列表,我只是在您的帖子中添加额外的行,对吗?
  • @Francis 对不起,我没有关注。如果您使用 getElementByID() 以外的任何内容,请确保 elements 是复数,并且将集合项(例如:(0))附加到元素的末尾,除非您想循环访问他们。
  • @K.Davis 这一切都很好。有用。对不起,如果我不清楚。我只是快速询问是否 .document.getElementsByName("LocationID")(0).Value = "7" 然后可以将其应用于其他下拉列表,当然使用正确的名称,是的,它有效。再次感谢您抽出宝贵时间对此进行调查。
  • @Francis 在没有看到 HTML 代码的情况下很难有 100% 的信心,但如果元素具有 Name 属性,它应该可以工作。并非所有元素都具有此属性,就像并非所有元素都具有 ID 一样。但是,如果它具有 name 属性,那么您应该没有任何问题。
【解决方案2】:

应该是这样的……

Sub passValueToComboBox1()
   Dim ie  As Object
   Dim oHTML_Element As IHTMLElement

   Set ie = CreateObject("InternetExplorer.Application")
   ie.Visible = True
   ie.navigate "http://www.your_web_site.com"
   While ie.Busy Or ie.readyState <> 4: DoEvents: Wend

   Set oHTML_Element = ie.document.getElementsByName("selectedReportClass")(0)
   If Not oHTML_Element Is Nothing Then oHTML_Element.Value = "com.db.moap.report.FUBU"

   For Each oHTML_Element In ie.document.getElementsByTagName("input")
      If oHTML_Element.Type = "submit" Then oHTML_Element.Click: Exit For
   Next
End Sub

【讨论】:

    猜你喜欢
    • 2017-05-10
    • 2022-01-13
    • 2018-04-24
    • 2023-04-03
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多