VBA Internet Explorer自动化'权限被拒绝'

问题描述 投票:2回答:8
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和所有这些东西。这一切都不重要。以管理员身份运行也无济于事。

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

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

我用Google搜索并用Google搜索谷歌和谷歌搜索。不幸的是,运行时错误70似乎是一个问题,许多用户报告了不同症状的错误。在我的情况下,我没有找到解决方案,否则我不会在这里问。

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

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

vba internet-explorer-7 automation permission-denied shdocvw
8个回答
3
投票

在测试了所有上述建议的修复程序甚至更多之后,我很肯定这是一个奇怪的错误,只要在一个网站上有不同的安全区域,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%的伎俩。相反,我建议在适用的时候添加上面的代码。

感谢丹,没有你的评论,我永远都不会想到它!

此方法优于其他建议修复的优点摘要:

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

使用此方法不需要的所有事情的摘要:

  • InternetExplorerMedium对象
  • 一般早期绑定
  • 参考Microsoft Internet Controls
  • 参考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

我真的希望这将有助于其他人。对于帮助将解决方案拼凑在一起的所有人来说,请加快速度。

最好的问候帕特里克


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. 我删除了对“Microsoft Internet Controls”的引用,尝试编译项目,添加了对“Internet Controls”的引用,并编译了项目。
  2. 在声明InternetExplorer对象时删除了'WithEvents'关键字,因为我无论如何都不需要从IE捕获事件事件。

我怀疑它是第一个,并且不知何故引用被破坏并且删除并重新添加它修复了问题。


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


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
投票

我有相同的运行时错误70.在MS Access 2010下自动化VBA中的Webbrowser控件时权限被拒绝。我的目标是为Content Editable节点设置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

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

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

以下是解决它的问题:在引用和自动化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

我还没有计算出所需的最少数量的DoEvent;它可能只是一个战略性的位置。我还要检查以确保webbrowser控件处于Natigation完成状态,但我确定这是Webbrowser控件中的一个深层错误。一个可能永远不会被修复的。


0
投票

这是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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.