我试图在这里自动化一些功能,为了做到这一点,我构建了一个简单的系统:
在本地网页中,您输入所需的所有数据,一旦按下按钮,所有这些数据都会传输到 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
页面会按原样打开,但一旦脚本引擎尝试读取它的就绪状态,它就会失败。
我尝试了多种方法,例如在读取就绪状态(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
尝试获取文档正文时,它会因接口未知错误而失败。我知道这是因为页面没有完全加载,但我不确定,因为在此之前我已经发出了另一个睡眠调用,没有任何变化。
编辑:使用下面的答案,我注意到问题也发生了,因为 IE 正在阻止页面上的脚本并要求我启用它们。当我点击这样做时,它会重新加载页面,这会导致脚本丢失。目前我还没有解决这个问题,我正在研究它。