2014-07-11 81 views
0

因此,我遇到了一個輕微的絆腳石,希望在這裏有人可以幫助我。總之,我需要訪問一串網頁(每個網頁上的名稱列表已經輸入,該代碼工作正常)。當我的代碼訪問每個頁面時,我需要撤回信息。不幸的是,有一個問題 - 在我得到「自動化錯誤未指定的錯誤」之前,它甚至無法通過「A」列表並且它永遠不會在同一個位置。VBA - Excel - 自動化錯誤未指定錯誤

我試過了「正常」的步驟來解決這個問題。我已經安裝了VB 6控件,並且我已經註銷並重新註冊了mscomctl.ocx,並且包括On Error Resume Next(它什麼都不做)。

它死前通常會達到100個以上的案例(如前所述,這是隨機的)。彈出錯誤後,當我嘗試重新運行它(有或沒有更改),並在第一個錯誤。如果我重新啓動計算機,它會讓我再次嘗試(無論出於何種原因),但仍然無法完成。

代碼是否太複雜,我需要減少它?我可能會找到一種方法來讓它每次只能運行每個字母(運行所有A,然後執行B's等),但我仍然無法完成字母A。

我注意到另一個線程有人建議,而不是使用IE切換到xmlhttp - 這是一個修復?這個腳本太長了嗎?我在這裏做錯了什麼?

Sub Lookup() 
Range("AI1").Value = "Unique ID" 
Range("AJ1").Value = "Name" 
Range("AK1").Value = "Birth Year" 
Range("AL1").Value = "Title" 
Range("AM1").Value = "State" 
Range("AN1").Value = "Position" 
Range("AO1").Value = "Country" 
Range("AP1").Value = "Appointed" 
Range("AQ1").Value = "Credentials" 
Range("AR1").Value = "Terminations" 
Dim i As Integer 
For i = 1 To 26 
    If i = 24 Then 
     Range("X:X").End(xlUp).Select 
     ActiveCell.Value = "" 
    Else 
    Dim ic As String 
    ic = LCase(ConvertToLetter(i)) 
    Range(ic & "5000").End(xlUp).Select 
    Dim J As Integer 
    J = ActiveCell.Row 
    Dim k As Integer 
    For k = 2 To J 
     Range(ic & k).Select 
     Dim Lookup As String 
     Lookup = ActiveCell.Value 
     Dim IE As Variant 
     Set IE = CreateObject("InternetExplorer.Application") 
     IE.Visible = False 
     IE.navigate "http://history.state.gov/departmenthistory/people/" & Lookup 
     Do 
      DoEvents 
     Loop Until IE.readyState = READYSTATE_COMPLETE 
     Dim Doc As HTMLDocument 
     Set Doc = IE.document 
     Dim Italics As Integer 
     Italics = 0 
     Dim EachA As Integer 
     For EachA = 64 To 100 
      Dim Position As String 
      Position = Doc.getElementsByTagName("a")(EachA).innerText 
      If Position = "Home" Then 
       Exit For 
      Else 
       Dim NameBY As String 
       NameBY = Doc.getElementsByTagName("h2")(1).innerText 
       Dim TitleST As String 
       TitleST = Doc.getElementsByTagName("p")(1).innerText 
       Range("AJ" & "90000").End(xlUp).Offset(1, 0).Select 
       ActiveCell.Value = NameBY 
       TitleState = Split(TitleST, vbLf) 
       ActiveCell.Offset(0, 2).Value = TitleState(0) 
       On Error GoTo 1037 
       ActiveCell.Offset(0, 3).Value = TitleState(1) 
       On Error GoTo 1037 
1037 
       ActiveCell.Offset(0, 4).Select 
       ActiveCell.Value = Position 
       Dim EachLi As Integer 
       EachLi = EachA - 1 
       If Doc.getElementsByTagName("li").Item(EachLi + Italics).innerHTML Like "<em>*" Then 
        Italics = Italics + 1 
       Else 
       End If 
       Dim JobList As String 
       JobList = Doc.getElementsByTagName("li")(EachLi + Italics).innerText 
       Dim Job() As String 
       Job() = Split(JobList, vbLf) 
       Dim JCount As Integer 
       For JCount = LBound(Job) To UBound(Job) 
        ActiveCell.Offset(0, 1).Select 
        ActiveCell.Value = Job(JCount) 
       Next JCount 
      End If 
     Next EachA 
    Next k 
End If 
Next i 
End Sub 
+0

XMLHTTP請求可能會更可靠,應該會更快。不知道它是否能解決這個問題。如果問題發生在各個地方,很難指出問題。我注意到的一件事是你不斷地在循環中創建新的IE對象,並且你永遠不會銷燬它們或者設置爲Nothing。可能只是簡單地幫助創建一個IE對象,並使用同一個對象在循環內導航。這是毫無意義的,代價昂貴的,並且可能是創建100多個IE實例的錯誤來源。 –

+0

'Dim IE as Object' and'If IE Is Nothing Then Then Set IE = CreateObject(...' –

+0

非常感謝你!!!它實際上只是IE瀏覽器的數量 - 我認爲通過關閉Visible他們不是'可以這麼說,顯然我的瀏覽器崩潰了,它不會重新啓動,因爲它(因此重新啓動刷新它)! – user3814832

回答

1

有一兩件事我注意到的是,你要不斷地創建循環中新的IE對象,而你根本沒有破壞它們或設置爲Nothing。這是毫無意義的,代價昂貴的,並且可能是創建100多個IE實例的錯誤來源。

我認爲這可能有助於最初創建一個IE實例,然後在循環內使用同一個對象來瀏覽所需的URL。

因此,不是這樣的:

Dim IE As Variant 
Set IE = CreateObject("InternetExplorer.Application") 

這樣做:

Dim IE as Object 
If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.Application") 
+1

我並調整它一點點,使用 昏暗ShellWins作爲ShellWindows 昏暗的IE作爲SHDocVw.InternetExplorer 集ShellWins =新ShellWindows 如果。 ShellWins.Count> 0 Then Set IE = ShellWins.Item(0) Else Set IE = New SHDocVw.InternetExplorer IE.Visible = True End If IE。導航「http://history.state.gov/departmenthistory/people/by-name/」&Letter 並添加Set ShellWins = Nothing和Set IE = Nothing後,完成我的所有腳本。非常感謝! – user3814832

相關問題