Всем привет! Писалась тулза на WinXP, Office 2010 и использовала она для получения данных с разных страниц IE 8. При попытке запустить макросы на Win 7, Office 2010 и IE 10, макрос допускает ошибку. При тщательном рассмотрении выяснилось, что сразу после использования метода Navigate или Navigate2 переменная содержащая ссылку на объет IE очищается(!!!). При этом кода который это делает нет! Соответственно после Navigate идёт обработка страницы, но т.к. ссылка более не актуальна, это всё дело вызывает ошибку. Может кто сталкивался с этим, как побороть?
Пример кода:
Код
Dim WIE as Object
Set WIE= CreateObject("InternetExplorer.Application")
WIE.Navigate "www.ya.ru" '<-- Тут всё работает и если предварительно поставить WIE.visible = true, то можно увидеть загруженную страницу
txt$ = WIE.Document.body.innertext '<--А тут уже всё плохо, type WIE становится просто object, и Excel не знает какие свойства есть у объекта. Естественно это вызывает ошибку.
WIE.quit: set WIE = Nothing
Судя по ошибке IE10 отключает связь с Excel'ем. Но почему?!
Тот форум очень даже специализированный. В таких случаях (кросспостинг) правильно здесь дать ссылку туда и наоборот. В коде нужно дожидаться готовности IE, а затем готовности IE.Document Пример
Код
Sub Test()
Const TIMEOUT = 10
Dim IE As Object
Dim t As Single
Dim txt As String
Set IE = CreateObject("InternetExplorer.Application" )
IE.Navigate "www.ya.ru"
' Ждать готовности IE
While IE.readyState <> 4
DoEvents
Wend
' Задать лимит времени ожидания готовности IE.Document
t = Timer + TIMEOUT
' Ждать готовности IE.Document
While IE.Document Is Nothing And Timer < t
DoEvents
Wend
If IE.Document Is Nothing Then MsgBox "Time is gone", vbCritical, "Canceled": GoTo exit_
txt = IE.Document.body.innerText
Debug.Print txt
exit_:
' Exit
IE.Quit
Set IE = Nothing
End Sub
Спасибо большое, но я это знаю, код который я привёл выше не об этом. А о том что WIE начинает указывать на какое-то другое значение, которое не указывает уже куда не в InternetExplorer. В обычном программирование это называется битая ссылка на память. Ожидание не имеет к этому никакого отношения. Тем более, что в оригинальном коде оно есть.
Excel естественно не знает, какие есть свойства и методы у WIE, так как вы используете позднее связывание. Если не дожидаться загрузки страницы, на что вам указал Владимир, то document может ещё не существовать и, соответственно, body.inntertext не может быть выполнен для несуществующего. Почему происходит с Internet Explorer 10 - может он более "тормозной"? Попробуйте раннее связывание для библиотек Microsoft Internet Controls, Microsoft HTML Object Library и явно работать с
Код
Dim WIE As New InternetExplorer
Dim pdoc As IHTMLDocument
Dim pBody As IHTMLBodyElement
maximjon, мой код у Вас заработал? В первом сообщении ведь было "писалась тулза на WinXP...", поэтому воспринималось, что цель - сделать так, чтобы эта "тулза" заработала. Или цель - отладка некорректного кода, но не для того, чтобы он заработал?
Коллеги, вы меня не совсем правильно поняли, опишу подробно. Код сам рабочий и прекрасно сейчас крутится на WinXP+Office2010+IE8, нужно его запустить на связке Win7+Office2010+IE10 Расскажу поэтапно: Рисунки удалены. Превышение допутимого размера [МОДЕРАТОР] Уже пробовал скопировать настройки безопасности браузера, не помогло.
Уточните все же, мой код в Win7+Office2010+IE10 работает или нет? Код я тестировал в связке Win7 64bit + Excel2013 64bit + IE10, проблем не было. Ваш код из сообщения №1, естественно, сбоил, но отключения WIE при этом в отладчике не было. Чтобы понять, что у Вас происходит, хотелось бы увидеть реальный код, который у Вас с ожиданиями, но сбоит.
Ваш код на удивление заработал, однако стоило мне добавить к объявлению Sub аргумент aURL as String и передать туда адрес из ячейки на листе, как произошло тоже самое что происходит у меня. вот код вызова:
Код
Test (CStr(vURLSheet.Cells(cRow, cURL)))
Ваш подправленный код:
Код
Sub Test(aURL As String)
Const TIMEOUT = 10
Dim IE As Object
Dim t As Single
Dim txt As String
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate aURL
While IE.readyState <> 4 '<---Ошибка возникает тут, т.к. нет свойства readyState
DoEvents
Wend
t = Timer + TIMEOUT
While IE.Document Is Nothing And Timer < t
DoEvents
Wend
If IE.Document Is Nothing Then MsgBox "Time is gone", vbCritical, "Canceled": GoTo exit_
txt = IE.Document.body.innerText
Debug.Print txt
exit_:
' Exit
IE.Quit
Set IE = Nothing
End Sub
egonomist, там передается значение, потому что используется CStr А Sub Test(aURL), т.е. использовать тип Variant, аналогично тому, что у меня в сообщении выше. Непонятно, конечно, почему это стало необходимым для конкретного IE10
Фантастика!!! Сделал всё как Вы написали. Получилось так что если я в список адрессов добавляю http://www.ya.ru, и отключаю все свои адресса, то всё работает, стоит мне включить один адресс из свеого списка, возникает та злосчастная ошибка.
Цитата
ZVI Перед Navigate проверьте еще: Debug.Print IE.Offline Должно быть False
Так и есть
cURL константа сRow номер текущей строчки вызов проверки находится в цикле
Тогда нужен один из "злосчастных" адресов, чтобы поймать проблему, если у меня к нему есть доступ, конечно. Если не хотите опубликовать адрес, то можете переслать его мне через личное сообщение, но посмотреть смогу уже только вечером.
К некоторым у Вас есть доступ, к некоторым нет. К тем к которым у Вас есть доступ уже работают, проблема решалась убиранием исключений в настройках браузера. К адресам внутреннего пользования надо думать, но тут я думаю проблема уже в настройках браузера.
В целом проблема решилась простановкой скобок, я в первый раз не посмотрел, что поправил вызов поставив туда cells().text как я его убрал всё заработало. Далее проблема с внутреннними адресами. Причём интересно, что настройки браузера слизаны с предыдущей машины. Одним словом Мелкософт....