IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Controle Edge par vba click sur bouton


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut Controle Edge par vba click sur bouton
    Bonjour,
    Je cherche à contrôler Edge avec Excel, sur un ordi pro sur lequel je ne peux rien installer.

    La page sur laquelle je travaille ne pose aucun problème sauf pour des boutons situés dans une sidebar, j'ai tout essayé sans parvenir à rien, je vous donne dans le désordre, ce que j'ai tenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
        ' Clic sur le bouton de validation
     
     
     
    '   Browser.getElementByXPath("//a[@href='" & LIEN & "/']").click
    '   Browser.getElementByCss("a[href='" & LIEN & "/']").click
     
    '
    '    Application.StatusBar = strFormattedMsg
     
    '
       ' <a class="button" href="download-as-zip">Télécharger les fichiers joints</a>
     
    'Browser.getElementByCss("a[href='download-as-zip']").click
     
    'Browser.getElementByCss ("a[href*='download-as-zip']")
     
     
    'Set Links = Browser.getElementsByTagName("a") ' Récupérer tous les liens
    'For i = 0 To Links.length - 1
    '    If InStr(Links(i).href, "download-as-zip") > 0 Then
    '        Set btn = Links(i)
    '        btn.click
    '        Exit For
    '    End If
    'Next i
     
     
    'Set btn = Browser.getElementByCss("a[href*='download-as-zip']")
    'If Not btn Is Nothing Then
    '    Browser.ExecuteScript "arguments[0].click();", btn
    'End If
    'Browser.ExecuteScript "document.evaluate('/html/body/div[3]/aside/div/div[2]/p/a', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();"
    'Browser.ExecuteScript "var link = document.querySelector('/html/body/div[3]/aside/div/div[2]/p/a'); if (link && !link.disabled && link.offsetHeight > 0) { link.click(); }"
    'Browser.getElementByCss("a.button[href*='download-as-zip']").click
    'Browser.ExecuteScript "document.querySelector('aside').style.display = 'block';"
    'Browser.ExecuteScript "document.querySelector('/html/body/div[3]/aside/div/div[2]/p/a').click();"
     
     
    ' Déplier la sidebar
    'Browser.ExecuteScript "document.getElementById('sidebar-toggle').click();"
     
    ' Cliquer sur le lien "Télécharger les fichiers joints"
    'Browser.ExecuteScript "document.querySelector('.sidebar-download-files a').click();"
     
    'Browser.ExecuteScript "var btn = document.querySelector('.sidebar-download-files a');" & _
    '                      "if (btn) { var event = new MouseEvent('click', { 'bubbles': true, 'cancelable': true, 'view': window });" & _
    '                      "btn.dispatchEvent(event); } else { console.log('Bouton non trouvé'); }"
     
    'Browser.ExecuteScript "var btn = document.evaluate('/html/body/div[3]/aside/div/div[2]/p/a', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" & _
    '                      "if (btn) { btn.click(); } else { console.log('Bouton non trouvé'); }"
    'Set btn = Browser.getElementByCss("a.button")
    'If Not btn Is Nothing Then
    '    btn.click
    'End If
     
     
     
     
     
    '    Set btn = Browser.getElementByCss("a.button")
    '
    '' Attendre un peu avant de cliquer pour s'assurer que l'élément est interactif
    'Application.wait (Now + TimeValue("00:00:02")) ' Attend 2 secondes
    '
    'If Not btn Is Nothing Then
    '    btn.click
    '    MsgBox "Bouton cliqué !"
    'Else
    '    'MsgBox "Le bouton n'a pas été trouvé."
    'End If
     
     
     
    'Browser.ExecuteScript "document.querySelector('a.button').click()"
    A noter que, dans la console de l'inspecteur de la page, fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var btn = document.querySelector('.sidebar-download-files a');
    if (btn) { 
        btn.click(); 
    } else { 
        console.log('Bouton non trouvé'); 
    }
    Je précise que le bouton n'a pas d'ID:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    </p></div><div class="extra-context sidebar-download-files"><p><a class="button" href="download-as-zip">Télécharger les fichiers joints</a></p></div><div class="extra-context sidebar-submission-context"><div class="extra-context sidebar--user"><h3>

    Une journée de travail avec ChatGpt, aucun résultat.


    Je vous remercie du coup de main!!!!!!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    L'erreur renvoyée par Excel: propriété non gére par cet objet

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Salut,

    Quelle bibliothèque utilises-tu pour piloter Edge ?

    N'hésites pas à indiquer plusieurs critères de sélection dans ton chemin XPath (exemple: //a[@class='button' and @href='download-as-zip']) afin de t'assurer que tu ne cible qu'un seul et unique élément.
    Tu peux également t'appuyer sur les outils de développement du navigateur, raccourcis: ctrl + maj + i (ou ctrl magie comme moyen mémo technique).
    Inspecte ou sélectionne une élément, puis click droit sur ce dernier ==> Copier ==> Copier XPath.

    Vérifie ce que retourne les fonctions, si elles retournent Nothing, il y a un problème.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Button As Object
    Set Button = Browser.getElementByXPath("//a[@class='button' and @href='download-as-zip']")
    If Not(Button Is Nothing) Then
        '// Continuer le programme
    Else
        '// Probleme !
    End If

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    J'utilise des modules de classe CDP si ça peut commencer à répondre à ta première question.
    Je retrouve le path et reviens sur le forum

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    hello,
    ta sidebar est peut-être dans une "iframe" (à vérifier par l'outil de développement du navigateur) et dans ce cas pour y accéder et accéder aux éléments qui sont dedans il faut faire comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub runIFrame()'--------------------------------------------------------------------------
    ' This example demonstrates the CDP Framework v2.5 getIFrame technique for
    ' accessing iFrame element intuitively, an improvement over 1.0:
    ' 1. The use of App Mode via appUrl argument of the .start method.
    ' 2. The use of getIframe to easily access iFrame elements on the web page.
    ' 3. Working with a complex web design where nested iFrames are employed.
    '--------------------------------------------------------------------------
     
        Dim demoUrl As String
        demoUrl = "https://www.w3schools.com/html/tryit.asp?filename=tryhtml_iframe_height_width"
     
        Dim chrome As New CDPBrowser
        chrome.Start appUrl:=demoUrl, reAttach:=False
     
        Dim iFrame1 As CDPElement
        Dim iFrame2 As CDPElement
        Set iFrame1 = chrome.getElementByID("iframeResult").getIFrame
        Set iFrame2 = iFrame1.getElementByQuery("iframe[title='Iframe Example']").getIFrame
     
        txt = iFrame2.getElementByQuery("h1").innerText
        MsgBox "Retrieved text from the iFrame: """ & txt & """"
     
    End Sub
    Ami calmant, J.P

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Je travaillais en parallèle sur le code et en mixant avec des sendkeys j'arrive presque au but:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Sub OuvrirEdgeEtCliquerAvecDélai()
     
        Dim FullURL As String
        Dim BaseURL As String
        Dim LIEN As String
        Dim j As Integer
        Dim objShell As Object
        Dim objWindow As Object
        Dim windowTitle As String
        Dim objEdge As Object
     
        ' Définir l'URL de base
        BaseURL = "https://XXXX/"
     
        ' Adapter LIEN selon ton besoin
        LIEN = "3239" ' Exemple de lien
        FullURL = BaseURL & LIEN & "/"
     
        ' Lancer Edge via la ligne de commande
        Shell "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe " & FullURL, vbNormalFocus
     
        ' Attendre que Edge soit complètement chargé
        Application.wait (Now + TimeValue("0:00:10")) ' Attendre 20 secondes
     
        ' Créer une instance de Shell pour lister les fenêtres ouvertes
        Set objShell = CreateObject("Shell.Application")
     
        ' Rechercher une fenêtre avec un titre partiel (ici "n°510-3239")
        For Each objWindow In objShell.Windows
            ' Vérifier si l'objet est une fenêtre Edge
            On Error Resume Next
            windowTitle = objWindow.Document.Title
            On Error GoTo 0
     
            ' Si l'objet possède une propriété Title et que celle-ci contient "n°510-3239"
            If windowTitle <> "" And InStr(windowTitle, "n°510-3239") > 0 Then
                ' Si le titre contient "n°XXX", on l'active
                AppActivate windowTitle
                Exit For
            End If
        Next objWindow
     
        ' Attendre un peu pour s'assurer que la fenêtre est bien en focus
        Application.wait (Now + TimeValue("0:00:02"))
     
        ' Simuler 19 fois la touche TAB pour atteindre le bouton
        For j = 1 To 20
        If j <= 19 Then
            Application.sendKeys "{TAB}"
            'Application.wait (Now + TimeValue("0:00:01")) ' Pause de 1 seconde entre chaque TAB
            Else
            For Each objWindow In objShell.Windows
            ' Vérifier si l'objet est une fenêtre Edge
            'For Each objWindow In objShell.Windows
            ' Vérifier si l'objet est une fenêtre Edge
            On Error Resume Next
            windowTitle = objWindow.Document.Title
            On Error GoTo 0
     
            ' Si l'objet possède une propriété Title et que celle-ci contient "n°510-3239"
            If windowTitle <> "" And InStr(windowTitle, "n°XXXX") > 0 Then
                ' Si le titre contient "n°510-3239", on l'active
                AppActivate windowTitle
                Exit For
            End If
        Next objWindow
     
            Application.sendKeys "{ENTER}"
            End If
        Next j
     
     
     
        Application.wait (Now + TimeValue("0:00:05")) ' Pause un peu plus longue avant ENTER
     
        MsgBox "OK"
     
    End Sub
    Fonctionne parfaitement jusqu'au sendkeys ENTER qui résiste. J'ai essayé de remettre le focus sur EDGE avant le ENTER mais rien à faire, je n'ai aucune action à ce niveau là et c'est la dernère marche de ce que je souhaite faire

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Quand je mets le code en pause avec un point d'arrêt juste avant le sendkeys enter, et que j’appuie sur la touche en enter du clavier, ça fonctionne????

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 150
    Par défaut
    Pour le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    Sub OuvrirEdgeEtCliquerAvecDélai()
     
        Dim FullURL As String
        Dim BaseURL As String
        Dim LIEN As String
        Dim j As Integer
        Dim objShell As Object
        Dim objWindow As Object
        Dim windowTitle As String
        Dim objEdge As Object
        Dim hwnd As Long
     
        ' Définir l'URL de base
        BaseURL = "https://XXXX/"
     
        ' Adapter LIEN selon ton besoin
        LIEN = "3239" ' Exemple de lien
        FullURL = BaseURL & LIEN & "/"
     
        ' Lancer Edge via la ligne de commande
        Shell "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe " & FullURL, vbNormalFocus
     
        ' Attendre que Edge soit complètement chargé
        Application.wait (Now + TimeValue("0:00:10")) ' Attendre 20 secondes
     
        ' Créer une instance de Shell pour lister les fenêtres ouvertes
        Set objShell = CreateObject("Shell.Application")
     
        ' Rechercher une fenêtre avec un titre partiel (ici "n°XXXX")
        For Each objWindow In objShell.Windows
            ' Vérifier si l'objet est une fenêtre Edge
            On Error Resume Next
            windowTitle = objWindow.Document.Title
            On Error GoTo 0
     
            ' Débogage : afficher le titre récupéré pour chaque fenêtre
            Debug.Print "Fenêtre : " & windowTitle
     
            ' Si l'objet possède une propriété Title et que celle-ci contient "Colibris"
             If windowTitle <> "" And InStr(windowTitle, "XXXX") > 0 Then
                ' Si le titre contient "Colibris", on l'active
                On Error Resume Next
                ' Utiliser une correspondance partielle pour activer la fenêtre
                ' Remplacer par une sous-chaîne plus simple si nécessaire
                AppActivate windowTitle  ' Cherche exactement le titre complet
                If Err.Number <> 0 Then
                    MsgBox "Erreur d'activation de la fenêtre: " & windowTitle
                    Debug.Print "Erreur: " & Err.Description
                    Err.Clear
                Else
                    Debug.Print "Fenêtre activée: " & windowTitle
                End If
                Exit For ' Sortir de la boucle lorsque la fenêtre est trouvée
            End If
        Next objWindow
     
        ' Attendre un peu pour s'assurer que la fenêtre est bien en focus
        Application.wait (Now + TimeValue("0:00:02"))
     
        ' Simuler 19 fois la touche TAB pour atteindre le bouton
        For j = 1 To 20
        If j <= 19 Then
            Application.sendKeys "{TAB}"
            'Application.wait (Now + TimeValue("0:00:01")) ' Pause de 1 seconde entre chaque TAB
            Else
            For Each objWindow In objShell.Windows
            ' Vérifier si l'objet est une fenêtre Edge
            On Error Resume Next
            windowTitle = objWindow.Document.Title
            On Error GoTo 0
     
            ' Débogage : afficher le titre récupéré pour chaque fenêtre
            Debug.Print "Fenêtre : " & windowTitle
     
            ' Si l'objet possède une propriété Title et que celle-ci contient "XXXX"
             If windowTitle <> "" And InStr(windowTitle, "XXXX") > 0 Then
                ' Si le titre contient "XXXX", on l'active
                On Error Resume Next
                ' Utiliser une correspondance partielle pour activer la fenêtre
                ' Remplacer par une sous-chaîne plus simple si nécessaire
                AppActivate windowTitle  ' Cherche exactement le titre complet
                If Err.Number <> 0 Then
                    MsgBox "Erreur d'activation de la fenêtre: " & windowTitle
                    Debug.Print "Erreur: " & Err.Description
                    Err.Clear
                Else
                    Debug.Print "Fenêtre activée: " & windowTitle
     
     
                      'Vérification si la fenêtre est bien activée
                                            hwnd = FindWindow2(vbNullString, windowTitle)
                                            If hwnd <> 0 And IsWindow(hwnd) Then
                                            Application.sendKeys "{ENTER}"
     
                                            Application.wait (Now + TimeValue("0:00:05")) ' Pause un peu plus longue avant ENTER
     
                                        Else
                                            MsgBox "La fenêtre n'est pas active"
                                        End If
     
     
     
     
                End If
                Exit For ' Sortir de la boucle lorsque la fenêtre est trouvée
            End If
        Next objWindow
     
         End If
     
     
        Next j
     
     
     
     
        MsgBox "OK"
     
    End Sub
    J'obtiens les debug.print suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Fenêtre : 
    Fenêtre : 
    Fenêtre : 
    Fenêtre : 
    Fenêtre : 
    Fenêtre : XXXX
    Erreur: Argument ou appel de procédure incorrect
    Fenêtre : XXXX
    Erreur: Argument ou appel de procédure incorrect
    Si je ne passe pas par AppActivate pour arriver aux sendkeys TAB, ils passent mais pas le sendkeys ENTRE si je passe par le appactivate, ça plante...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] [UWP] Ajouter un controle via un click sur bouton
    Par Ledidic dans le forum VB.NET
    Réponses: 5
    Dernier message: 04/02/2017, 21h35
  2. [XL-2003] Lancer/lire une vidéo par click sur bouton
    Par sharox dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/01/2016, 08h48
  3. [PPT-2007] Enettre un son par un click sur un bouton ET aller sur une diapositive
    Par Carlos31 dans le forum Powerpoint
    Réponses: 2
    Dernier message: 27/11/2014, 15h41
  4. [AC-2003] simuler click sur bouton dans "on exit" d'un controle
    Par tchayapluk dans le forum IHM
    Réponses: 0
    Dernier message: 16/11/2009, 06h18
  5. click sur bouton ou changer dossier explorer
    Par nek_kro_kvlt dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 10/03/2005, 21h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo