VBA Internet Explorer Automation "Отказано в доступе"
Dim IE as New InternetExplorer
IE.Visible = True
IE.Navigate("http://www.google.com")
Do Until IE.Busy = False
Loop
IE.document.getElementsByTagName("Input")(3).Value = "Search Term"
IE.document.Forms(0).Submit <------ This line results in error.
В сообщении об ошибке указана ошибка 70: "Отказано в доступе"
Пожалуйста, не предлагайте изменения кода. НИЧЕГО не так с кодом. Этот макрос работает на 9 из 10 компьютеров. Это не проблема времени (я все еще получаю ошибку, даже если я перехожу вручную). Я знаю, что есть другие способы объявить объект Internet Explorer. Я пытался использовать CreateObject и все такое. Ничего из этого не имеет значения. Запуск от имени администратора также не помогает.
Это всего лишь простой пример проблемы (мы на самом деле автоматизируем гораздо более сложные задачи). Поэтому, пожалуйста, не спрашивайте "почему вы хотите сделать поиск по-доброму?" и, пожалуйста, не спрашивайте "что вы пытаетесь сделать". Мне нужно, чтобы эта проблема была решена. Мне не нужен мой код переписан.
Мы используем Windows XP, Internet Explorer 7 и Office 2003. Что-то приводит к тому, что случайные люди не могут автоматизировать Internet Explorer. Это не проблема пользователя, а проблема компьютера. Я имею в виду, что на компьютерах-виновниках никто не может автоматизировать независимо от того, какой пользователь входит в систему. Но один и тот же пользователь может использовать другой компьютер, и все в порядке. Следовательно, это скорее всего параметр реестра на локальном компьютере или что-то в этом роде. Здесь все компьютеры настроены одинаково, одни и те же характеристики, одинаковое программное обеспечение.
Я гуглил и гуглил, гуглял и гуглил. К сожалению, ошибка времени выполнения 70, кажется, является всеохватывающей, и многие пользователи сообщают об ошибке по различным признакам. В моем случае я не нашел решения, иначе я бы не спрашивал здесь.
Единственный способ решить эту проблему - это полностью перегрузить ИТ-систему на жесткий диск. Чистое обновление, включая операционную систему. Это решает проблему, но также вынуждает пользователя снова настраивать свой компьютер так, как он это делал раньше, и переустанавливать все программное обеспечение и все остальное. Это не очень хорошее решение. Где-то на машине есть настройка, вызывающая это, иначе обновление не будет иметь эффекта. Я хочу знать, что это за настройка (мне кажется, это настройка реестра).
Любая помощь приветствуется, спасибо.
7 ответов
После тестирования всех предложенных исправлений и даже больше, я уверен, что это странная ошибка с обработкой событий дочерних процессов, вызываемых IE, когда на одном веб-сайте есть разные зоны безопасности.
Переход к преследованию, вот решение:
'Craziest workaround ever due to bugged IE Eventhandling
Do While IE.ReadyState = 4: DoEvents: Loop
Do Until IE.ReadyState = 4: DoEvents: Loop
Добавляйте этот фрагмент кода каждый раз после перехода на новую страницу или других событий, которые могут вызвать перезагрузку веб-сайта, например, нажав кнопку "Отправить" или подобное.
Дэн выше предложил свободно добавлять операторы DoEvents в ваш код, что на 100% не помогло мне. Вместо этого я предлагаю добавить приведенный выше код везде, где это применимо.
Престижность Дэну, без вашего комментария я бы никогда этого не понял!
Краткое описание ПРЕИМУЩЕСТВ, которые этот метод имеет по сравнению с другими предлагаемыми исправлениями:
- Вы можете придерживаться позднего связывания, если хотите (Dim IE как Object)
- Вы можете придерживаться создания объекта InternetExplorer (в отличие от InternetExplorerMedium)
- Вам не нужно изменять настройки зоны безопасности в IE
- Нет ненужного времени ожидания в вашем приложении
- Вы избавляетесь от ошибки 70 - в доступе отказано
- Вы избавляетесь от потерянных сеансов, т. Е. "Ошибка времени выполнения -2147417848 (80010108)": ошибка автоматизации. Вызванный объект отключился от своих клиентов. "
- Вы избавляетесь от проблем с интерфейсом, т. Е. "Ошибка времени выполнения -2147023179 (800706b5)": ошибка автоматизации Интерфейс неизвестен "
Краткое описание всего, что НЕ НУЖНО при таком подходе:
- InternetExplorerMedium объекты
- Раннее связывание в целом
- Ссылка на Microsoft Internet Controls
- Ссылка на элементы управления и автоматизации Microsoft Shell
- Странная обработка ошибок
- Нет необходимости проверять IE.Busy в вашем коде
- Application.wait или sleep вызывает ненужные предполагаемые задержки
Я включил только приведенную выше сводку, потому что я видел все предложенные обходные пути и лично попробовал их безуспешно.
Пример кода на основе вопроса ОП:
Dim IE as Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://www.google.com")
'Craziest workaround ever due to bugged IE Eventhandling
Do While IE.ReadyState = 4: DoEvents: Loop
Do Until IE.ReadyState = 4: DoEvents: Loop
IE.document.getElementsByTagName("Input")(3).Value = "Search Term"
IE.document.Forms(0).Submit ' this previously crashed
Я действительно надеюсь, что это поможет другим в будущем. Удачи всем, кто помог с решением проблемы.
С наилучшими пожеланиями, Патрик
Следующее сработало для меня. Я не тестировал его тщательно, но проблема больше не повторялась. Я получал ошибку периодически, но всегда в один и тот же момент.
Кажется, что контроль над первым экземпляром IE умер. Однако можно создать еще один экземпляр, сославшись на первый. Затем мертвый экземпляр можно закрыть, и мы продолжим.
Set IEa = CreateObject("InternetExplorer.Application")
Set IEa = IE
'Where IE is the instance that's about to error
SendKeys ("%{F4}")
'Closes the old window, IE.quit in the code wouldn't work
IEa.Visible = True
Надеюсь, это сработает для кого-то еще, я сильно расстраивался.
Брайан
PS: Мой первый пост о stackru, я думаю, что правильно отформатировал
Я получаю ту же ошибку при автоматизации IE, но вместо исправления я обошел стороной.
Label1:
If myIe Is Nothing Then
Set myIe = CreateObject("InternetExplorer.Application")
End If
myIe.Navigate URL:=imdbLink
For Each link In myIe.document.Links
If Right(link.href, 9) = "/keywords" And Left(link.href, 26) = "http://www.imdb.com/title/" Then
mKPlot = link.href 'ERROR GENERATES FROM THIS, SOMETIMES...
End If
next link
errHandler:
If Err.Number = 70 Then
Debug.Print "permission denied for: |" & title & "|"
myIe.Quit
Set myIe = Nothing
Application.Wait Now + TimeValue("00:00:10")
Resume Label1:
End If
Не гладкое исправление реестра, которое вы представляли, но оно работает для меня.
Решение сброса объекта HTMLDocument также работает для меня, т.е.
'After Page Loads, Reset HTMLDocument Object and Wait 1 Second Before recreating It
Set html = Nothing
Application.Wait Now + TimeValue("0:00:01") '<<< This seems to really help
Set html = IE.document
Ни одно из других решений не решило мою проблему.
Это распространенная проблема автоматизации Internet Explorer в VBA. Обычно это происходит после загрузки новой страницы. Я успешно использовал комбинацию DoEvents, Application.Wait и установил для моего объекта HTMLDocument значение Nothing после загрузки новой страницы.
Я представил пример кода ниже, чтобы продемонстрировать:
Option Explicit
Sub IEAutomation()
Dim IE As InternetExplorer
Dim html As HTMLDocument
Dim i As HTMLHtmlElement
Dim search_bar_id As String
Dim submit_button_name As String
Dim search_term As String
'Define Variables
search_bar_id = "lst-ib"
submit_button_name = "btnK"
search_term = "Learning VBA"
'Create IE and Naviagate to Google
Set IE = CreateObject("InternetExplorer.Application") 'Late Binding
IE.Visible = True
IE.navigate "http://www.google.com"
'Wait for IE To Load
Do While IE.readyState <> READYSTATE_COMPLETE: DoEvents: Loop
'Create HTMLDocument Object
Set html = IE.document
'Enter Search Term into Search Bar and Click Submit Button
html.getElementById(search_bar_id).innerText = search_term
Application.Wait Now + TimeValue("0:00:01")
html.getElementsByName(submit_button_name)(, 1).Click
'Wait for New Page to Load (** DoEvents Helps with the Permission Issue **)
Do While IE.readyState <> READYSTATE_COMPLETE: DoEvents: Loop
'After Page Loads, Reset HTMLDocument Object and Wait 1 Second Before Recreating It
Set html = Nothing
Application.Wait Now + TimeValue("0:00:01") '<<< This seems to really help
Set html = IE.document
'Print All Elements In H3 Tags to Immediate Window in VBE
For Each i In html.getElementsByTagName("H3")
Debug.Print i.innerText
Next i
End Sub
У меня была точно такая же проблема. Был скрипт для автоматизации IE, который работал нормально в течение года. Затем на ровном месте я начал получать это сообщение "ошибка запрещена". Я сделал две вещи, одна из которых устранила проблему, но я не знаю, какая именно.
Я удалил ссылку на "Microsoft Internet Controls", попытался скомпилировать проект, снова добавил ссылку на "Internet Controls" и скомпилировал проект.
Удалил ключевое слово WithEvents при объявлении объекта InternetExplorer, так как мне все равно не нужно было захватывать события событий из IE.
Я подозреваю, что это было первым, и что ссылка как-то испортилась, а удаление и повторное добавление исправило проблему.
Попробуйте этот код для меня. Это обходит необходимость выбирать / щелкать любой элемент в браузере.
Я проверил это для Индии
Sub Sample1() '<~~ Works as expected
Dim IE As New InternetExplorer
IE.Visible = True
IE.Navigate ("http://www.google.co.in/#hl=en&q=" & "Search Term")
End Sub
Для Великобритании
Sub Sample2() '<~~ Works as expected
Dim IE As New InternetExplorer
IE.Visible = True
IE.Navigate ("http://www.google.co.uk/#hl=en&q=" & "Search Term")
End Sub
Попробуйте это для США (не удалось проверить, так как он перенаправляет мой запрос)
Sub Sample3()
Dim IE As New InternetExplorer
IE.Visible = True
IE.Navigate ("http://www.google.com/#hl=en&q=" & "Search Term")
End Sub
У меня была та же ошибка времени выполнения 70. Отказано в доступе при автоматизации элемента управления Webbrowser в VBA под MS Access 2010. Моя цель состояла в том, чтобы установить innerHTML для узла Content Editable. Первоначально он работал отлично, а затем по неизвестной причине я начал получать "Ошибка 70. В доступе отказано". Интересно, что эта ошибка, похоже, исходит от элемента управления IE Web Browser, а не от MS Access. Время от времени он не перехватывался обработчиком ошибок VBA On Error. Другая загадка состоит в том, что при пошаговом выполнении кода он будет работать, но при нормальной работе элемент управления Webbrowser просто не будет функционировать, но не вызовет ошибку. Тем не менее, возникнет ошибка, если я установлю точку останова, а затем запросу WebBrowser в непосредственной панели на VBA с кодом, таким как: DIV.innerHTML
Вот код, который не удалось:
Private Function SetInnerHTML(HTML As String) As String
Dim HTMLEmail As HTMLDocument
Dim DIV As HTMLDivElement
Set HTMLEmail = Me.Email_MainBrowser.Controls("MyBrowser").Object.Document
Set DIV = HTMLEmail.getElementById("MyText")
DIV.innerHTML = HTML ' This is the line that failed
Подобно Деннису, операционному оператору, я попытался добавить вызовы Sleep и добавить вызовы функций, чтобы убедиться, что браузер вернул "Состояние готовности" CurrentState = Me.Form("Email_MainBrowser").Controls("MyBrowser").ReadyState (CurrentState должен быть acComplete).
Вот что я пробовал, но это не решило проблему: 1) Декомпилировать и перекомпилировать приложение MS Access. 2) Добавьте вызовы в спящую функцию Win32, чтобы дождаться элемента управления WebBrowser. 3) Запросил браузер, чтобы убедиться, что он находится в состоянии Navigation Complete.
И вот что это исправило: добавлено "DoEvents" в коде ссылок и автоматизации элемента управления webbrowser:
Dim HTMLEmail As HTMLDocument
Dim DIV As HTMLDivElement
DoEvents
Set HTMLEmail = Me.Email_MainBrowser.Controls("MyBrowser").Object.Document
Set DIV = HTMLEmail.getElementById("MyText")
DoEvents
DIV.innerHTML = HTML
DoEvents
Я не определил минимальное количество необходимых DoEvents; это, вероятно, только один стратегически расположенный. Я также все еще проверяю, чтобы убедиться, что элемент управления webbrowser находится в состоянии завершения Natigation, но я уверен, что это ошибка глубоко в элементе управления webbrowser. Тот, который, вероятно, никогда не будет исправлен.