通过VBScript在Internet Explorer中打开本地页面

时间:2013-11-11 12:48:23

标签: excel internet-explorer vbscript automation

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

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

1 个答案:

答案 0 :(得分:0)

我为此问题创建了一个“修复程序”。我怀疑,问题在于VB代码运行的速度以及IE可以打开页面的速度。

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

我将此作为答案进行分类,因为它确实解决了我的问题,但我希望有更好的解决方案。

谢谢大家的帮助。