Ответ 1
Вот быстрое и простое решение этой проблемы:
Вместо:
set IE = createobject("internetexplorer.application")
Использование:
Set IE = New InternetExplorerMedium
Не нужно настраивать настройки IE
Итак, я использую код Excel VBA, чтобы щелкнуть по кнопке на нашем веб-сайте, поверьте мне, я знаю, что это не лучшее из того, что нужно делать, но это наименее нежелательный вариант, доступный мне в это время.
Итак, этот выбор в стороне, вот моя проблема, я могу использовать этот код, успешно загружать imdb.com, google и т.д. Но когда я загружаю наш локальный сайт, я теряю контроль над объектом ie, я не могу проверить readyState, я не могу выйти. Вот ошибка, которую я получаю. Ошибка времени выполнения '-2147023179 (800706b5)':
Ошибка автоматизации Интерфейс неизвестен
Каждый раз так часто я получаю это сообщение: Ошибка времени выполнения '-2147417848 (80010108)':
Ошибка автоматизации Вызванный объект отключился от своих клиентов.
Нажатие "Отладка" указывает на ie.readyState, я также попытался прокомментировать это, а затем он указывает на ie.Quit
Sub dothestuff()
Dim ie As InternetExplorer
Set ie = New InternetExplorer
ie.Visible = True
ie.Navigate "http://www.google.com/"
anerror = webload(ie)
ie.Quit
Set ie = Nothing
End Sub
Function webload(ie)
Do Until ie.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
End Function
Вот быстрое и простое решение этой проблемы:
Вместо:
set IE = createobject("internetexplorer.application")
Использование:
Set IE = New InternetExplorerMedium
Не нужно настраивать настройки IE
Вот что происходит. Когда ваш браузер внутренне "перескакивает" в другую зону безопасности - от локального адреса до адреса inTRAnet или по адресу inTERnet - IE закрывает/удаляет текущий процесс IE и открывает еще один с более надежной защитой. Старые и новые процессы IE - это дочерние процессы IE для родительской задачи IE, поэтому вы не видите, что это происходит, наблюдая за браузером или наблюдая за процессом в диспетчере задач. Если вы используете Process Explorer (бесплатно от Microsoft), вы можете заметить, что это происходит.
Что вам нужно сделать в этом типе среды, это использовать вышеприведенное решение Anup Upadhyay. Его фрагмент кода рассматривает все задачи IE (родительский и дочерний не имеет значения) и находит новый процесс IE, указывающий на веб-адрес, который был дан исходный процесс. Пока у вас нет нескольких браузеров, открытых на один и тот же адрес, он надежно найдет новый процесс и продолжит работу, как вы ожидали.
Примечание. Возможно, вам также понадобится объект InternetExplorerMedium, а не объект InternetExplorer. Это также лучше "удерживать" сессию.
Здесь моя версия, которая почти такая же, как Anup's.
Ссылки для MS Office VBA:
Microsoft Internet Controls
Microsoft Shell Controls and Automation
п
Dim IE As InternetExplorerMedium ' This object (the "medium" variety as opposed to "InternetExplorer") is necessary in our security climate
Dim targetURL As String
Dim webContent As String
Dim sh
Dim eachIE
targetURL = "[your URL here]"
Set IE = New InternetExplorerMedium
IE.Visible = False ' Set to true to watch what happening
IE.Navigate targetURL
While IE.Busy
DoEvents
Wend
Do
Set sh = New Shell32.Shell
For Each eachIE In sh.Windows
If InStr(1, eachIE.LocationURL, targetURL) Then
Set IE = eachIE
'IE.Visible = False 'This is here because in some environments, the new process defaults to Visible.
Exit Do
End If
Next eachIE
Loop
Set eachIE = Nothing
Set sh = Nothing
While IE.Busy ' The new process may still be busy even after you find it
DoEvents
Wend
У нас была эта проблема с использованием IE9. Это происходит из-за настроек безопасности. На вкладке "Безопасность" диалогового окна "Свойства обозревателя" (инструменты... интернет-параметры) есть параметр "Включить защищенный режим". Каждая "зона" может иметь другую настройку "включить защищенный режим". Мы сняли флажок "включить защищенный режим", и это решило нашу проблему. Я думаю, что происходит, когда при переключении в зону, находящуюся в защищенном режиме, IE запускает новый процесс обработки трафика в этой зоне (возможно, убивает старый процесс). Когда это произойдет, ваша переменная объекта IE в VBA отключается от Internet Explorer.
Хорошо, только что нашел решение, решил отчаянно попытаться загрузить 127.0.0.1 вместо localhost, уверен, никаких проблем, поэтому разрешил ip-адрес локального сервера интрасети, и теперь мне хорошо идти. Я не понимаю, почему, но это решило мою проблему.
Попробуйте следующее:
Set IE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
IE.Navigate "C:\abc.html"
'Мы получаем ошибку здесь, я нашел небольшое сложное альтернативное решение для этого, как показано ниже "Возьмите ссылку для Microsoft Shell Controls and Automation 'Используйте ниже код для переназначения объекта IE для проблемы с потерянным соединением
Dim sh
Dim eachIE
Do
Set sh = New Shell32.Shell
For Each eachIE In sh.Windows
' Check if this is the desired URL
' Here you can use your condition except .html
' If you want to use your URL , then put the URL below in the code for condition check.
' This code will reassign your IE object with the same reference for navigation and your issue will resolve.
'
If InStr(1, eachIE.locationurl, ".html") Then
Set IE = eachIE
Exit Do
End If
Next eachIE
Loop
Для меня работало:
Ps. Я протестировал эти шаги в браузере IE 8.
Возможно, у вас проблемы со связыванием? Это странная ошибка для этого.
Попробуйте этот код (адаптирован из http://www.excely.com/excel-vba/ie-automation.shtml). Надеюсь, это поможет:
Option Explicit
' lasts for the life of Excel being open
Dim ie As Object
Sub dothestuff()
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "http://www.google.com/"
Do While ie.Busy
DoEvents
Loop
ie.Quit
Set ie = Nothing
End Sub
У меня такая же проблема, что и на веб-сайте, который находится внутри нашей интрасети, и также включен в мои надежные сайты. Отключение защищенного режима позволяет мне проверять ReadyState, но только если я отключу для интернет-зоны в дополнение к интрасети и доверенным сайтам.
Почему включение защищенного режима для интернет-зоны вызывает ошибку автоматизации при проверке ReadyState на доверенном сайте? Есть ли способ обойти это без отключения защищенного режима для интернет-зоны?
Другое решение..
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate ("http://URLOnMyIntranet/site.html")
IE.Visible = True
Set IE = nothing
Set objShellApp = CreateObject("Shell.Application")
For Each objWindow In objShellApp.Windows
Debug.Print objWindow.LocationName
If LCase(objWindow.LocationName) = LCase("Your windows name, use debug to find out") Then
Set IE = objWindow
End If
Next
Обратите внимание, что с помощью InternetExplorerMedium (см. другие ответы) обычно все, что вам нужно, FYI, вы также можете использовать свойство Url obj.LocationURL вместо имени окна, которое было бы более точным. См. Другие ответы.