19

我正在使用 Excel VBA 代码单击我们网站上的按钮。我知道这不是最好的事情,但它是我可用的最不令人反感的选择。

我可以使用这段代码,成功加载imdb.com、google等。但是当我加载我们的本地站点时,我失去了对ie对象的控制,我无法检查readyState,我无法退出。

这是我得到的错误。

运行时错误“-2147023179 (800706b5)”:
自动化错误
接口未知

每隔一段时间,我就会收到以下消息:

运行时错误“-2147417848 (80010108)”:
自动化错误
调用的对象已与其客户端断开连接。

单击 Debug 表示ie.readyState,我将其注释掉,然后它指向ie.Quit

Sub dothestuff()
    Dim ie As InternetExplorer
    Set ie = New InternetExplorer
    ie.Visible = True

    ie.Navigate "http://www.google.com/"
    anerror = webload(ie)

    ie.Quit
    Set ie = Nothing
End Sub

Function webload(ie)
    Do Until ie.ReadyState = READYSTATE_COMPLETE
        DoEvents
    Loop
End Function
4

11 回答 11

32

这是此问题的快速简便的解决方案:

代替:

set IE = createobject("internetexplorer.application")

采用:

Set IE = New InternetExplorerMedium

无需调整 IE 设置

于 2013-10-07T09:33:10.007 回答
19

这是正在发生的事情。当您的浏览器在内部“跳转”到不同的安全区域时 - 从本地地址到 InTRAnet 地址或到 Internet 地址 - IE 关闭/删除 IE 的当前进程并打开另一个具有更严格安全性的进程。旧的和新的 IE 进程是父 IE 任务的 IE 子进程,因此您不会通过查看浏览器或在任务管理器中查看进程来看到它发生。如果您使用 Process Explorer(Microsoft 免费提供),您可以看到这种情况。

在这种类型的环境中,您需要做的是使用上面的 Anup Upadhyay 的解决方案。他的代码片段查看所有 IE 任务(父子任务没有区别),并找到指向原始进程的网址的新 IE 进程。只要您没有对同一个地址打开多个浏览器,它就会可靠地找到新进程并按照您的预期继续运行。

注意:您可能还需要使用InternetExplorerMedium对象,而不是InternetExplorer对象。它也更擅长“坚持”一个会话。

这是我的版本,与 Anup 的版本几乎相同。

MS Office VBA 的参考资料:

  • 微软互联网控制

  • Microsoft Shell 控件和自动化

n

Dim IE As InternetExplorerMedium ' This object (the "medium" variety as opposed to "InternetExplorer") is necessary in our security climate
Dim targetURL As String
Dim webContent As String
Dim sh
Dim eachIE

targetURL = "[your URL here]"
Set IE = New InternetExplorerMedium
IE.Visible = False ' Set to true to watch what's happening
IE.Navigate targetURL

While IE.Busy
  DoEvents
  Wend

Do
  Set sh = New Shell32.Shell
  For Each eachIE In sh.Windows
    If InStr(1, eachIE.LocationURL, targetURL) Then
      Set IE = eachIE
      'IE.Visible = False  'This is here because in some environments, the new process defaults to Visible.  
      Exit Do
      End If
    Next eachIE
  Loop
Set eachIE = Nothing
Set sh = Nothing

While IE.Busy  ' The new process may still be busy even after you find it
  DoEvents
  Wend
于 2015-01-05T17:39:50.063 回答
10

试试这个:

Set IE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
于 2013-07-15T19:12:01.350 回答
7

我们在使用 IE9 时遇到了这个问题。它是由于安全设置而出现的。在“Internet 选项”对话框(工具...Internet 选项)的“安全”选项卡上有一个名为“启用保护模式”的设置。每个“区域”可以有不同的“启用保护模式”设置我们取消选中“启用保护模式”,这解决了我们的问题。我认为正在发生的事情是,当切换到处于保护模式的区域时,IE 会启动一个新进程来处理该区域中的流量(可能会杀死旧进程)。当这种情况发生时,您在 VBA 中的 IE 对象变量与 Internet Explorer 断开连接。

