3
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:“权限被拒绝”

请不要建议代码更改。代码没有任何问题。此宏适用于 10 台计算机中的 9 台。这不是时间问题(即使我手动执行,我仍然会收到错误消息)。我知道还有其他方法可以声明 Internet Explorer 对象。我尝试过使用 CreateObject 和所有这些东西。这些都不重要。以管理员身份运行也无济于事。

这只是问题的一个简单示例(我们实际上是在自动化更复杂的任务)。所以请不要问“为什么要做goodle search”?请不要问“你想做什么”。我需要解决这个问题。我不需要重新编写我的代码。

我们使用 Windows XP、Internet Explorer 7 和 Office 2003。有些东西导致随机的人无法自动化 Internet Explorer。这不是用户问题,而是计算机问题。我的意思是在罪魁祸首计算机上,无论哪个用户登录,都没有人可以自动化。但是同一个用户可以使用不同的计算机,一切都很好。因此,它可能是本地计算机上的注册表设置或类似的东西。这里所有的计算机都以相同的方式设置,相同的规格,相同的软件。

我用谷歌搜索和谷歌搜索和谷歌搜索和谷歌搜索。不幸的是,运行时错误 70 似乎是一个包罗万象的问题,许多用户报告了不同症状的错误。就我而言,我还没有找到解决方案,否则我不会在这里问。

我们可以解决它的唯一方法是让 IT 完全重新加载硬盘上的所有内容。干净的刷新,包括操作系统。这解决了问题,但它也迫使用户将他们的机器重新设置为他们以前的方式并重新安装所有软件和所有东西。这不是一个好的解决方案。机器上某处的设置会导致此问题,否则刷新将不起作用。我想知道那个设置是什么(我的感觉是它是一个注册表设置)。

任何帮助表示赞赏,谢谢。

4

8 回答 8

5

在测试了上述所有建议的修复程序甚至更多之后,我确信这是一个奇怪的错误,当一个网站上有不同的安全区域时,IE 会调用子进程的事件处理。

切入正题,解决方法如下:

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

每次导航到新页面或可能导致网站重新加载的其他事件(例如单击提交按钮或类似事件)后,都添加此代码段。

上面的 Dan 建议在您的代码中自由地添加 DoEvents 语句,但这并没有 100% 对我有用。相反,我建议在适用的情况下添加上述代码。

向丹致敬,没有你的评论,我永远也想不通!

此方法优于其他建议修复的好处的简短摘要:

  • 如果您愿意,您可以坚持后期绑定(将 IE 调暗为对象)
  • 您可以坚持创建 InternetExplorer 对象(而不是 InternetExplorerMedium)
  • 您无需更改 IE 中的安全区域设置
  • 在您的应用程序中没有不必要的等待时间
  • 您摆脱了错误 70 - 权限被拒绝
  • 您摆脱了丢失的会话,即“运行时错误'-2147417848(80010108)':自动化错误调用的对象已与其客户端断开连接。”
  • 您摆脱了接口问题,即“运行时错误'-2147023179 (800706b5)':自动化错误接口未知”

使用这种方法不需要的所有东西的总结:

  • InternetExplorerMedium 对象
  • 一般的早期绑定
  • 参考 Microsoft Internet 控件
  • 参考 Microsoft Shell 控件和自动化
  • 奇怪的错误处理
  • 无需在代码中检查 IE.Busy
  • Application.wait 或 sleep 导致不必要的估计延迟

我只包括上面的摘要,因为我已经看到了所有这些建议的解决方法,并且到目前为止没有运气亲自尝试过它们。

基于 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

我真的希望这将在未来对其他人有所帮助。向所有帮助拼凑解决方案的人致敬。

最好的问候帕特里克

于 2017-07-10T16:04:04.940 回答
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

不是您想象的时尚注册表修复,但它适用于我。

于 2012-05-16T19:18:53.050 回答
1

我遇到了同样的问题。有一个用于自动化 IE 的脚本,已经运行了一年。然后我突然开始收到这个“权限被拒绝错误”。我做了两件事,其中一件解决了问题,但我不知道哪一件。

  1. 我删除了对“Microsoft Internet Controls”的引用,尝试编译该项目,重新添加了对“Internet Controls”的引用,然后编译了该项目。

  2. 在声明 InternetExplorer 对象时删除了“WithEvents”关键字,因为无论如何我都不需要从 IE 捕获事件事件。

我怀疑这是第一个,并且以某种方式引用已损坏并删除并重新添加它解决了问题。

于 2012-08-10T19:34:49.730 回答
1

这是 VBA 中 Internet Explorer 自动化的常见问题。它通常似乎发生在加载新页面之后。我已经成功地使用了 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
于 2017-09-01T03:30:50.433 回答
1

以下对我有用。我没有对它进行广泛的测试,但问题没有再次出现。我间歇性地收到错误,但总是在同一点。

第一个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上的第一篇文章,我认为我的格式正确

于 2019-04-30T19:34:56.080 回答
1

重置 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

其他解决方案都没有解决我的问题。

于 2018-02-28T13:39:09.810 回答
0

Try this code for me. This bypasses the need to select/click any element in the browser.

I tested this for INDIA

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

For UK

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

Try this for US (Couldn't Test It as it redirects my request)

Sub Sample3()
    Dim IE As New InternetExplorer
    IE.Visible = True
    IE.Navigate ("http://www.google.com/#hl=en&q=" & "Search Term")
End Sub
于 2012-04-23T17:12:48.027 回答
0

我遇到了相同的运行时错误 70。在 MS Access 2010 下的 VBA 中自动执行 Webbrowser 控件时权限被拒绝。我的目标是为内容可编辑节点设置 innerHTML。最初,它运行良好,然后由于未知原因,我开始收到“错误 70。权限被拒绝”。有趣的是,这个错误似乎来自 IE Web 浏览器控件,而不是来自 MS Access。有时,它不会被 VBA 错误处理程序 On Error 捕获。另一个难题是,当单步执行代码时,它会工作,但当正常运行时,Webbrowser 控件将不起作用,但不会引发错误。但是,如果我设置断点,然后在 VBA 的即时窗格中使用以下代码查询 WebBrowser,则会引发错误: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

像 OP 丹尼斯一样,我尝试添加 Sleep 调用并添加函数调用以确保浏览器返回“Ready State” CurrentState = Me.Form("Email_MainBrowser").Controls("MyBrowser").ReadyState (CurrentState 应该是完成)。

以下是我尝试过的并没有解决问题的方法: 1)反编译并重新编译 MS Access 应用程序。2) 添加对 Win32 睡眠函数的调用以等待 WebBrowser 控件 3) 查询 Webbrowser 以确保它处于 Navigation Complete 状态。

这是修复它的原因:在代码引用和自动化 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 数量;它可能只是一个战略布局。我还检查以确保 webbrowser 控件处于 Natigation 完成状态,但我确信这是 Webbrowser 控件深处的错误。一个可能永远不会被修复的东西。

于 2017-01-15T05:18:14.377 回答