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 !