我正在尝试自动化一些功能,为了做到这一点,我构建了一个简单的系统:
在本地网页中输入您需要的所有数据,按下按钮后,所有这些数据都将传输到Excel工作表。
好消息是:它有效。坏消息?不是每台电脑都有。
您会看到,当用户打开VBScript时,一切都已启动。此脚本打开页面并侦听某些操作。执行此类操作后,它会关闭页面并将其内容写入excel文件。
当我在家用电脑上执行此脚本时,它就像一个魅力,没有任何问题。然而,当我尝试在办公室执行此操作时,故事却完全不同。
在打开我的本地页面时,IE似乎失去了其身份的一部分,因为一旦我将页面更改为Google,它就有用了。
FilePath = "C:\Hours"
PageFilePath = FilePath & "\HourAppointment.html"
'PageFilePath = "www.google.com"
Set objExplorer = CreateObject("InternetExplorer.Application")
objExplorer.Visible = 1
objExplorer.Width = 1200
objExplorer.Height = 700
objExplorer.Left = 10
objExplorer.Top = 10
Call objExplorer.Navigate2( PageFilePath )
Call WaitForIExplorer( objExplorer )
objExplorer.Quit
Private Function WaitForIExplorer(objExplorer)
Do until objExplorer.readyState = 4
WScript.Sleep 1000
Loop
Do While objExplorer.Busy = True
WScript.Sleep 1000
Loop
End Function
页面会自动打开,但只要脚本引擎尝试读取它的readystate就会失败。
我尝试了一些组合,例如在读取readystate之前设置延迟(10秒+),但无济于事。还值得一提的是,IE对象永远不会为空,我已经使用IsNull函数检查了它并且我已经摆弄了IE安全设置,但没有管理任何特殊的东西,因为我真的不知道是什么变化制作。
那么,有谁知道我的程序到底发生了什么?
感谢@Teemu,我只使用Busy而不是readyState来最小化问题。即便如此,我还添加了一个新功能:
Private Function CheckValidity(objExplorer)
CheckValidity = False
Set bodyContent = objExplorer.Document.Body.All
saveValue = bodyContent.savePressed.Value
appointValue = bodyContent.newAppointmentPressed.Value
If ((saveValue = "SAVE") _
And (appointValue = "SAVE")) Then
CheckValidity = True
End If
End Function
尝试获取文档正文时,它会因接口未知错误而失败。我理解这是因为页面没有完全加载,但我不确定,因为我之前已经放置了另一个Sleep调用而没有任何更改。
编辑:使用下面的答案,我注意到问题也出现了,因为IE阻止了页面上的脚本并要求我启用它们。当我单击这样做时,它会重新加载页面,这会导致脚本丢失。我现在没有解决这个问题,我正在研究它。答案 0 :(得分:0)
我为此问题创建了一个“修复程序”。我怀疑,问题在于VB代码运行的速度以及IE可以打开页面的速度。
我所做的只是放一个只应在整个页面加载后关闭的MsgBox()
。它的作用就像一个魅力,但留下了“这不是它应该是的方式”的感觉。
我将此作为答案进行分类,因为它确实解决了我的问题,但我希望有更好的解决方案。
谢谢大家的帮助。