Автоматизация VBA Internet Explorer «Отказано в доступе»

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 во время выполнения кажется всеобъемлющей, и многие пользователи сообщают об ошибке по разным причинам. В моем случае я не нашел решения, иначе я бы не спрашивал здесь.

Единственный способ решить эту проблему — заставить ИТ-специалистов полностью перезагрузить все на жестком диске. Чистое обновление, включая операционную систему. Это решает проблему, но также заставляет пользователя снова настроить свою машину так, как она была раньше, и переустановить все программное обеспечение и все остальное. Это не очень хорошее решение. Где-то на машине есть настройка, вызывающая это, иначе обновление не будет иметь эффекта. Я хочу знать, что это за параметр (мне кажется, что это параметр реестра).

Любая помощь приветствуется, спасибо.


person Dennis Williams    schedule 23.04.2012    source источник
comment
Проблема возникает только с IE7?   -  person Siddharth Rout    schedule 23.04.2012
comment
Также вы открыты для идеи тестирования небольшого изменения кода? Причина, по которой я спрашиваю, заключается в том, что это значительно сократит код и будет работать так, как вы ожидали.   -  person Siddharth Rout    schedule 23.04.2012
comment
Я всегда открыт для повышения эффективности, поэтому буду рад любым предложениям :)   -  person Dennis Williams    schedule 23.04.2012
comment
Это происходит в Internet Explorer 6 и 7, это единственные два, которые я пробовал.   -  person Dennis Williams    schedule 23.04.2012
comment
Супер. Один быстрый вопрос. Вы находитесь в США? Я имею в виду, что если вы нажмете Google.com, он покажет Google.com или перенаправит вас, чтобы сказать (в моем случае google. co.in)   -  person Siddharth Rout    schedule 23.04.2012
comment
Да я в США. Он показывает google.com   -  person Dennis Williams    schedule 23.04.2012
comment
+1 за интересный вопрос :)   -  person Siddharth Rout    schedule 23.04.2012
comment
Извините, не уверен, что это поможет, но звучит подозрительно похоже на то, что может вызвать вашу проблему.. support.microsoft.com/kb/908356   -  person Andrew    schedule 05.07.2012


Ответы (8)


После тестирования всех предложенных выше исправлений и даже больше, я уверен, что это странная ошибка с обработкой событий дочерних процессов, вызываемых 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 as Object)
  • Вы можете придерживаться создания объекта InternetExplorer (в отличие от, например, InternetExplorerMedium)
  • Вам не нужно изменять настройки зоны безопасности в IE
  • Нет ненужного времени ожидания в вашем приложении
  • Вы избавляетесь от ошибки 70 - Отказано в доступе
  • Вы избавляетесь от потерянных сеансов, т. Е. «Ошибка времени выполнения« -2147417848 (80010108) »: ошибка автоматизации. Вызванный объект отключился от своих клиентов».
  • Вы избавляетесь от проблем с интерфейсом, например, «Ошибка времени выполнения '-2147023179 (800706b5)': Ошибка автоматизации Интерфейс неизвестен»

Краткое изложение всего, что ВАМ НЕ НУЖНО при таком подходе:

  • InternetExplorerMedium объекты
  • Раннее связывание в целом
  • Ссылка на Microsoft Internet Controls
  • Ссылка на элементы управления и автоматизации Microsoft Shell
  • Странная обработка ошибок
  • Нет необходимости когда-либо проверять IE.Busy в вашем коде
  • Application.wait или спящий режим вызывают ненужные предполагаемые задержки

Я включаю приведенное выше резюме только потому, что я видел все предложенные обходные пути и лично пробовал их, пока безуспешно.

Пример кода на основе вопроса OP:

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

Я очень надеюсь, что это поможет другим в будущем. Удачи всем, кто помог собрать решение вместе.

С наилучшими пожеланиями Патрик

person must_improve    schedule 10.07.2017
comment
Спасибо вам большое за это! В моем решении используется вход в Office 365 с внутренними и внешними перенаправлениями. Я использовал этот ужасный подход повторных попыток, чтобы заставить его работать. Это решение только что все исправило! - person Casper Alant; 21.06.2018
comment
Чтобы подтвердить, что после обходного пути вся страница была проанализирована и отображена IE? И весь DOM доступен? - person TekiusFanatikus; 05.01.2021
comment
После обходного пути ie.busy в некоторых случаях показывает True. - person TekiusFanatikus; 05.01.2021

Я получаю ту же ошибку при автоматизации 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

Не то гладкое исправление реестра, которое вы себе представляли, но оно работает для меня.

person Justin Valle    schedule 16.05.2012

У меня была точно такая же проблема. Был скрипт для автоматизации IE, который год нормально работал. Затем ни с того ни с сего я начал получать эту «ошибку отказа в доступе». Я сделал две вещи, одна из которых устранила проблему, но я не знаю, какая именно.

  1. Я удалил ссылку на «Microsoft Internet Controls», попытался скомпилировать проект, снова добавил ссылку на «Internet Controls» и скомпилировал проект.

  2. Удалено ключевое слово «WithEvents» при объявлении объекта InternetExplorer, поскольку мне все равно не нужно было захватывать события событий из IE.

