VBA – Excel – 自动化错误未指定错误

所以我遇到了一个轻微的绊脚石,希望在这里有人可以帮助我。 总之,我需要访问一串网页(每个网页上的名称列表已经input,该代码工作正常)。 当我的代码访问每个页面时,我需要撤回信息。 不幸的是,出现了一个问题 – 在我得到“自动化错误未指定的错误”之前,甚至无法通过“A”列表,并且它永远不会在同一个位置。

我已经尝试了“正常”的步骤来解决这个问题。 我已经安装了VB 6控件,并且我已经注销并重新注册了mscomctl.ocx,并且包括On Error Resume Next(它什么都不做)。

它在死亡之前通常达到100多例(如前所述,是随机的)。 之后popup错误,当我尝试重新运行它(有或没有更改),并在第一个错误。 如果我重新启动计算机,它会让我再次尝试(无论什么原因),但它仍然没有完成。

代码是否太复杂,我需要减less它? 我可能会find一种方法,使它只能运行每个字母(运行所有的A,然后做B的等),但我仍然无法完成字母A.

我注意到在另一个线程有人build议,而不是使用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 

我注意到的一件事是,你不断地在循环内创build新的IE对象,而且你永远不会销毁它们或设置为Nothing 。 这是没有意义的,昂贵的,可能是一个错误的来源,创造100多个IE实例。

我想最初可能会有助于创build一个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") 
    Interesting Posts