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搜索?”请不要问“你想做什么”。我需要解决这个问题。我不需要重新编写我的代码。

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

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

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

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

最佳答案

在测试了以上所有建议的修复甚至更多之后,我肯定这是一个奇怪的错误,当一个网站上有不同的安全区域时,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% 成功。相反,我建议在适用的地方添加上面的代码。

感谢丹,没有你的评论,我永远不会明白!

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

  • 你不需要 的所有事情的总结:
  • InternetExplorerMedium 对象
  • 一般的早期绑定(bind)
  • 对 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
    

    我真的希望这会在 future 帮助其他人。
    感谢所有帮助拼凑解决方案的人。

    此致
    帕特里克

    关于VBA Internet Explorer 自动化 'Permission Denied',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10283496/

    10-11 22:03