Ошибка времени выполнения VBA '91' - переменная объекта или переменные блока не установлены - IE Ошибка нажатия кнопки - PullRequest
0 голосов
/ 23 марта 2020

Мне нужна помощь с моим сценарием, пожалуйста. Я новичок в VBA, и я написал следующий код для загрузки веб-страницы intr anet и входа в систему. Следующим шагом после входа в систему является нажатие одной из нескольких кнопок на веб-странице. Однако я получаю ошибку времени выполнения 91 из последней строки кода, выделенного жирным шрифтом ниже (IE1.document.getElementById ("btnAddPerson"). Click).

Не могли бы вы сказать мне, что здесь не так, пожалуйста?

Спасибо.

С уважением, Майкл Т

Public Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long

Option Explicit
Private Declare Function ShowWindow _
Lib "user32" _
(ByVal HWND As Long, _
ByVal nCmdShow As Long) _
As Long

Function IEWindowFromTitle(sTitle As String) As SHDocVw.InternetExplorer

    Dim objShellWindows As New SHDocVw.ShellWindows
    Dim win As Object, rv As SHDocVw.InternetExplorer

    For Each win In objShellWindows
        If TypeName(win.document) = "HTMLDocument" Then
            If UCase(win.document.Title) = UCase(sTitle) Then
                Set rv = win
                Exit For
            End If
        End If
    Next

    Set IEWindowFromTitle = rv

End Function
Sub Test1()

'Login into IE

    Dim IE As Object
    Dim IE1 As Object
    Dim doc As HTMLDocument
    Dim btn As HTMLButtonElement
    Dim MyHTML_Element As IHTMLElement
    Dim MyHTML_Element1 As IHTMLElement
    Set IE = CreateObject("InternetExplorer.Application")
    Set IE1 = CreateObject("InternetExplorer.Application")

    IE.Visible = True
    IE.navigate "https://some_intranet_url/1" 

    Do While IE.Busy

         ShowWindow IE.HWND, 3
        Application.Wait DateAdd("s", 1, Now)


    Loop

    Set doc = IE.document

   doc.getElementById("username").Value = "some_username"
   doc.getElementById("password").Value = "some_password"

   'Click to Login
    For Each MyHTML_Element In doc.getElementById("loginForm")
    If MyHTML_Element.Type = "submit" Then MyHTML_Element.Click: Exit For
Next


Do While IE.Busy

         ShowWindow IE.HWND, 3
        Application.Wait DateAdd("s", 1, Now)


    Loop
    'Selct role
    doc.getElementById("selectedRole").Value = "555885740104"

    'Click to Login
    doc.getElementById("button1").Click

        'Click to add person


  Do While IE.Busy

        ' ShowWindow IE.HWND, 3
        Application.Wait DateAdd("s", 1, Now)


'Set page to be fully loaded
    Loop

    Do While IE.readyState <> READYSTATE_COMPLETE
    DoEvents
Loop

    IE1.Visible = True
 IE1.navigate "https://some_intranet_url/2" 



    Do While IE1.Busy

         ShowWindow IE1.HWND, 3
        Application.Wait DateAdd("s", 1, Now)


    Loop

     Do While IE.readyState <> READYSTATE_COMPLETE
    DoEvents
Loop

 **IE1.document.getElementById("btnAddPerson").Click**



End Sub

1 Ответ

0 голосов
/ 23 марта 2020

На основе вашего кода я создал образец с использованием следующего кода, он хорошо работает на моей стороне, вы также можете проверить его.

Function IEWindowFromTitle(sTitle As String) As SHDocVw.InternetExplorer

    Dim objShellWindows As New SHDocVw.ShellWindows
    Dim win As Object, rv As SHDocVw.InternetExplorer

    For Each win In objShellWindows
        If TypeName(win.Document) = "HTMLDocument" Then
            If UCase(win.Document.Title) = UCase(sTitle) Then
                Set rv = win
                Exit For
            End If
        End If
    Next

    Set IEWindowFromTitle = rv

End Function
Sub Test1()

'Login into IE

    Dim IE As Object
    Dim IE1 As Object
    Dim doc As HTMLDocument
    Dim btn As HTMLButtonElement
    Dim MyHTML_Element As IHTMLElement
    Dim MyHTML_Element1 As IHTMLElement
    Set IE = CreateObject("InternetExplorer.Application")
    Set IE1 = CreateObject("InternetExplorer.Application")

    IE.Visible = True
    IE.Navigate "https://www.google.com/"

    Do While IE.Busy

         'ShowWindow IE.Hwnd, 3
        Application.Wait DateAdd("s", 1, Now)
    Loop

    Set doc = IE.Document

    'Click to Login

    Do While IE.Busy

         'ShowWindow IE.Hwnd, 3
        Application.Wait DateAdd("s", 1, Now)
    Loop


    Do While IE.Busy

        ' ShowWindow IE.HWND, 3
        Application.Wait DateAdd("s", 1, Now)

    'Set page to be fully loaded
    Loop

    Do While IE.ReadyState <> READYSTATE_COMPLETE
        DoEvents
    Loop

    IE1.Visible = True
    IE1.Navigate "https://www.bing.com/"

    Do While IE1.Busy

         'ShowWindow IE1.Hwnd, 3
        Application.Wait DateAdd("s", 1, Now)

    Loop

    Do While IE1.ReadyState <> READYSTATE_COMPLETE
        DoEvents
    Loop

    IE1.Document.getElementById("sb_form_q").Value = "vba"
    IE1.Document.getElementById("sb_form_go").Click

End Sub

Поскольку я не могу воспроизвести вашу проблему, Я предлагаю вам обратиться к следующим шагам, чтобы сузить проблему и попытаться ее решить.

   IE1.Visible = True
 IE1.navigate "https://some_intranet_url/2" 
    Do While IE1.Busy
         ShowWindow IE1.HWND, 3
        Application.Wait DateAdd("s", 1, Now)
    Loop
     Do While IE.readyState <> READYSTATE_COMPLETE
    DoEvents
Loop

 **IE1.document.getElementById("btnAddPerson").Click**

Сначала, пожалуйста, проверьте приведенный выше код, после перехода на другую страницу, мы должны подождать " IE1 "экземпляр завершен, вместо" IE "экземпляр. Пожалуйста, попробуйте изменить код, как показано ниже:

IE1.Visible = True
IE1.Navigate "https://www.bing.com/"

Do While IE1.Busy

     'ShowWindow IE1.Hwnd, 3
    Application.Wait DateAdd("s", 1, Now)

Loop

Do While IE1.ReadyState <> READYSTATE_COMPLETE
    DoEvents
Loop

Во-вторых, после успешной навигации, пожалуйста, проверьте окно фокуса и используйте инструменты разработчика F12, чтобы проверить ресурс сайта, убедитесь, что вы можете найти кнопку "btnAddPerson" .

Кроме того, вот статья об ошибке VBA 91, на которую можно ссылаться:

Переменная объекта не установлена ​​(Ошибка 91)

...