我正在尝试访问需要身份验证的内部网页。用户正确登录后,我将在应用程序网页中查找特定模式,然后将IE.visible = False设置为。我设法使其正常工作,但是如果由于某种原因用户在身份验证完成之前关闭了IE窗口,则我的宏就会失去控制权并永远等待答复。有什么办法可以防止它发生?这是我的代码:
Sub myapplication()
Dim IE As New InternetExplorerMedium
Dim elements As MSHTML.IHTMLElementCollection: Dim element As MSHTML.IHTMLElement
Dim URL As String: Dim flag As Boolean
logindate = Format(Date, "dd mmm yyyy"): clockon = Timer: delay = 10
URL = "http://app1.htm"
IE.Visible = True: IE.navigate URL
Do While IE.readyState <> READYSTATE_COMPLETE Or IE.Busy
Loop
Set HTMLDoc = IE.document
Set elements = HTMLDoc.getElementsByClassName("normalText")
flag = False
While flag = False
For Each element In elements
If InStr(element.innerHTML, logindate) Then
IE.Visible = False: flag = True
Exit For
End If
clockoff = Timer
If delay > clockoff - clockon Then flag = True
Next
Wend
End Sub
[我了解您的代码将启动IE并将其显示为可见,以便用户可以完成登录过程,然后在执行某些代码后将IE显示为false。
您说过,如果用户在身份验证过程中手动关闭IE窗口,则您的代码将失去控制。
有几种方法可以尝试解决此问题。
您可以尝试在全屏中启动IE浏览器。因此它不会显示任何浏览器窗口控件和关闭按钮。
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.FullScreen = True
请注意,通过这种方法,用户可以使用ALT + TAB键切换窗口,然后用户可以尝试手动将其关闭。
您可以尝试的另一种方法是使用OnQuit event。
OnQuit事件将在IE浏览器关闭时触发。因此,您可以尝试在此事件上将对象设置为Nothing,或采取必要的步骤来重置代码。这样,您可以控制代码。
您可以参考下面的步骤来实现OnQuit事件。
[在类模块中添加以下代码。
选项显式
Public WithEvents IE As InternetExplorer
Private Sub Class_Initialize()
Set IE = New InternetExplorer
End Sub
Private Sub Class_Terminate()
Set IE = Nothing
End Sub
Private Sub Ie_OnQuit()
MsgBox "Closed now"
End Sub
创建一个新模块,并在下面添加代码。
Option Explicit
Dim objApp As clsIE
Sub Tester()
'// Ivan F Moala
Set objApp = New clsIE
With objApp
.IE.FullScreen = True
.IE.Visible = True
.IE.Navigate ("http://example.com")
End With
End Sub
现在,如果您运行模块并尝试手动关闭IE浏览器,它将显示一条消息。此外,您可以尝试根据您的要求修改代码。
参考: