【发布时间】:2014-01-30 02:41:32
【问题描述】:
我在尝试通过 VBA 控制 IE 时遇到了这种 IE 易怒综合症。我打算打开一个网站并查找特定文件(即 XLS)然后下载它。
我的代码:
Dim IE as InternetExplorer ' I could also use "Object" here
Dim HTMLDoc as HTMLDocument
Dim OHTML_Element as IHTMLElement
Set IE = New InternetExplorer ' I could also use "InternetExplorerMedium" here
IE.Silent = True
IE.Navigate (sURL)
IE.Visible = True
Set HTMLDoc = IE.document
mimtype = "Microsoft Office Excel 97-2003 Worksheet"
For Each oHTML_Element In HTMLDoc.Links
If InStr(oHTML_Element.mimeType, mimtype) Then
If InStr(oHTML_Element.href, FileType) Then
' Get the SOURCE file and DESTINATION files
SRCfile = mainURL & oHTML_Element.pathname
FileName = DESTPath & oHTML_Element.nameProp
'Download the file
ret = URLDownloadToFile(0, SRCfile, FileName, 0, 0)
'See if the download happened correctly
If ret = 0 Then
'all went well
GetFile = True
Else
MsgBox "There was a problem downloading the file.", vbCritical, "DOWNLOADING ERROR!"
GetFile = False
Exit Function
End If
Exit For
End If
End If
Next oHTML_Element
现在,在过去的几个月里,这似乎一直有效。从过去两天开始,系统在IE.navigate(sURL 之后挂起。在调试模式下,我可以清楚地看到创建的IE 对象的所有字段,但在执行IE.navigate(sURL) 之后,对象的所有字段都消失了,但是网站确实打开了。但是,这个问题不是很“一致”,因此它可能会消失或不会因此而烦躁!这个“消失”的字段很危险,因为我有一个if 条件来检查字段是否为空,如果True 退出。
只是一点背景知识,我在 Win 7,IE 11 上(昨天在 IE 10 上出现此问题后升级,之前它在 IE 10 上工作了几个月)
在浏览了 WWW 之后,似乎有些人遇到了这个问题。 Stackoverflow 上有一个解决方案建议使用MSHTML.XMLHTTP60。所以,我试过了,
Dim IE as MSHTML2.XMLHTTP60
Dim HTMLDoc as MSHTML.HTMLDocument
Dim HTMLBod as
Set IE = new MSHTML2.XMLHTTP60
IE.open "Get", sURL, False
IE.send
Set HTMLDoc = new MSHTML.HTMLDocument
HTMLDoc.body.innerHtml = IE.responseText
???? How do I proceed further to "search" for a XLS file and gets its "href" link?
我尝试查看HTMLDoc(使用MSHTML)和HTMLDoc(使用InternetExplorer)中的数据(通过观察窗口),数据似乎不一样。所以我之前的“搜索 mime-type & href 并下载”的过程将无法正常工作。
如果有人能对此有所了解,我将不胜感激?我正在寻找一种解决方案,可以帮助我纠正 InternetExplorer 的不一致行为,或者使用 MSHTML2 的解决方案
【问题讨论】:
-
当您到达
Set HTMLDoc = IE.document行时,是否可能网站尚未完成加载?在尝试读取文档之前,通常会有一个循环检查 IE 的就绪状态。作为快速检查,在尝试阅读文档之前插入 5 秒暂停,看看是否有帮助。在第一版代码中的“Set HTMLDoc...”行之前添加这一行:Application.Wait Now()+TimeValue("0:00:05")如果可行,我们可以从那里进行微调 -
@barrowc 代码的原始版本有
Application.Wait Now() + TimeValue("0:00:05")。但是,我对InternetExplorer的问题并不能始终如一地重现,有时它会在IE.navigate之后立即失败,如果它没有在那里失败,它会继续没有任何故障。我注意到的另一件有趣的事情是,无论何时发生故障,在执行IE.navigate甚至在执行IE.Visible=true之前,就可以立即“看到”浏览器!这不应该发生。 -
我还在苦苦挣扎...使用
dim IE as InternetExplorer,在我执行Set IE = New InternetExplorerMedium后,IE对象被实例化,但查看对象窗口我可以看到IE.document包含“应用程序定义或对象定义错误”。这个错误甚至在我IE.navigate之前就出现了。在我IE.navigate之后,浏览器会打开网页,但我IE对象里面什么都没有!!! -
嗯,更多更新... Machine-1:Win 7 Home Premium、Excel 2007、IE 11(同上安全设置)当我执行
IE.navigate(url)时,IE 以不可见模式打开(其中是正确的,因为我IE.Visible=false) 并且没有故障 Machine-2: Win 7 Professional, Excel 2007, IE 11 (同上安全设置) 当我执行IE.navigate(url), IE opens in VISIBLE mode even thoughIE.visible=false` 时使用相同的代码,我得到了所有问题。
标签: html vba excel automation mshtml