Cliquer sur un lien internet si certaines conditions sont réunis

Bonjour,

J'aimerai pouvoir éditer les informations concernant différentes personnes sur un réseau intranet.

J'ai toutes les infos dont j'ai besoin sur un tableau et j'aimerai automatiser la navigation jusqu'à la personne.
Il me reste donc un dernier lien sur lequel cliqué !

Voilà ce que je pense utiliser comme code :

    Dim strNom, strPrenom, strDDN as String

    Set idoc = IE.Document                                                                  
    Set ElementCol = idoc.getElementsByTagName("img")                                       

            For Each Link In ElementCol                                                    
            If Link.getAttribute("alt") = "Edit" Then                                  
            Link.Click
                Exit For
            End If
            Next Link

Par contre, ce code va cliquer sur le premier "Edit" et moi j'aimerai que ca clique sur celui dont le "Nom" est identique à "strNom", "Prénom" identique à "strPrenom" et "DDN" identique à "strDDN"

J'ai essayé sans succès d'utiliser [innerHTML] mais je dois mal m'y prendre...

Merci d'avance

Bonjour sartou,

Voici une tentative à l'aveugle en attendant meilleure réponse (de Steelson peut-être ? ).

Sub PourMiseEnformeCode()

Dim strNom$, strPrenom$, strDDN as String 'le type n'est pas factorisable (à mettre derrière chaque variable :(  )

with IE
    Set idoc = .Document
    with idoc                                                                  
        Set ElementCol = .getElementsByTagName("td")                                      
        For Each elem In ElementCol                                                    
            If ucase(elem.outertext) like "*" & ucase(strNom) & "*" Then 'ou outerhtml                                 
                elem.Click
                Exit For
            End If
        Next elem
    end with
end with

Cdlt,

Bonjour et merci beaucoup pour ton aide.

Malheureusement cela ne fonctionne pas.
La page juste avant celle ou se trouvent les personnes se présente de la même façon à part que j'ai juste un numéro de référence à comparer. (C'est ici que j'ai fais mes test et essayé de modifier le code pour que cela fonctionne)

En rajoutant des MsgBox pour vérifier si Excel trouvait le code ref j'ai pu voir que le code trouve bien le numéro de référence mais il ne clique pas dessus car seul l'image "Edit" permet le click.

J'ai alors essayé ça mais sans succès :

    Dim strRef As String
    strRef = Range("M2")

    Set idoc = IE.Document                                                                 
    Set ElementCol = idoc.getElementsByTagName("img")                                       
    Set ElementCol2 = idoc.getElementsByTagName("td")

            For Each Link In ElementCol
                For Each elem In ElementCol2                                                   
                    If Link.getAttribute("alt") = "Edit" & UCase(elem.outerText) Like "*" & UCase(strRef) & "*" Then                                
                        Link.Click
                            Exit For
                    End If
                Next elem
            Next Link

(Si je retire, dans le IF, ce qui se trouve après le &, le programme click sur le premier Edit)
(Si je retire, dans le IF, ce qui se trouve avant le &, je pense que le programme click dans le vide car je ne change pas de page)

Merci encore

Bonjour sartou,

Petite question : tu as masqué la ligne href ! Pourquoi ? Si cette ligne contient des infos remarquables, ce peut être la solution :

Sub PourMiseEnformeCode()

Dim strNom$, strPrenom$, strDDN as String 'le type n'est pas factorisable (à mettre derrière chaque variable :(  )

with IE
    Set idoc = .Document
    with idoc                                                                  
        Set ElementCol = .getElementsByTagName("a") '
        For Each elem In ElementCol                                                    
            If ucase(elem.href) like "*" & ucase(strNom) & "*" Then                           
                elem.Click
                Exit For
            End If
        Next elem
    end with
end with

Cdlt,

La dernière solution a parfaitement fonctionné pour la page précédente.

En effet, le code reference se trouvait dans la ligne href.

Pour la page suivante malheureusement le HREF ne comporte que des combinaisons de chiffre+lettre.

En regardant le code HTML de plus pres j'ai pu voir que toutes les informations sur chaque personne font l'objet d'une seule ligne (TR).

Public alt As MSHTML.IHTMLElementCollection
Public tr As MSHTML.IHTMLElementCollection
Public trObj As MSHTML.HTMLGenericElement
Public altObj As MSHTML.HTMLGenericElement  

Set idoc = IE.Document
    Set tr = idoc.getElementsByTagName("tr")
        For Each trObj In tr
           If UCase(trObj.innerHTML) Like "*" & UCase(strNom) & "*" Then
                GoTo Findtr

                Else: GoTo NotFindtr

               End If
      Next trObj         

Findtr:
                Set alt = trObj.getElementsByTagName("a")
                    For Each altObj In alt
                            If altObj.innerHTML = "Edit" Then
                                altObj.Click
                                    Exit For
                            End If

                  Next altObj
     

Alors j'éssaie quelque chose comme ca : L'idée serait de chercher dans chaque ligne laquelle contiendrait le NOM / PRENOM / DDN.

Une fois trouvé, créer une nouvelle collection ou rechercher : trObj.getElementsByTagName("a") afin de cliquer sur l'image : "Edit"

Alors, soit ce n'est pas possible de faire comme ca soit je m'y prend mal car le code ne trouve rien dans "tr"...

En tout cas Merci pour la dernière idée,

Le moment qui me sépare de la fin de mon code vient de passer de 2 fenêtre a une.

Oui, en fait, je crois que les tr marquent les lignes d'un tableau html. Est-ce que chaque ligne comporte une image/lien ?

Le second "getelements" est une bonne idée mais je ne sais pas si cette méthode marche sur une collection ou si elle est propre au document HTML. Ca pourrait être la voie royale !

En attendant, si tu arrivais à trouver le nom, par exemple, sur une des propriétés d'un élément tr (outerhtml, outertext je dirais), on pourrait essayer de cibler le lien ainsi :

Set idoc = IE.Document
Set tr = idoc.getElementsByTagName("tr")
For Each trObj In tr
    If UCase(trObj.outerhtml) Like "*" & UCase(strNom) & "*" Then
        trObj.links(1).click 'ou .links(0)
        exit for   
    End If
Next trObj         

Je suis pas vraiment convaincu mais ce serait l'idée.

Est-ce que tu marques des points d'arrêts et exécutes le code qui coince au pas à pas (touche F8) ? En faisant ça, tu peux regarder dans la fenêtre variables locales les variables. Tu pourrais alors t'attarder sur les propriétés de trObj et trouver la condition manquante...

Edit : Que produit le clic sur l'image ? Un changement de page ? Une nouvelle fenêtre ? Au cas où (même si je pense que tu le sais) en cas de changement de page, il faut réaffecter l'objet document donc refaire un set idoc = IE.Document, si possible en attendant que la page soit totalement chargée et avec une petite temporisation.

Cdlt,

Oui, une seule par ligne.
J'ai créé un dossier avec de faux noms...

J'avais oublié un {Loop while IE.Busy}...
Sinon la ligne : { trObj.links(1).click 'ou .links(0)} ne veut pas fonctionnert

Le problème de mon code :

    Set idoc = IE.Document
    Set tr = idoc.getElementsByTagName("tr")

        For Each trObj In tr
             If UCase(trObj.innerHTML) Like "*" & UCase(strNom) & "*" Then
                MsgBox "FIND"
                Set alt = trObj.getElementsByTagName("a")
                    For Each altObj In alt
                            If altObj.outerHTML = "Edit" Then
                                altObj.Click
                                    Exit For
                            End If

                Next altObj
            End If
        Next trObj

Il trouve finalement 5 "JAMES" car la ligne <TR> JAMES est incluse dans 4 autres lignes <TR>.
Mais il ne clique pas plus sur un des deux "Edit"...

Si je comprends bien, pour chaque TR, il y a 11 éléments dont le premier est le lien (attribut headers = " ") ?

Il faut que je fasse des essais car ça fait longtemps mais il y a peut-être de quoi faire :

Set idoc = IE.Document
Set tr = idoc.getElementsByTagName("tr")

        For i = 1 to In tr.length
             If UCase(tr(i).innerHTML) Like "*" & UCase(strNom) & "*" Then
                MsgBox "FIND"
                tr(i-1).click 'Clic sur l'élément avant le nom, soit l'image
                exit for
            end if
        next i

J'imagine qu'il n'est pas possible pour moi de faire des essais sur le site directement ?

Non malheureusement ce n'est pas possible car il faut etre connecté directement sur le réseau depuis les locaux.

Mais oui il y a 11 éléments dont le premier est "headers". Celui ci se décompose alors en " <a href> et <img alt="Edit"> (comme sur ma première image)
Le dernier code trouve bien le nom mais il ne clique pas sur l'image. je ne sais pas ou il clique..
Au moins cette fois ci ca ne trouve qu'un seul nom !

Il faut que tu mettes un point d'arrêt sur la ligne msgbox "FIND" et que tu inspectes la variable tr (et son item i notamment) au moment de l'arrêt. Tu pourras essayer de regarder les autres collections (.links par exemple) de cet item i pour essayer d'y trouver l'image et le fameux href correspondant.

C'est difficile pour moi en l'état de m'avancer plus. A part remplacer tr(i-1).click par tr(i-1).links(1).click (ou links(0)), je n'ai pas vraiment d'idée.

Je pense avoir compris pourquoi ca ne clique pas sur le bon.

Le match se fait pour i=1 alors que dans ce cas présent il devrait se faire pour i=5.
En effet la dernière ligne TR (Celle ou est l'image) se trouve dans 4 autres lignes TR

Aussi j'ai enlevé le IN dans le code suivant

For i = 1 to In tr.length

J'imagine que c'était une erreur de frappe ?

Oui, une faute d'inattention sûrement, j'ai dû copier ta boucle for each pour la modifier mais j'ai laissé un petit cadeau...

J'espère que tes prochains essais seront concluants ! Je sens que ça ne va pas tarder à force de persévérance !

Merci

J'avais 30lignes <TR> alors j'ai essayé une par une avec le code mais ca ne fonctionne pas.

Par contre, dans tout le code HTML de la page , le code suivant n'est assigné que aux personnes : (Dans un cas avec 3personnes, je l'ai donc que 3fois)

<img alt="Edit" src="/i/ed-item.gif">

Etant donné que c'est ici qu'il faut cliquer, je me demandai si il ne serait pas finalement plus simple de prendre le probleme à l'envers :

Chercher alt="Edit" puis vérifier si les nom / prénom et date de naissance sont présent dans la dernière ligne TR qui le contient.
Si oui, cliquer !

Re sartou,

Oui, finalement un retour à l'idée de départ s'impose en attendant de trouver une méthode plus générale.

Et as-tu déjà essayé set coll = idoc.getelementsbytagname("img"). Puis coll(1).click, coll(2).click, coll(3).click ? Pour voir si ça marche de cette manière...

Si le clic se réalise, tu sauras que tu as trouvé le bon élément. Tu pourras marquer un point d'arrêt avant de cliquer et inspecter cet élément, en exécutant au pas à pas détaillé, pour trouver la propriété qu'il te manque !

Rechercher des sujets similaires à "cliquer lien internet certaines conditions reunis"