在 MS Access 表单上使用 VBA 时如何防止多个 IE 窗口

问题描述

我在 Access 表单中添加一个按钮,用于从机密 Web 应用程序生成图像。该 URL 包含一个年份下拉字段、一个 SFN 文本框(与年份组合时为六位唯一 ID)和一个用于搜索图像的按钮。使用表单中当前列出的记录中的值,下面的代码成功地填充了年份下拉字段,并且似乎正确地填充了 SFN 字段;一个六位数的字符串出现在框中。但是,每次按下按钮时,代码都会打开一个新窗口。我希望代码要么先关闭旧窗口,要么在已经打开的窗口中填充新值。

VBA 不是我的专业领域。我感谢任何输入。

Private Sub IMAGED_Click()

    Set browser = CreateObject("InternetExplorer.Application")
    browser.navigate ("https://www.confidentialWebApp.com")
    browser.StatusBar = False
    browser.Toolbar = False
    browser.Visible = True
    browser.Resizable = False
    browser.AddressBar = True

    Dim yearVal As String
    Dim SFNVal As String
    yearVal = Mid(B_SFN,4,4)
    SFNVal = Mid(B_SFN,8,6)

    browser.Document.getElementById("YearListBox").Value = yearVal
    browser.Document.getElementById("SFN_TextBox").Value = SFNVal
    browser.Document.getElementById("ImagedisplayButton").Click

End Sub

解决方法

通过将浏览器声明为公共对象变量来处理,然后尝试在过程中退出它并在它未打开时处理错误。有时有助于代码等待浏览器加载后再尝试访问元素,尽管在您的情况下这似乎没有必要。

Public browser As InternetExplorer
________________________________________

Sub IMAGED_Click()
On Error Resume Next
browser.Quit
Set browser = CreateObject("InternetExplorer.Application")
With browser
    .Navigate ("https://www.confidentialWebApp.com")
    .StatusBar = False
    .Toolbar = False
    .Visible = True
    .Resizable = False
    .AddressBar = True
    Do
        'Wait till the Browser is loaded
    Loop Until .ReadyState = READYSTATE_COMPLETE
    .Document.getElementById("YearListBox").Value = Mid(B_SFN,4,4)
    .Document.getElementById("SFN_TextBox").Value = Mid(B_SFN,8,6)
    .Document.getElementById("ImageDisplayButton").Click
End With
End Sub

另一个版本的等待:

While .Busy
    DoEvents
Wend

或者不是退出并处理错误,而是测试浏览器是否存在。

If browser Is Nothing Then
'code to set browser
End If

请注意,如果代码在运行中终止,全局/公共变量会失去价值,比如在运行时错误期间发生的情况。

需要某种方式在工作会话完成后将浏览器设置为“无”。如果所有代码都在表单后面,那么关闭表单应该清除对象变量。如果代码在通用模块中,则需要显式清除变量,甚至可能退出 IE,可能在窗体关闭事件中:

If Not browser Is Nothing Then
    browser.Quit
    Set browser = Nothing
End If