单击VBA中的按钮

时间:2018-08-03 19:03:15

标签: excel vba excel-vba 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 Dim 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然后     错误清除     继续下一个     如果结束

结束子

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

报告按钮:

您可以尝试使用以下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 

每次单击|提交后

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