2017-02-22 10 views
4

Я пытаюсь написать код, который будет считывать значение из Excel, просматривать его во внутренней веб-системе и сохранять результаты в Excel. Он без проблем считывает Excel, открывает Internet Explorer без проблем, но когда я пытаюсь ссылаться на то, что было открыто, я получаю вышеуказанную ошибку. Строка «ie.Navigate url» работает, но следующая строка «Set DOC = ie.Document» генерирует ошибку. Любые идеи о том, что вызывает это? Вот мой код:Ошибка Internet Explorer VBA Automation: объект Invoked отключился от своих клиентов

Public Sub getClient() 
    Dim xOpen As Boolean 
    xOpen = False 
    Dim row As Long 

    Dim xL As Excel.Application 
    Set xL = New Excel.Application 
    xL.Visible = False 
    Dim wb As Excel.Workbook 
    Dim sh As Excel.Worksheet 

    'Change the name as needed, out put in some facility to input it or 
    'process multiples... 
    Dim filename As String 
    filename = "auditLookup.xlsx" 
    Set wb = xL.Workbooks.Open(getPath("Audit") + filename) 
    xOpen = True 
    Set sh = wb.Sheets(1) 

    Dim ie As Variant 
    Set ie = CreateObject("InternetExplorer.Application") 
    ie.Visible = True 

    Dim DOC As HTMLDocument 
    Dim idx As Integer 
    Dim data As String 

    Dim links As Variant 
    Dim lnk As Variant 
    Dim iRow As Long 
    iRow = 2   'Assume headers 

    Dim clientName As String 
    Dim clientID As String 
    Dim nameFound As Boolean 
    Dim idFound As Boolean 
    Dim url As String 

    While sh.Cells(iRow, 1) <> "" 
    'Just in case these IDs are ever prefixed with zeroes, I'm inserting 
    'some random character in front, but removing it of course when 
    'processing. 
    url = "https://.../" + mid(sh.Cells(iRow, 1), 2) 
    ie.navigate url 
    Set DOC = ie.Document 

    'Search td until we find "Name:" then the next td will be the name. 
    'Then search for "P1 ID (ACES):" and the next td with be that. 
    Set links = DOC.getElementsByTagName("td") 
    clientName = "" 
    clientID = "" 
    nameFound = False 
    idFound = False 
    For Each lnk In links 
     data = lnk.innerText 
     If nameFound Then 
      clientName = data 
     ElseIf idFound Then 
      clientID = data 
     End If 
     If nameFound And idFound Then 
      Exit For 
     End If 

     If data = "Name:" Then 
      nameFound = True 
     ElseIf data = "P1 ID (ACES):" Then 
      idFound = True 
     End If 
    Next 
    sh.Cells(iRow, 2) = clientName 
    sh.Cells(iRow, 2) = clientID 
    iRow = iRow + 1 
    Wend 

    Set ie = Nothing 
    If xOpen Then 
    wb.Save 
    Set wb = Nothing 
    xL.Quit 
    Set xL = Nothing 
    Set sh = Nothing 
    xOpen = False 
    End If 
Exit Sub 
+3

похоже, может быть, вам нужен готовый/ожидающий цикл? (Искать этот термин здесь, на SO, я уверен, что вы найдете примеры реализации этого). Идея заключается в том, что * navigate * не происходит мгновенно, а во время загрузки страницы браузер может быть недоступен для запросов автоматизации, и т. д. –

+0

Не в приведенном выше примере кода, но в коде у меня было следующее: «Do DoEvents Loop Until ie.ReadyState = READYSTATE_COMPLETE», и это дает мне ту же ошибку на линии Loop Until. – PKatona

+0

И если я запустил debug и просто позволю ему сидеть (я вижу, что он воспитывался в IE, я все равно получаю сообщение об ошибке). – PKatona

ответ

3

Переход к:

Dim ie As InternetExplorer 
Set ie = New InternetExplorerMedium 
... 

решаемые проблемы. Плюс мне нужно было добавить обратно цикл Do, упомянутый в комментариях:

Do 
    DoEvents 
Loop Until ie.ReadyState = READYSTATE_COMPLETE 
+0

Работал для меня. Потрясающие. Благодарю. Просто любопытно узнать, как вы это поняли? Дайте мне знать, пожалуйста :) –

+0

Я продолжал искать ответы в Интернете. Я не помню, нашел ли я его здесь или где-то еще, но я увидел, что кто-то еще выполнил свой код, используя приведенные выше строки, и поэтому я попробовал его, и это сработало. – PKatona

Смежные вопросы