2
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: «Отказано»VBA INTERNET EXPLORER Automation «Отказано»

Пожалуйста, не предлагают код изменений. В коде отсутствует НИЧЕГО. Этот макрос работает на 9 из 10 компьютеров. Это НЕ проблема с синхронизацией (я все равно получаю ошибку, даже если я перехожу вручную). Я знаю, что есть другие способы объявить объект Internet Explorer. Я попытался использовать CreateObject и все такое. Ничего из этого не имеет значения. Выполнение как администратора тоже не помогает.

Это простой пример проблемы (мы фактически автоматизируем гораздо более сложные задачи). Поэтому, пожалуйста, не спрашивайте: «Почему вы хотите сделать добрый поиск?» и, пожалуйста, не спрашивайте «что вы пытаетесь сделать». Мне нужна эта проблема. Мне не нужно писать код.

Мы используем Windows XP, Internet Explorer 7 и Office 2003. Что-то вызывает случайные люди, которые не могут автоматизировать интернет-проводник. Это не проблема пользователя, а проблема с компьютером. То, что я имею в виду, на компьютерах с преступниками, никто не может автоматизировать независимо от того, какой пользователь входит в систему. Но тот же пользователь может использовать другой компьютер, и все в порядке. Поэтому, вероятно, это параметр реестра на локальном компьютере или что-то в этом роде. Все компьютеры настроены таким же образом здесь, одни и те же спецификации, одно и то же программное обеспечение.

У меня googled и googled и googled и googled. К сожалению, ошибка во время выполнения 70 кажется уловкой, и многие пользователи сообщают об ошибке для разных симптомов. В моем случае я не нашел решения, иначе я бы не спросил здесь.

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

Любая помощь будет благодарна, спасибо.

+0

Это проблема только с IE7? –

+0

Также вы открываете идею тестирования небольшого изменения кода? Причина, по которой я спрашиваю, заключается в том, что она резко сократит код и работает так, как вы ожидали. –

+0

Я всегда открыт для повышения эффективности, поэтому буду приветствовать любые предложения :) –

ответ

0

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

Я испытал это для Индии

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 
+0

Ну, это позволит решить сценарии, когда данные GET отправляются на сервер через HTTP-запрос, но, к сожалению, большинство наших сайтов интрасети, с которыми мы работаем, используют метод POST. Кроме того, мы получаем гораздо больше HTML-элементов, чем просто формы, и ошибка «отказа в разрешении» возникает во многих из них. Представление формы было просто кратким примером для иллюстрации проблемы. –

+0

Странно, что ваш код работал для меня в первый раз, тогда он начал давать мне ошибки, но на другой строке. в тот момент, когда я использовал «Сон», он снова начал работать. Вы хотите проверить это? –

+0

Спасибо за предложение. Я ценю это. –

1

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

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

1

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

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

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

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

0

У меня была такая же ошибка времени выполнения 70. Разрешение было запрещено при автоматизации управления Webbrowser в VBA в MS Access 2010. Моя цель состояла в том, чтобы установить innerHTML для узла Content Editable. Первоначально он работал отлично, а затем по неизвестной причине я начал получать «Error 70. Permission Denied». Интересно, что эта ошибка, похоже, исходит от элемента управления веб-браузером IE, а не от MS Access. Время от времени он не был захвачен обработчиком ошибок VBA On On. Еще одна загадка заключается в том, что при однократном выполнении кода он будет работать, но при нормальной работе элемент управления 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 

Как Деннис, ОП, я попробовал, добавив в призывах сна и добавил вызовов функций, чтобы убедиться, что браузер вернулся «Ready государство» CurrentState = Me.Form («Email_MainBrowser»). Элементы управления («MyBrowser»). ReadyState (CurrentState должен быть acComplete).

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

А вот что установил его: Добавленные «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. Тот, который, вероятно, никогда не будет исправлен.

1

После тестирования всех предложенных исправлений и даже более того, я уверен, что это странная ошибка с Eventhandling дочерних процессов, вызываемых IE, когда на одном веб-сайте есть разные зоны безопасности.

Cut в погоню, вот решение:

'Craziest workaround ever due to bugged IE Eventhandling 
Do While IE.ReadyState = 4: DoEvents: Loop 
Do Until IE.ReadyState = 4: DoEvents: Loop 

Добавить этот кусок кода каждый раз после навигации на новую страницу или других событий, которые могут привести к веб-сайт, чтобы перезагрузить, как нажав на подать или аналогичные.

Дэн выше предложил добавить слова DoEvents в ваш код, что не помогло мне сделать 100%. Вместо этого я предлагаю добавить вышеприведенный код.

Kudos to Dan, без вашего комментария Я бы никогда не понял!

Краткий обзор из преимуществ этого метода имеет по сравнению с другими предложенными исправлениями:

  • Вы можете придерживаться позднего связывания, если вы хотите (Dim IE в качестве объекта)
  • Вы можете вставить создание объекта InternetExplorer (в отличии от т.е. InternetExplorerMedium)
  • Вы не должны изменять параметры зон безопасности в IE
  • нет ненужного времени ожидания в приложении
  • Вы избавитесь от Error 70 - Permission denied
  • Вы избавляетесь от утерянных сеансов, то есть «Ошибка времени выполнения» -2147417848 (80010108): Ошибка автоматизации Отключенный объект отключен от своих клиентов ».
  • Вы избавляетесь от проблем интерфейса, то есть «ошибка времени выполнения„-2147023179 (800706b5)“: Ошибка автоматизации Интерфейс неизвестна»

Резюме всех вещей ВАМ НЕ НУЖНЫ с этим подходом :

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

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

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

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 

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

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

0

Это общая проблема с автоматизацией 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 
0

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

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