Я подозреваю, что это было первое, и что каким-то образом ссылка была повреждена, и ее удаление и повторное добавление устранили проблему.

person Francis    schedule 10.08.2012

Это распространенная проблема с автоматизацией 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
person Justin    schedule 01.09.2017
comment
Да, это единственное решение, которое сработало для меня! СПАСИБО! Я так много пробовал... ни один из них не работал, кроме этого, это идеально - person ; 04.10.2020
comment
Я рада, что пост оказался полезным! - person Justin; 24.05.2021

Решение сброса объекта 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

Ни одно из других решений не решило мою проблему.

person Asger    schedule 28.02.2018

Следующее сработало для меня. Я не тестировал его широко, но проблема не повторялась. Я получал ошибку с перерывами, но всегда в одном и том же месте.

Управление первым экземпляром 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: мой первый пост на stackoverflow, я думаю, что сделал правильное форматирование

person yyc123    schedule 30.04.2019

Попробуйте этот код для меня. Это позволяет избежать необходимости выбирать/щелкать любой элемент в браузере.

Я тестировал это для Индии

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
person Siddharth Rout    schedule 23.04.2012
comment
Что ж, это решило бы сценарии, в которых данные GET отправляются на сервер через HTTP-запрос, но, к сожалению, большинство наших сайтов интрасети, с которыми мы работаем, используют метод POST. Кроме того, мы обращаемся к гораздо большему количеству HTML-элементов, чем только к формам, и во многих из них возникает ошибка «Отказано в доступе». Отправка формы была всего лишь кратким примером, иллюстрирующим проблему. - person Dennis Williams; 23.04.2012
comment
Как ни странно, ваш код работал у меня в первый раз, а затем начал выдавать ошибки, но в другой строке. в тот момент, когда я использовал Sleep, он снова начал работать. Вы хотите проверить это? - person Siddharth Rout; 23.04.2012
comment
Спасибо за предложение. Я ценю это. - person Dennis Williams; 23.04.2012
comment
Нет, это я уже тестировал. Вы не сможете воспроизвести эту проблему... Я едва могу воспроизвести ее и только на определенных компьютерах здесь, на работе. Я даже заставил его спать в течение 20 или 30 секунд, просто чтобы убедиться, что это не проблема времени. - person Dennis Williams; 23.04.2012
comment
Должен сказать, что ваш вопрос меня сбил с толку :) Позвольте мне провести небольшое исследование. - person Siddharth Rout; 23.04.2012
comment
Спасибо :) Меня это тоже сбило с толку. Где-то в офисе, Internet Explorer или операционной системе должен быть параметр безопасности. - person Dennis Williams; 23.04.2012
comment
Не уверены, видели ли вы это? fixerrorcodesnow.com/runtime-error-70-permission-denied - person Siddharth Rout; 23.04.2012
comment
На самом деле я уже видел этот сайт. Этот сайт на самом деле является уловкой, чтобы заставить вас купить программное обеспечение для очистки реестра. Там нет никакой информации по моей проблеме. - person Dennis Williams; 23.04.2012
comment
Возможно, вы захотите найти RIT, RBAT или RCO на соответствующем компьютере? У меня тоже XP, а этих ключей нет. - person Siddharth Rout; 23.04.2012
comment
Этих ключей не было ни на одном из наших компьютеров. Однако на всякий случай я добавил их на рассматриваемый ПК, и это не устранило ошибку отказа в разрешении. Возвращается на круги своя :( - person Dennis Williams; 25.04.2012

У меня была такая же ошибка времени выполнения 70. Отказано в доступе при автоматизации управления веб-браузером в VBA под MS Access 2010. Моя цель состояла в том, чтобы установить innerHTML для редактируемого содержимого узла. Сначала все работало отлично, а потом по неизвестной причине я начал получать "Ошибка 70. Отказано в доступе". Интересно, что эта ошибка возникает из-за элемента управления веб-браузера IE, а не из 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 должен быть выполнить).

Вот что я пробовал, но проблема не решилась: 1) Декомпилировать и перекомпилировать приложение MS Access. 2) Добавлены вызовы функции сна Win32 для ожидания элемента управления WebBrowser. 3) Запрошен Webbrowser, чтобы убедиться, что он находится в состоянии завершения навигации.

И вот что это исправило: добавлено много "DoEvents" вокруг кода, ссылающегося и автоматизирующего управление веб-браузером:

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; это, вероятно, только один из стратегически расположенных. Я также по-прежнему проверяю, находится ли элемент управления веб-браузером в состоянии завершения навигации, но я уверен, что это ошибка глубоко в элементе управления веб-браузером. Тот, который, вероятно, никогда не будет исправлен.

person Dan    schedule 15.01.2017