VBA - Excel - 使用 IE 抓取网站 - 当我在等待就绪状态时用户关闭 IE 应用程序时如何避免永远循环?
VBA - Excel - Scraping website using IE - How to avoid forever loops when user close IE application while I'm waiting for readystate?
我正在尝试访问需要身份验证的内部网页。用户正确登录后,我会在应用程序网页中查找特定模式并将 IE.visible = False。我设法让它工作,但如果用户出于任何原因在身份验证完成之前关闭 IE window,我的宏就会失去控制并永远等待答案。
有什么办法可以防止它发生吗?
这是我的代码:
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。
你说如果用户在认证过程中手动关闭IEwindow那么你的代码就会失去控制。
您可以尝试多种方法来解决此问题。
您可以尝试在 全屏 模式下启动 IE 浏览器。所以它不会显示任何浏览器 window 控件和关闭按钮。
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.FullScreen = True
注意,使用此方法,用户可以使用ALT + TAB键切换window,然后用户可以尝试手动关闭它。
您可以尝试的另一件事是使用 OnQuit event.
当 IE 浏览器关闭时,将触发 OnQuit 事件。因此,您可以尝试在此事件中将对象设置为 Nothing 或采取必要的步骤来重置您的代码。这样,您就可以保持对代码的控制。
您可以参考以下步骤实现OnQuit事件。
- 创建一个名为 clsIE 的 Class 模块。
在 class 模块中添加以下代码。
选项显式
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 浏览器,那么它会显示一条消息。此外,您可以尝试根据您的要求修改代码。
参考:
我正在尝试访问需要身份验证的内部网页。用户正确登录后,我会在应用程序网页中查找特定模式并将 IE.visible = False。我设法让它工作,但如果用户出于任何原因在身份验证完成之前关闭 IE window,我的宏就会失去控制并永远等待答案。 有什么办法可以防止它发生吗? 这是我的代码:
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。
你说如果用户在认证过程中手动关闭IEwindow那么你的代码就会失去控制。
您可以尝试多种方法来解决此问题。
您可以尝试在 全屏 模式下启动 IE 浏览器。所以它不会显示任何浏览器 window 控件和关闭按钮。
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.FullScreen = True
注意,使用此方法,用户可以使用ALT + TAB键切换window,然后用户可以尝试手动关闭它。
您可以尝试的另一件事是使用 OnQuit event.
当 IE 浏览器关闭时,将触发 OnQuit 事件。因此,您可以尝试在此事件中将对象设置为 Nothing 或采取必要的步骤来重置您的代码。这样,您就可以保持对代码的控制。
您可以参考以下步骤实现OnQuit事件。
- 创建一个名为 clsIE 的 Class 模块。
在 class 模块中添加以下代码。
选项显式
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 浏览器,那么它会显示一条消息。此外,您可以尝试根据您的要求修改代码。
参考: