0

我试图在这里自动化一些功能,为了做到这一点,我构建了一个简单的系统:

在本地网页中,您输入所需的所有数据,一旦按下按钮,所有这些数据都会传输到 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 正在阻止页面上的脚本并要求我启用它们。当我点击这样做时,它会重新加载页面,这会导致脚本丢失。目前我还没有解决这个问题,我正在研究它。

4

1 回答 1

0

我已经为这个问题创建了一个“修复”。正如我所怀疑的,问题在于VB代码运行的速度和IE打开页面的速度。

我所做的只是简单地放置一个MsgBox()只有在整个页面加载后才应该关闭的内容。它就像一个魅力,但留下了“这不是它应该是的方式”的感觉。

我将其归类为答案,因为它确实解决了我的问题,但我希望有一个更好的解决方案。

谢谢大家的帮助。

于 2013-11-12T11:00:29.313 回答