vba - 单击vba中的按钮

标签 vba excel web-scraping

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

这是我想单击按钮的 html 代码

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

这是网站和登录名/密码的代码,然后单击登录,到目前为止工作正常,下一步是单击报告并通过 Excel 中的 Web 查询提取数据。任何帮助是极大的赞赏。谢谢!
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 调暗为字符串
出错时转到 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 那么
错误清除
继续下一步
万一

结束子

最佳答案

报告按钮:

您可以尝试以下 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 查询:

query

提交按钮:

对于其余代码:您可以使用以下内容来避免单击输入按钮时出现循环,具体取决于您有多少提交输入按钮。
HTLMDoc.querySelector("input[type=submit]").Click

您也许还可以使用
HTMLDoc.forms(0).submit 

每次点击后|提交:

你想要While myBrowser.Busy Or myBrowser.readyState < 4: DoEvents: Wend在每个 click|submit 事件之后,为页面事件的发生留出时间;并减少由于在页面上可用之前尝试选择元素而找不到对象的机会。

关于vba - 单击vba中的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51678680/

相关文章:

vba - 随着报告的增长,代码变慢

vba - 如何从 ActiveCell 分配范围以供将来引用 (VBA)

excel - 每行而不是每列的非连续 For Each 循环

vba - 从单元格中删除字符的最快方法

python - 删除网页抓取中的换行符

excel - 单击定义为 DIV 的按钮,SVG 链接到 VBA 路径

sql - ms-access 将查询结果保存在一个字符串中

VBA完整公式到单元格

sql-server - 从原始数据创建 n 个新行,例如 (1000....1000+n)

python - 如何用python获取表标签1和表标签2之后的所有<li>?