【问题标题】:click a button in vba单击vba中的按钮
【发布时间】:2019-01-11 16:54:36
【问题描述】:

我能够创建我的 vba 代码以登录到受密码保护的网站,但现在我被困在如何能够自动点击到我需要提取数据的位置。我无法共享该网站,但这是我尝试单击的 html 行。这是一个“报告”按钮,但我不能

这是我要点击按钮的html代码

    <a href="gso_list_etrader_reports?vsCurrUser=2753" 
     class="menuitem">Reports</a>

这是网站的代码和登录名/密码和点击登录,到目前为止工作正常,下一步是点击报告并通过 Excel 中的网络查询提取数据。任何帮助是极大的赞赏。谢谢!

Dim HMTLDoc As HTMLDocument
Dim MyBrowser As InternetExplorer
Sub daily()
'
' daily Macro
'

 Dim MyHTML_Element As IHTMLElement
    Dim MYURL As String
    On Error GoTo Err_Clear

    '  website
    MYURL = ""
    Set MyBrowser = New InternetExplorer
    MyBrowser.Silent = True
    MyBrowser.navigate MYURL
    MyBrowser.Visible = True
    Do
    Loop Until MyBrowser.readyState = READYSTATE_COMPLETE
    Set HTMLDoc = MyBrowser.document
    ' user login and password
    HTMLDoc.all.user_login.Value = ***
    HTMLDoc.all.user_password.Value = ***
    For Each MyHTML_Element In HTMLDoc.getElementsbyTagName("input")
    'click submit to login
    If MyHTML_Element.Type = "submit" Then MyHTML_Element.Click: Exit For
    Next

 'gives debug error***   If MyHTML_Element.Type = "Reports" Then MyHTML_Element.Click: Exit For
    Next


Err_Clear:
    If Err <> 0 Then
    Err.Clear
    Resume Next
    End If


End Sub

请求我尝试点击的网站的 html,我希望宏点击报告按钮。

交易者主页 | 交易 | 报告

新代码在我按 F5 时不起作用,但在我通过代码按 F8 时会起作用:

将 HMTLDoc 调暗为 HTMLDocument 将 MyBrowser 调暗为 InternetExplorer 子 Delmarva_daily() ' ' Delmarva_daily 宏 '

将 MyHTML_Element 调暗为 IHTMLElement 将 MYURL 调暗为字符串 On Error GoTo Err_Clear

' website
MYURL = ***
Set MyBrowser = New InternetExplorer
MyBrowser.Silent = True
MyBrowser.navigate MYURL
MyBrowser.Visible = True
Do
Loop Until MyBrowser.readyState = READYSTATE_COMPLETE
Set HTMLDoc = MyBrowser.document
' user login and password
HTMLDoc.all.user_login.Value = ***
HTMLDoc.all.user_password.Value = ***
' click submit
For Each MyHTML_Element In HTMLDoc.getElementsbyTagName("input")

If MyHTML_Element.Type = "submit" Then MyHTML_Element.Click: Exit For
Next
' click reports
HTMLDoc.getElementsByClassName("menuitem")(1).Click
While MyBrowser.Busy Or MyBrowser.readyState < 4: DoEvents: Wend
'click Billing Analysis Report (Industrial)
HTMLDoc.getElementsByClassName("firstlink")(0).Click
While MyBrowser.Busy Or MyBrowser.readyState < 4: DoEvents: Wend
For Each MyHTML_Element In HTMLDoc.getElementsbyTagName("input")

If MyHTML_Element.Type = "submit" Then MyHTML_Element.Click: Exit For
Next

Err_Clear: 如果 Err 0 那么 错误清除 继续下一步 结束如果

结束子

【问题讨论】:

  • 您有两个Next,只有一个For Each。此外,那些单线 If 可能没有达到您的预期。
  • @Qharr 当字符限制也不允许我时,我应该如何发布 html?
  • @Qharr 我收到一条错误消息“您的帖子似乎包含未正确格式化为代码的代码。请使用代码工具栏按钮或 ctrl +k 键盘快捷键将所有代码缩进 4 个空格. ? 当我复制和粘贴 HTML 时,我不确定在这里做什么
  • imgur.com/a/QGVIdeJ 这是html代码,我正在尝试点击“报告”按钮

标签: vba excel web-scraping


【解决方案1】:

报告按钮:

您可以尝试以下 CSS 选择器来定位感兴趣的元素:

HTLMDoc.querySelector("a[href='gso_list_etrader_reports?vsCurrUser=2753']").Click

或者通过类名选择更传统的元素:

HTMLDoc.getElementsByClassName("menuitem")(1).Click

或者按标签(如果确实只有2个a标签!)

HTMLDoc.getElementsByTagName("a")(1).Click

CSS 选择器:

a[href='gso_list_etrader_reports?vsCurrUser=2753']

正在寻找一个带有a标签的元素,该标签具有href属性,其值为 gso_list_etrader_reports?vsCurrUser=2753.


对 HTML 示例的 CSS 查询:


提交按钮:

对于您的其余代码:您可以使用以下内容来避免单击输入按钮时出现循环,具体取决于您有多少提交输入按钮。

HTLMDoc.querySelector("input[type=submit]").Click

你也可以使用

HTMLDoc.forms(0).submit 

每次点击后|提交:

您希望在每次点击|提交事件后While myBrowser.Busy Or myBrowser.readyState &lt; 4: DoEvents: Wend,以留出时间让页面事件发生;并减少由于在页面上可用之前尝试选择元素而找不到对象的机会。

【讨论】:

  • 这让我可以点击下一个按钮谢谢! "HTMLDoc.getElementsByClassName("menuitem")(1).Click" 但现在我有 3 个链接可以转到下一页,它们是相同的“类”名称
  • 请忽略我之前的留言。 - 我仍然遇到问题,当我按 F8(步入)并逐行浏览代码时,我可以到达我想去的地方,但是当我按 F5(运行/继续)时打开的浏览器在报告点击不会继续。我试图保存代码,但仍然没有。让我包含更新的代码
  • 所以按钮被点击但是提取数据部分有问题?
  • 对不起 QHarr,让我尝试更具体一些。单击 F5(运行子/用户窗体)时未单击“报告”按钮,我认为通过按 F8 通过代码进行测试会很有用,因为它以这种方式工作,但是当我单击 F5 时,宏停止在报告单击页面.我已经包含了我更新的代码。有什么不同的原因吗?例如,当我单击 f5 时,代码在 HTMLDoc.forms(0).submit 之后停止,它不会继续编译其余代码。
  • 我取出了on错误码,现在按F5就可以了。
【解决方案2】:
If MyHTML_Element.Type = "submit" Then MyHTML_Element.Click: Exit For

与

相同
If MyHTML_Element.Type = "submit" Then 
    MyHTML_Element.Click
End If
Exit For

...这可能不是你想要做的

“报告”似乎不是一个有效的元素类型,所以也许你应该发布一些 HTML。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多