问题描述
我在 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