Страницы: 1
RSS
Excel и Internet Explorer 10 в Win 7, Проблема работы Ie10 в Win 7
 
Всем привет!
Писалась тулза на 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'ем. Но почему?!

Изменено: maximjon - 17.11.2013 18:31:20
 
Кросс - http://www.sql.ru/forum/1059677/excel-i-internet-explorer-10-v-win-7
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Тот кросс я и создал. Этот форум я считаю более подходящий для этой темы, тем более на работе не залочен.
 
Мы очень рады. А чего ж нам не сообщили, что тема еще где-то обсуждается? Загляните в Правила п. 4.1.
Я сам - дурнее всякого примера! ...
 
Тот форум не специализированный. Поэтому решил разместить тут. Да и тему от туда удалить нельзя.
 
Тот форум очень даже специализированный.
В таких случаях (кросспостинг) правильно здесь дать ссылку туда и наоборот.
В коде нужно дожидаться готовности 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
Изменено: ZVI - 17.11.2013 20:50:59
 
Спасибо большое, но я это знаю, код который я привёл выше не об этом. А о том что WIE начинает указывать на какое-то другое значение, которое не указывает уже куда не в InternetExplorer. В обычном программирование это называется битая ссылка на память. Ожидание не имеет к этому никакого отношения. Тем более, что в оригинальном коде оно есть.

Про кросспостинг учту спасибо.
Изменено: maximjon - 17.11.2013 23:01:36
 
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
Изменено: anvg - 18.11.2013 03:53:44
 
maximjon, мой код у Вас заработал?
В первом сообщении ведь было "писалась тулза на WinXP...", поэтому воспринималось, что цель - сделать так, чтобы эта "тулза" заработала. Или цель - отладка некорректного кода, но не для того, чтобы он заработал?
Изменено: ZVI - 18.11.2013 05:38:03
 
Коллеги,
вы меня не совсем правильно поняли, опишу подробно.
Код сам рабочий и прекрасно сейчас крутится на WinXP+Office2010+IE8, нужно его запустить на связке Win7+Office2010+IE10
Расскажу поэтапно:
Рисунки удалены. Превышение допутимого размера [МОДЕРАТОР]
Уже пробовал скопировать настройки безопасности браузера, не помогло.
 
Уточните все же, мой код в Win7+Office2010+IE10 работает или нет?
Код я тестировал в связке Win7 64bit + Excel2013 64bit + IE10, проблем не было.
Ваш код из сообщения №1, естественно, сбоил, но отключения WIE при этом в отладчике не было.
Чтобы понять, что у Вас происходит, хотелось бы увидеть реальный код, который у Вас с ожиданиями, но сбоит.
Изменено: ZVI - 18.11.2013 12:01:58
 
Ваш код на удивление заработал, однако стоило мне добавить к объявлению 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
 
 
Если тот код работал, то попробуйте
вместо IE.Navigate aURL
записать так: IE.Navigate (aURL)
или так: IE.Navigate CVar(aURL)
 
ошибка возникает так как вы передаете в функцию не string, а ячейку (cell).
сделайте Sub Test(aURL) и будет вам счастье.
 
egonomist, там передается значение, потому что используется CStr
А Sub Test(aURL), т.е. использовать тип Variant, аналогично тому, что у меня в сообщении выше.
Непонятно, конечно, почему это стало необходимым для конкретного IE10
Изменено: ZVI - 18.11.2013 12:37:37
 
ZVI Проверил Ваши способы, не вышло.
egonomist Ваш способ также не сработал.
Ошибка таже.
 
Проверьте, на всякий случай, чему у Вас равно aUrl: Debug.Print aUrl
И протестируйте так:

Код
Sub Test1()
  Dim s As String
  Range("A1") = "www.ya.ru"
  s = Range("A1").Value
  Test s
End Sub
Потому что Ваше:  Test (CStr(vURLSheet.Cells(cRow, cURL)))
говорит о том, что есть еще какой-то код, который может быть причиной проблемы
Изменено: ZVI - 18.11.2013 12:54:56
 
Перед Navigate проверьте еще: Debug.Print IE.Offline
Должно быть False
Изменено: ZVI - 18.11.2013 12:53:03
 
Фантастика!!! Сделал всё как Вы написали. Получилось так что если я в список адрессов добавляю http://www.ya.ru, и отключаю все свои адресса, то всё работает, стоит мне включить один адресс из свеого списка, возникает та злосчастная ошибка.
Цитата
ZVI
Перед Navigate проверьте еще: Debug.Print IE.Offline
Должно быть False
Так и есть

cURL константа
сRow номер текущей строчки
вызов проверки находится в цикле
Изменено: maximjon - 19.11.2013 03:17:49
 
Тогда нужен один из "злосчастных" адресов, чтобы поймать проблему, если у меня к нему есть доступ, конечно.
Если не хотите опубликовать адрес, то можете переслать его мне через личное сообщение, но посмотреть смогу уже только вечером.
 
К некоторым у Вас есть доступ, к некоторым нет. К тем к которым у Вас есть доступ уже работают, проблема решалась убиранием исключений в настройках браузера. К адресам внутреннего пользования надо думать, но тут я думаю проблема уже в настройках браузера.

В целом проблема решилась простановкой скобок, я в первый раз не посмотрел, что поправил вызов поставив туда cells().text как я его убрал всё заработало. Далее проблема с внутреннними адресами. Причём интересно, что настройки браузера слизаны с предыдущей машины. Одним словом Мелкософт....

Всем большое спасибо за помощь!
Страницы: 1
Читают тему
Наверх