2015-12-23 76 views
1

我正在從項目中下載轉儲從網站,並保存在使用Excel vba指定的路徑。網頁登錄不起作用使用excel VBA

當您執行調試或按「F8」逐行執行時,代碼正常工作。

但是當你通過按「F5」或者在分配宏之後點擊按鈕來執行整個程序。它不工作。

需要您寶貴的建議來解決此問題。

由於事先 人員Prasanna

VBA代碼用於登錄。網頁的登錄

Sub Login() 

Dim MyHTML_Element As IHTMLElement 
Dim MyURL As String 
Dim HTMLDoc As HTMLDocument 
Dim MyBrowser As InternetExplorer 


MyURL = "URL" 
Set MyBrowser = New InternetExplorer 
MyBrowser.Silent = True 
MyBrowser.Navigate MyURL 
MyBrowser.Visible = True 

Do 
Application.Wait DateAdd("s", 5, Now) 
Loop Until MyBrowser.READYSTATE = READYSTATE_COMPLETE 
Application.Wait DateAdd("s", 5, Now) 
Set HTMLDoc = MyBrowser.document 
    HTMLDoc.all.Country_Code.Value = "Country_Code" 
    HTMLDoc.all.Login.Value = "UserName" 
    HTMLDoc.all.passwd.Value = "Password" 
    HTMLDoc.all.Item("B1").Click 

     For Each MyHTML_Element In HTMLDoc.getElementsByName("B1") 
      If MyHTML_Element.Type = "button" Then MyHTML_Element.Click: Exit For 
     Next 

End sub 

的HTML代碼示例。

   <table border=0> 

        <tr> 
         <td>Country:</td> 
         <td> 
          <input type="text" name="country_code" maxlength=2 
           onblur="this.value=this.value.toUpperCase();Form1_action(this.value)"> 
         </td> 
        </tr> 

        <tr> 
         <td>Language:</td> 
         <td> 
          <select name="idioma" disabled > 
           <option value="uk|es" onblur="document.Form1.login.focus()">ENGLISH</option> 
<option value="sp|es" onblur="document.Form1.login.focus()">SPANISH</option> 
<option value="fr|en-us" onblur="document.Form1.login.focus()">FRENCH</option> 
<option value="it|en-us" onblur="document.Form1.login.focus()">ITALIAN</option> 
<option value="de|de" onblur="document.Form1.login.focus()">GERMAN</option> 

          </select> 
         </td> 
        </tr> 

        <tr> 
         <td>Login:</td> 
         <td> 
          <input type="text" name="login" maxlength=10 value="" disabled > 
         </td> 
        </tr> 

        <tr> 
         <td>Password:</td> 
         <td> 
          <input type="password" autocomplete="off" name="passwd" maxlength=10 value="" disabled onkeypress="var okp=(event.which)?event.which:event.keyCode; if(okp==13) SiteRedirect(this.form)"> 
         </td> 
        </tr> 

       </table> 

       <br> 

       <center> 
        <input type="button" name="B1" value="Sign In" 
         onclick="SiteRedirect()" 
         disabled 
         style="width:80pt" 
         > 

       </center> 
+1

改變你做的循環,你讓代碼等待IE加載到'循環,當MyBrowser.ReadyState <> 4或MyBrowser.Busy' –

+0

嗨斯科特感謝你的回覆...我試過上面的代碼,但仍然沒有工作......我猜測是VB代碼執行速度比IE網頁加載時間更快......我是否需要增加等待函數的時間跨度...... ???它會幫助...? – Prasanna

+0

是的,代碼執行在VBA中是*獨立*的瀏覽器加載時間,所以你必須對此作出說明,就像你已經是這樣了。增加循環內的等待時間無關緊要,因爲在IE未準備就緒時它將保持循環。我在回答中發佈了我用於此的代碼。在我經常使用的應用程序中,它適用於我。 –

回答

0

這是我用來允許IE加載一個經常與IE中的網頁工作的應用程序的方法。在經歷了很多反覆試驗之後,我已經發現了這一點,現在它一直在運行 - 儘管我已經看到了很多方法來實現這一點。

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 

Sub IEWait(IE As Object) 
'assumes IE is loaded as InternetExplorer.Application") 

With IE 
    Do While .Busy Or .ReadyState <> 4: Sleep (100): Loop 
End With 

End Sub 

您可以通過

  1. 配售公共您的模塊窗口的頂部聲明中定義的任何Sub之前添加到您的代碼。
  2. 將它合併到您的代碼中,如下所示。

代碼:

With MyBrowser 
    .Silent = True 
    .Navigate MyURL 
    .Visible = True 

    Do While .Busy or .Readystate <> 4: Sleep (100): Loop 

    Set HTMLDoc = .document 

    '... rest of code 

End With 
+0

讓我在本週結束時嘗試使用你的代碼......並且我會在星期天讓你知道結果....再次感謝你scoot ...快樂的週末...並且聖誕快樂.... ... – Prasanna

+0

聖誕快樂給你@Prasanna!週末愉快,可能你心中的喜悅傳遍你和你的生活,這個假期和更多:) –

0

斯科特擊中了要害。

Sub Test() 

Dim IE As Object 
Set IE = CreateObject("InternetExplorer.Application") 
With IE 
    .Visible = True 
    .Navigate "http://www.marketwatch.com/investing/stock/aapl/analystestimates" ' should work for any URL 
    Do Until .ReadyState = 4: DoEvents: Loop 

. . . YOUR CODE HERE . . . 

End With 
End Sub 

OR

Sub DumpData() 

Set IE = CreateObject("InternetExplorer.Application") 
IE.Visible = True 

URL = "http://finance.yahoo.com/q?s=sbux&ql=1" 

'Wait for site to fully load 
IE.Navigate2 URL 
Do While IE.Busy = True 
    DoEvents 
Loop 

    . . . YOUR CODE HERE . . . 

End Sub