2014-07-11 15 views
0

그래서 나는 약간의 걸림돌을 만났고 여기 누군가가 나를 도울 수 있기를 바랍니다. 즉, 웹 페이지 문자열을 방문해야합니다 (각 페이지의 이름 목록은 이미 입력되어 있으며 코드는 잘 작동합니다). 코드가 각 페이지를 방문 할 때마다 정보를 다시 가져와야합니다. 불행히도 문제가 있습니다. "자동화 오류 지정되지 않은 오류"가 나타나기 전에 "A"목록을 통해서도이를 수행 할 수 없으며 같은 위치에 있지 않습니다.VBA - Excel - 자동화 오류 알 수없는 오류

이 문제를 해결하기 위해 "정상적인"단계를 시도했습니다. VB 6 컨트롤을 설치했고 mscomctl.ocx의 등록을 해제하고 다시 등록했으며 On Error Resume Next (아무 것도하지 않음)를 포함하여 다시 등록했습니다.

일반적으로 죽기 전에 100 건이 넘습니다 (앞에서 말한대로 임의로). 그리고 오류가 발생한 후 다시 실행하려고 할 때 (변경 사항의 유무에 관계없이) 첫 번째 오류가 발생합니다. 내 컴퓨터를 다시 시작하면 다시 시도 할 수 있지만 이유는 무엇이든 끝내지 못합니다.

코드가 너무 복잡하고이를 줄여야합니까? 나는 한 번에 각 문자에 대해서만 실행되도록하는 방법을 찾을 수 있습니다. (A를 모두 실행 한 다음 B를 실행합니다.) 그러나 여전히 문자 A를 완성 할 수는 없습니다.

눈치 채 셨습니다. 다른 누군가가 xmlhttp로 바꾸기 위해 IE를 사용하지 말 것을 제안했다. 이 스크립트가 너무 길다는 문제가 있습니까? 여기 정확히 내가 뭘 잘못하고 있니? 내가 알

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 개체를 지속적으로 생성한다는 것입니다.이 개체를 파괴하거나 '아무것도'설정하지 않는 것입니다. 초기에 하나의 IE 객체를 생성하고 루프 내에서 동일한 객체를 탐색하는 데 도움이 될 수 있습니다. 무의미하고 값 비싸며 아마도 IE의 100 개 이상의 인스턴스를 만드는 데 오류가 발생할 수 있습니다. –

+0

'Dim IE as Object'와'IE가 아무 것도 없다면 Set IE = CreateObject (...' –

+0

정말 고마워요! 실제로는 IE 브라우저의 숫자였습니다. t는 "존재"에서 말하려합니다. 분명히 내 브라우저가 손상되어 다시 시작되지 않을 것입니다 (따라서 다시 시작됩니다)! – user3814832

답변

1

한 것은 당신이 지속적으로 루프 내부의 새로운 IE의 객체를 생성하고, 당신은 결코 그들을 파괴하지있어 나 Nothing 설정을한다는 것입니다. 무의미하고 값 비싸며 아마도 IE의 100 개 이상의 인스턴스를 만드는 데 오류가 발생할 수 있습니다.

아마도 처음에는 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

을 나는 그것을 조금 조정할 않았다 SHDocVw.InternetExplorer으로 ShellWindows으로 설정 ShellWins = 새 ShellWindows 하는 경우를 희미한 IE를 희미한 ShellWins를 사용하여. ShellWins.Count> 0 Then IE = ShellWins.Item (0)를 설정하십시오.Else IE 설정 = 새 SHDocVw.InternetExplorer IE.Visible = True 끝 부분 IE."http://history.state.gov/departmenthistory/people/by-name/"& Letter 을 탐색하고 모든 스크립트를 완료 한 후 Set ShellWins = Nothing 및 Set IE = Nothing을 추가하십시오. 정말 고맙습니다! – user3814832