2015-04-22 2 views
1

Я пытаюсь создать код, который перейдет на сайт, поместит его в данные, отправьте его и вернет ответ в ячейку в excel. Когда я перехожу к нему, он работает нормально, но когда я просто пытаюсь запустить его, я получаю ошибку времени выполнения 424; Требуется объект.Обязательная ошибка объекта VBA, пытающаяся получить InnerText

Я пробовал искать хороший ответ, но я просто не понимаю, как это исправить. Где мой вопрос? Как это исправить?

Sub Distance() 


Dim IE As Object 

' Create InternetExplorer Object 
Set IE = CreateObject("InternetExplorer.Application") 

' Make visible 
IE.Visible = True 

' Go to site 
IE.Navigate "http://www.distance-cities.com/" 

' Wait while IE loading... 
Do Until IE.READYSTATE = 4 
    DoEvents 
Loop 

IE.Document.getelementbyId("from").Value = "Stillwater, OK" 
IE.Document.getelementbyId("to").Value = "Hollis, OK" 
IE.Document.forms(0).submit 

Do Until IE.READYSTATE = 4 
    DoEvents 
Loop 

'*Below is where I get my error 
Sheet1.Range("E5").Value = IE.Document.getelementbyId("routemi").InnerText 
IE.Quit 

End Sub 

Приносим извинения, если это немного грязно.

Спасибо вам за помощь!

+0

Если он работает при отладке, но не при запуске прямо через, вероятно, это проблема синхронизации, и ваша страница не загружена полностью, или элемент, который вы пытаетесь получить, не добавлен в содержимое страницы. Попробуйте добавить короткое «ожидание», прежде чем пытаться получить доступ к этому элементу. –

+0

Привет, я добавил Application.Wait (Now + TimeValue («0:00:10»)), и это сделал трюк, есть ли лучший способ сделать это? – TheLeastofThese

+0

Вы можете обернуть 'getelementbyid()' в цикле, пока возвращаемое значение не будет 'Nothing' (но вы также должны добавить ограничение времени на то, как долго вы готовы ждать, чтобы вы могли выйти из цикла, если элемент никогда не появляется ...) –

ответ

1

Что-то вроде этого (непроверенные):

Dim el as object 
'... 

Set el = WaitForElement(IE.Document, "routemi", 1) 
If Not el is Nothing Then 
    Sheet1.Range("E5").Value = el.innerText 
Else 
    Msgbox "Element 'routemi' not found!" 
    Exit Sub 
End if 

Функция полезности, чтобы получить элемент по идентификатору, ожидая, пока он не появится:

Function WaitForElement(doc As Object, id As String, maxWaitSec As Double) As Object 
    Dim rv As Object, t 

    t = Timer 
    Do 
     Set rv = doc.getElementById(id) 
     DoEvents 
    Loop While rv Is Nothing And (Timer - t) < maxWaitSec 

    Set WaitForElement = rv 
End Function 
+0

Я изо всех сил пытаюсь заставить это работать, где я могу применить это? Извините за простые вопросы! – TheLeastofThese

+0

Замените третью из последней строки вашего кода на первый блок моего примера кода и включите функцию в свой модуль. –

+0

Благодарим вас, я получил объектную ошибку на 'Set rv = doc.getElementById (id)' – TheLeastofThese

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