于 2013-03-28T16:42:34.420 回答
4

好吧,刚刚找到解决办法,无奈之下决定尝试加载127.0.0.1而不是localhost,果然没有问题,于是解决了本地内网服务器的ip地址,现在我可以走了。我真的不明白为什么,但这已经解决了我的问题。

于 2012-10-19T16:35:16.837 回答
4
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = False
IE.Navigate "C:\abc.html"

'我们在这里遇到错误,我找到了一个小棘手的替代解决方案,如下所示'参考 Microsoft Shell 控件和自动化'使用下面的代码重新分配 IE 对象以解决丢失的连接问题

Dim sh
Dim eachIE
Do

    Set sh = New Shell32.Shell
    For Each eachIE In sh.Windows
        ' Check if this is the desired URL

' Here you can use your condition except .html
' If you want to use your URL , then put the URL below in the code for condition check.
    ' This code will reassign your IE object with the same reference for navigation and your issue will resolve.
' 
        If InStr(1, eachIE.locationurl, ".html") Then 
        Set IE = eachIE
        Exit Do
        End If
    Next eachIE
Loop
于 2013-11-05T05:44:11.933 回答
2

对我来说,以下工作:

  1. 打开互联网浏览器
  2. 转到工具
  3. 转到互联网选项
  4. 切换到安全选项卡
  5. 单击受信任的站点
  6. 点击网站
  7. 您将看到网站网址,选择它
  8. 单击删除
  9. 单击关闭,应用和确定

附言。我在 IE 8 浏览器上测试了这些步骤。

于 2015-03-30T15:14:11.573 回答
1

也许您在绑定时遇到问题?这是一个奇怪的错误。

试试这个代码(改编自http://www.excely.com/excel-vba/ie-automation.shtml)。希望它有所帮助:

Option Explicit

' lasts for the life of Excel being open
Dim ie As Object

Sub dothestuff()
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    ie.Navigate "http://www.google.com/"

    Do While ie.Busy
        DoEvents
    Loop

    ie.Quit
    Set ie = Nothing
End Sub
于 2012-10-19T13:55:44.217 回答
1

我在使用我们公司内部网中的网站时遇到了完全相同的问题,该网站也包含在我的受信任网站中。禁用保护模式允许我检查 ReadyState,但前提是我禁用了 Internet 区域以及 Intranet 和受信任的站点。

为什么在受信任站点上检查 ReadyState 时,为 Internet 区域启用保护模式会导致自动化错误?有没有办法在不禁用互联网区域的保护模式的情况下解决这个问题?

于 2013-07-17T13:28:06.460 回答
1

另一个解决方案..

Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate ("http://URLOnMyIntranet/site.html")
IE.Visible = True

Set IE = nothing
Set objShellApp = CreateObject("Shell.Application")
For Each objWindow In objShellApp.Windows
    Debug.Print objWindow.LocationName
     If LCase(objWindow.LocationName) = LCase("Your windows name, use debug to find out") Then
            Set IE = objWindow
     End If
Next

请注意,使用 InternetExplorerMedium(请参阅其他答案)通常是您所需要的,仅供参考,您也可以使用 Url 属性 obj.LocationURL 而不是更准确的窗口名称。查看其他答案。

于 2015-02-26T00:52:09.073 回答
0
Dim IE As InternetExplorer
Set IE = New InternetExplorerMedium
IE.Navigate "yousite.org"
IE.Visible = True

Do While IE.Busy
    DoEvents
Loop    

Set HTML = IE.document
Do
var8 = HTML.DocumentElement.innerHTML
v3 = var8
v4 = InStrRev(v3, "the class or ID you are looking for when the _    
page final loads", -1)
Loop While v4 = 0

Do While IE.Busy
    DoEvents
Loop 

'Your in the new page look for elements and click rinse and repeat
'the Do loop. This method works with my intranet corporate site
于 2019-12-21T02:53:43.347 回答