Exécutez mon code VBA à partir d'une page Internet Explorer existante (ouverte)

Sep 26 2020

Je voudrais exécuter ma macro VBA sur une page Internet Explorer spécifique que j'ai déjà ouverte et connectée .

C'est parce que je dois d'abord me connecter à mon compte et contourner le code captcha. Je dois envoyer ce message extrêmement répétitif à plus de deux cents personnes au cours de l'année.

Le problème avec ce qui suit est que j'ouvre une toute nouvelle page et que je ne pourrai pas contourner le captcha.

Dim IE As InternetExplorer

  Set IE = CreateObject("InternetExplorer.Application")

  IE.navigate ("website")

  IE.Visible = True

End Sub

Solution

Sub TestGetIE()

    Dim IE As Object
    
    'GetIE runs the Functoin we have created below
    Set IE = GetIE("website opened in IE here ")
    WaitFor IE

end sub 

Function GetIE(sLocation As String) As Object

Dim objShell As Object, objShellWindows As Object, o As Object
Dim sURL As String
Dim retVal As Object

    Set retVal = Nothing
    Set objShell = CreateObject("Shell.Application")
    Set objShellWindows = objShell.Windows

    For Each o In objShellWindows
    'Loop through all the opened internet explorer pages
        sURL = ""
        'Loops through all the pages opened on internet explorer
        'Then we will tell our macro to work on that page
        sURL = o.LocationURL
        If sURL Like sLocation & "*" Then
            Set retVal = o
            Exit For
        End If
    Next o

    Set GetIE = retVal
    

End Function

Réponses

KNAPPYFLASH Sep 26 2020 at 23:18

Une chose que vous pouvez faire est de DoEvents jusqu'à ce qu'un certain élément soit présent sur la page. Exécutez votre code pour accéder au site Web, puis faites jusqu'à l'élément après captcha est présent DoEvents. Le code boucle jusqu'à ce que vous soyez connecté au site Web. J'aime utiliser VBA SeleniumBasic ChromeDriver sur GetHub. Cela facilite considérablement la mise au rebut du Web et vous n'avez pas besoin d'utiliser Internet Explorer.

Deepak-MSFT Sep 28 2020 at 09:37

D'après votre description, je comprends que vous souhaitez que l'interaction de l'utilisateur remplisse le captcha, puis que vous souhaitez continuer à automatiser la même page.

Je vous suggère pour les deux étapes d'essayer d'utiliser 2 modules différents et d'utiliser le même objet IE dans les deux modules.

Vous pouvez créer un objet IE global que vous pouvez utiliser dans les deux modules.

Ensuite, pour la partie connexion, exécutez le premier module.

Après cela, l'utilisateur remplira le captcha manuellement.

Exécutez ensuite le deuxième module pour automatiser le reste de la page.

Exemple de code:

Public ie As Object

Sub login()

    Set ie = CreateObject("internetexplorer.application")
    ie.Visible = True
    ie.navigate "Your_web_site_URL_here..."
    
     Do While ie.Busy
        Application.Wait DateAdd("s", 1, Now)
    Loop
    
    ie.document.getElementById("uname").Value = "user1"
    ie.document.getElementById("pswd").Value = "12345"
    
End Sub

Sub second_part()
   ie.document.getElementById("email").Value = "[email protected]"
   ie.document.getElementById("age").Value = "30"
End Sub

Code UserForm1:

Private Sub CommandButton1_Click()
Call Module1.login
End Sub

Private Sub CommandButton2_Click()
Call Module1.second_part
End Sub

Production:

jonathan Sep 29 2020 at 08:58

Faire appel à cette fonction m'a aidé à le résoudre.

Function GetIE(sLocation As String) As Object

Dim objShell As Object, objShellWindows As Object, o As Object
Dim sURL As String
Dim retVal As Object

    Set retVal = Nothing
    Set objShell = CreateObject("Shell.Application")
    Set objShellWindows = objShell.Windows

    For Each o In objShellWindows
    'Loop through all the opened internet explorer pages
        sURL = ""
        'Loops through all the pages opened on internet explorer
        'Then we will tell our macro to work on that page
        sURL = o.LocationURL
        If sURL Like sLocation & "*" Then
            Set retVal = o
            Exit For
        End If
    Next o

    Set GetIE = retVal
    

End Function