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事件。

  1. 创建一个名为 clsIE 的 Class 模块。

  1. 在 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
    
  2. 创建一个新模块并在其中添加以下代码。

 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 浏览器,那么它会显示一条消息。此外,您可以尝试根据您的要求修改代码。

参考:

Code in IE's Close event