使用Excel 2013 VBA登录后,选择网站上的链接

时间:2015-02-03 00:56:40

标签: excel-vba vba excel

我在excel中使用VBA登录后尝试在网页上打开链接。到目前为止,我的代码成功打开了网站并登录。但是,我在论坛中看到的任何示例似乎都无法真正打开下一个链接。

网站上的HTML代码:

<td class="nrmlFnt nWrap">
    <a id="ctl00_wpm_ac_ac_rbk_ctl01_lnkBrokerageAccountName" oncontextmenu="return false;" href="javascript:__doPostBack('ctl00$wpm$ac$ac$rbk$ctl01$lnkBrokerageAccountName','')">Retirement</a>    
    </td>

虽然innertext和ID是唯一的,但我一直无法选择它们。

我是VBA的新手,可能没有完全正确地实现类似问题的一些解决方案。以下是我的代码:

Dim HTMLdoc As HTMLDocument
Dim MyBrowser As InternetExplorer

Private Sub btnUpdate_click()

 'Create Variables for web browsing
 Dim MyHTML_Element As IHTMLElement 'Elements to search for: textboxes, buttons etc...
 Dim MyURL As String

 'Dim IE As InternetExplorerMedium

 'Clear errors to prevent from stopping code
 On Error GoTo Err_Clear
 'Input Desired webpage login URL
 MyURL = "https://client.schwab.com/Login/SignOn/CustomerCenterLogin.aspx"

 Set MyBrowser = New InternetExplorer 'Creates new browser session
 MyBrowser.Silent = True 'Avoids Pop-ups
 MyBrowser.navigate MyURL 'Navigates to URL
 MyBrowser.Visible = True 'Opens browser window. Change to False to run w/o opening

 'Wait for web page to fully load
 Do
    DoEvents
 Loop Until MyBrowser.readyState = READYSTATE_COMPLETE

 Set HTMLdoc = MyBrowser.document
 'Enter Username:
 HTMLdoc.all.ctl00_WebPartManager1_CenterLogin_LoginUserControlId_txtLoginID.Value = "username"
 'Enter Password:
 HTMLdoc.all.txtpassword.Value = "password"

 'Click Login button on webpage:
For Each MyHTML_Element In HTMLdoc.getElementsByTagName("a")
 If MyHTML_Element.ID = "ctl00_WebPartManager1_CenterLogin_LoginUserControlId_btnLogin" Then MyHTML_Element.Click: Exit For
 Next

 'Wait for web page to fully load
Do
    DoEvents
 Loop Until MyBrowser.readyState = READYSTATE_COMPLETE

 'Select Account to be displayed:
Set HTMLdoc = MyBrowser.document
Set e = HTMLdoc.getElementById("ctl00_wpm_ac_ac_rbk_ctl01_lnkBrokerageAccountName")
e.Click


 'Wait for web page to fully load
 Do
    DoEvents
 Loop Until MyBrowser.readyState = READYSTATE_COMPLETE

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

End Sub

我认为这应该是非常简单的,如下所示,但它没有奏效:

Set MyHTML_Element= MyBrowser.Document.getElementByID("ctl00_wpm_ac_ac_rbk_ctl01_lnkBrokerageAccountName").getElementsByTagName("a")(0)
  MyHTML_Element.Click 

我也试过以下但没有成功:

For Each MyHTML_Element In HTMLdoc.getElementsByTagName("a")
 If MyHTML_Element.ID = "ctl00_wpm_ac_ac_rbk_ctl01_lnkBrokerageAccountName" Then MyHTML_Element.Click: Exit For
 Next

网页加载,登录然后......没有任何反应。

1 个答案:

答案 0 :(得分:0)

所以我终于开始工作了。我显然需要网页来完成加载和简单的&#34; READYSTATE_COMPLETE&#34;没有削减它。所以我最终确保页面满载:

With MyBrowser
Do While .Busy Or .readyState <> 4
    DoEvents
Loop
End With

然后我使用以下代码选择链接:

Set HTMLdoc = MyBrowser.document
Set e = HTMLdoc.getElementById("ctl00_wpm_ac_ac_rbk_ctl01_lnkBrokerageAccountName")
e.Click

它终于到了正确的页面!现在我只需要提取正确的数据......对吗?