VBA - Excel - Очистка веб-сайта с использованием IE - Как избежать бесконечных циклов, когда пользователь закрывает приложение IE, пока я ожидаю готовности? - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь получить доступ к внутренней веб-странице, требующей аутентификации. Как только пользователь войдет в систему правильно, я ищу указанный шаблон c на веб-странице приложения и включаю 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

1 Ответ

0 голосов
/ 30 апреля 2020

Я понимаю, что ваш код запускает IE и делает его видимым, чтобы пользователь мог завершить sh процесс входа в систему, а затем после выполнения какого-либо кода вы делаете IE видимым false.

Вы сказали, что если пользователь закрывает окно IE вручную во время аутентификации, тогда ваш код теряет управление.

Есть несколько подходов, которые вы можете попробовать решить эту проблему.

Вы можете попробовать запустить браузер IE в режиме в полноэкранном режиме . Поэтому он не будет отображать элементы управления окна браузера и кнопку закрытия.

Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.FullScreen = True

Обратите внимание, что при таком подходе пользователь может использовать клавишу ALT + TAB для переключения окна, а затем пользователь может попытаться закрыть это вручную.

Еще одна вещь, которую вы можете попробовать, - использовать событие OnQuit .

Событие OnQuit сработает, когда браузер IE закроется. Таким образом, вы можете попытаться установить для объектов значение Nothing в этом событии или предпринять необходимые шаги для сброса кода. Таким образом, вы можете сохранить контроль над кодом.

Для реализации события OnQuit вы можете обратиться к приведенным ниже шагам.

  1. Создать модуль Class с именем cls IE.

enter image description here

Добавьте приведенный ниже код в модуль класса.

Параметр Явный

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

Создайте новый модуль и добавьте в него код ниже.

enter image description here

 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

...