VBA – Excel – Erreur d'automation Erreur non spécifiée

J'ai donc rencontré une légère pierre d'achoppement et j'espère que quelqu'un peut m'aider. Bref, je dois visiter une string de pages Web (la list des noms sur chaque page est déjà input, ce code fonctionne bien). Comme mon code visite chaque page, je dois retirer les informations. Malheureusement, il y a un problème – il ne peut même pas passer par la list "A" avant d'avoir "erreur d'automation erreur non spécifiée" et il n'est jamais au même endroit.

J'ai essayé les étapes «normales» pour résoudre ce problème. J'ai installé les controls VB 6 et je n'ai enregistré et re-enregistré mscomctl.ocx, et y compris On Error Resume Next (qui ne fait rien).

Il atteint généralement plus de 100 cas avant qu'il ne meurt (de façon random comme je l'ai dit plus tôt). ET APRÈS l'apparition de l'erreur, lorsque j'essaie de l'exécuter à nouveau (avec ou sans modifications) et des erreurs sur la première. Si je redémarre mon ordinateur, il me laissera essayer à nouveau (pour quelque raison que ce soit), mais il ne finit toujours pas.

Le code est-il trop complexe et je dois le réduire? Je peux probablement find un moyen de le faire fonctionner pour chaque lettre à la fois (exécuter tous les A, puis faire B, etc.) mais je ne peux même pas l'get pour compléter la lettre A.

J'ai remarqué dans un autre fil que quelqu'un avait suggéré au lieu d'utiliser IE pour échanger sur xmlhttp – est-ce un correctif pour cela? Le problème est-il que ce script est trop long? Qu'est-ce que je fais mal ici?

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 Ssortingng 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 Ssortingng 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 Ssortingng Position = Doc.getElementsByTagName("a")(EachA).innerText If Position = "Home" Then Exit For Else Dim NameBY As Ssortingng NameBY = Doc.getElementsByTagName("h2")(1).innerText Dim TitleST As Ssortingng 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 Ssortingng JobList = Doc.getElementsByTagName("li")(EachLi + Italics).innerText Dim Job() As Ssortingng 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 

Une chose que je remarque, c'est que vous créez continuellement de nouveaux objects IE dans la boucle, et que vous ne les détruisez jamais ou que vous ne vous rendez pas à Nothing . Il est inutile, coûteux et peut-être une source d'erreur de créer 100 instances de IE.

Je pense que cela aidera probablement à créer une seule instance d'IE initialement, puis à utiliser ce même object dans la boucle pour naviguer dans les URL souhaitées.

Donc, au lieu de cela:

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

Faire cela:

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