Cliquez sur un élément hypertexte en fonction de sa valeur de innertext
Bonjour,
Je ne peux pas résoudre ce problème : cliquez sur un élément hypertexte en fonction de sa valeur de innertext (TG01A-P - Suivi des objectifs par pays (yc production DI) (TG01A))
Normalement, une fois que vous avez cliqué sur l'élément hypertexte, IE charge une autre page. Je voudrais donc pouvoir choisir le tableau : TG01A-P - Suivi des objectifs par pays (yc production DI) (TG01A).
J'ai essayé différentes manipulations (voir ci dessous):
Manipulation n1:
Set oHTML = IE.document
With oHTML
oHTML.querySelector ("[href=javascript:gotoinforme('tablero/tbl25_frames.jsp','GRUPO1','TBL25B')]")
End With
Manipulation n2:
Set oHTML = IE.document
With oHTML
oHTML.execScript "gotoinforme('tablero/tbl25_frames.jsp','GRUPO1','TBL25B')", "JScript"
End With
Manipulation n3:
Dim element As HTMLLinkElement
Dim elementcol As IHTMLElementCollection
Dim link As HTMLAnchorElement
Set oHTML = IE.document
Set elementcol = oHTML.getElementsByTagName("a")
For Each element In elementcol
If InStr(element.innerText, "TG01A-P - Suivi des objectifs par pays (yc production DI) (TG01A)") Then
Call element.Click
Exit For
End If
NextRien ne se passe!
Manipulation n4:
Dim element As HTMLLinkElement
Dim elementcol As IHTMLElementCollection
Dim link As HTMLLinkElement
Dim i As Integer
Set oHTML = IE.document
Set link = Nothing
i = 0
While i < oHTML.Links.Length And link Is Nothing
Debug.Print oHTML.Links(i).innerText, oHTML.Links(i).href
If oHTML.Links(i).innerText = "TG01A-P - Suivi des objectifs par pays (yc production DI) (TG01A)" Then
Set link = oHTML.Links(i)
i = i + 1
End If
Wend
If Not link Is Nothing Then
link.Focus
link.Click
Else
End IfRien ne se passe!
Manipulation n5:
Dim coll_Li As IHTMLElementCollection
Dim Li As HTMLGenericElement
Set oHTML = IE.document
Set coll_Li = oHTML.getElementsByTagName("a")
For Each Li In coll_Li
If Li.innerText = "TG01A-P - Suivi des objectifs par pays (yc production DI) (TG01A)" Then
Li.Click
Exit For
End If
NextRien ne se passe!
Ci dessous le code HTML:
</SCRIPT>
</head>
<body bgcolor="#ffffff" marginwidth="0" marginheight="0" topmargin="0" leftmargin="0" onload="doAbrirMenu('GRUPO1')" > <!-- -->
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="100%" valign="top">
<table width="100%" border="0" cellpadding="0" cellspacing="4">
<tr valign="top">
<td width="60%" align="center" id="tdMenu">
<!-- MENU -->
<br>
<table cellpadding="5" cellspacing="0" border="0" width="100%">
<tr>
<td width="5"></td>
<td width="10" background="images/P/contenu_fondtitre.gif"><img width="1" height="1" src="images/P/spc.gif">
</td>
<td class="pTitreC" style="cursor:pointer;" onclick="doAccionMenu('GRUPO1')" nowrap="">Direction Générale</td>
<td align="right" class="iAction" onclick="doAccionMenu('GRUPO1')"><img id="imgGRUPO1" src="images/P/triangle_dw.gif">
</td>
<td align="right" width="100%" background="images/P/contenu_fondtitre.gif"></td>
</tr>
</table>
<table cellpadding="5" cellspacing="0" border="0" width="100%" id="tblGRUPO1" style="display:none;">
<tr>
<td width="5"></td>
<td width="100%">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="25" align="center" valign="top" bgcolor="#F2F2F2"><img src="images/P/puce_on.gif" vspace="3" width="9" height="10"> </td>
<td width="100%" valign="top" bgcolor="#F2F2F2"><a href="javascript:gotoInforme('tablero/tbl02tp_frames.jsp','GRUPO1','TBL02TP')" class="pMenu">TG01B-P - Suivi des objectifs par pays (TG01) </a>
</td>
</tr>
<tr>
<td width="25" align="center" valign="top" bgcolor="#F2F2F2"><img src="images/P/puce_on.gif" vspace="3" width="9" height="10"> </td>
<td width="100%" valign="top" bgcolor="#F2F2F2"><a href="javascript:gotoInforme('tablero/tbl25_frames.jsp','GRUPO1','TBL25B')" class="pMenu">TG01A-P - Suivi des objectifs par pays (yc production DI) (TG01A) </a>
</td>
</tr>
<tr>Bonjour Asma,
Voyant que vous n'avez pas de réponse, me revoici, sans grande certitude, d'autant que je ne suis jamais parvenu à saisir la nuance entre links et anchors...
Un premier essai :
Sub manavigation()
dim collElem As IHTMLElementCollection
'....debut code
AttenteIE IE
Set oHTML = IE.document
temporiser 'tempo pour etre sur d'avoir capté l'objet avant de passer à l'instruction suivante
set collElem = oHTML.getElementsByclassname("pMenu").anchors
'set collElem = oHTML.getElementsByclassname("pMenu").links '<<<<OPTION 2 si anchors ne fonctionne pas
temporiser 'idem
For Each elem In collElem 'pour chaque élément de la collection de liens de la class "pMenu"
If elem.innerText like "TG01A*" Then 'si innertext commence par "TG01A"
elem.Click 'click sur l'elem
Exit For
End If
Next elem
end subJe pense que les temporisations (wait now + 00:00:01) (cf précédent post) sont importantes car elles permettent de s'assurer de la captation de l'objet (trop lente par rapport à la vitesse d'exécution du code). Si ça marche, vous pourrez éventuellement essayer sans pour tester.
J'ai choisi de prendre les anchors de la class "pMenu" mais on aurait très bien pu faire autrement...
Remarque : L'opérateur Like est un opérateur de comparaison de chaine de caractères. chaine like "texte*" est l'équivalent (plus ou moins) de instr(chaine, "texte") = 1. Ca permet de tester si la chaine commence par "texte". On peut voir aussi si elle contient ou si elle termine par "texte" (resp. like "*texte*" et like "*texte").
Cdlt,
Bonjour,
C'est avec grand plaisir que j'apprends que c'est vous qui prenez en charge mon problème qui sera donc très vite résolu!
J'ai essayé votre code mais comme pour la manipulation 3/4/5, rien ne se passe. Je vois juste la souris mouliner pendant 1 seconde.
En effet, je n'avais pas copié la partie du code de "application.wait now+TimeValue("00:00:02")" dans mon message mais elle est bien présente dans le code vba suite à vos SUPER conseils d'hier.
Concernant la ligne suivante:
set collElem = oHTML.getElementsByclassname("pMenu").anchors 'ou
set collElem = oHTML.getElementsByclassname("pMenu").linksVBA error 438: Propriété ou méthode non gérée par cet objet (collElem=Nothing)
Cela peut peut-être vous aider, mais la vba présente 4 options différentes au lieu de links/anchors qui sont:
-item
-length
-tags
-tostring
En essayant Item:
set collElem = oHTML.getElementsByclassname("pMenu").item 'collElem=Nothing En essayant lenght et tostring: incompatibilité de type
En essayant tags: Argument non facultatif
Vous n'aviez pas précisé l'élément, alors j'ai essayé avec:
Dim Elem as IHTMLAnchorElement 'et
Dim Elem as IHTMLElementMais rien ne se passe, je vois juste la souris mouliner pendant 1 à 2 seconde.
"Text*" est en effet une très bonne idée car chaque élément commence par le nom du tableau.
Peut-être en passant par href avec querySelector ou execScript mais pour être honnête, je n'en ai aucune idée. Je pense que la piste inner.text est la bonne, mais il doit y avoir un problème de syntaxe.
J'aimerais bien mais je ne garantis rien. Honnêtement, vous en savez peut-être plus que moi sur le pilotage d'IE.
En tout cas, ce que j'essaierais, c'est de ne pas typer les variables, et de voir leur type dans la fenêtre variables locales si besoin. Avec une exécution au pas à pas, ce serait encore mieux (touche F8 quand on est positionné sur le code).
De cette manière, vous pourrez voir les propriétés et le type de l'élément.
Petit essai quand même pour tester (et s'assurer qu'on ne fait pas fausse piste) :
Sub manavigation()
dim collElem
dim elem
dim monelem
'....debut code
AttenteIE IE
Set oHTML = IE.document
temporiser 'tempo pour etre sur d'avoir capté l'objet avant de passer à l'instruction suivante
set collElem = oHTML.getElementsByclassname("pMenu") 'essayer ça aussi
'set collElem = oHTML.getElementsByclassname("pMenu").anchors
'set collElem = oHTML.getElementsByclassname("pMenu").links '<<<<OPTION 2 si anchors ne fonctionne pas
temporiser 'idem
For Each elem In collElem 'pour chaque élément de la collection de liens de la class "pMenu"
If elem.innerText like "TG01A*" Then 'si innertext commence par "TG01A"
set monelem = elem
msgbox "trouvé"
Exit For
End If
Next elem
end subAvec un point d'arrêt sur la ligne msgbox "trouvé" pour inspecter notre variable monelem qui correspond à l'objet cherché.
Et je ne connais pas les 2 méthodes queryselector et execScript... Je pense en effet qu'innertext est une meilleure solution que href. Elle est plus facilement adaptable en cas de changement.
Cdlt,
Re-Bonjour,
Merci pour votre aide, mais cela ne fonctionne toujours pas.
Quand j'essaye , j'ai une erreur
set collElem = oHTML.getElementsByclassname("pMenu").anchors ou
set collElem = oHTML.getElementsByclassname("pMenu").links J'ai l'erreur: error 438: Propriété ou méthode non gérée par cet objet.
Avec juste:
set collElem = oHTML.getElementsByclassname("pMenu")CollElem=object mais par contre
Elem=nothing et donc MonElem=Nothing et donc la MsgBox n'affiche rien.
Peut être avec une nouvelle variable: Integer
J'ai donc essayé divers techniques comme:
Dim collElem as HTMLElementCollection
Dim Elem as HTMLElement
Dim MonElem as HTMLElement
'et
Dim collElem as IHTMLElementCollection
Dim Elem as IHTMLElement
Dim MonElem as IHTMLElement
'et
Dim collElem as HTMLElementCollection
Dim Elem as IHTMLImgElement
Dim MonElem as IHTMLImgElementMais cela ne fonctionne pas.
Je doute d'être aussi compétent que vous, j'ai commencé les macros il y a 15 jours et les macros avec IE seulement depuis la fin de la semaine dernière. N'ayant aucune compétence en HTML/Java, ce n'est pas un exercice facile. Je fais beaucoup de recherches sur les forums pour essayer de trouver une solution et éventuellement poster mon problème si je suis bloqué.
Re,
Est-ce que vous pourriez m'envoyer le fichier, en privé s'il le faut, avec uniquement ce qu'il faut jusqu'à cette étape et donc le vrai lien de navigation ?
En effet, ce n'est pas ce qu'il y a de plus simple quand on débute (au moins, ça va vous forger !). C'est pourquoi ce serait plus facile pour moi avec le code car je pourrais faire des essais au lieu de proposer des idées incertaines.
En attendant, je mets un début de code quand même, qui n'est pas bien différent du précédent...
Je le modifierais quand j'aurai plus d'infos.
Sub manavigation()
dim IE as InternetExplorer
dim oHTML as HTMLDocument
dim collElem as DispHTMLElementCollection
dim link as HTMLAnchorElement
with IE
.navigate lien
.visible = true
'reste code
AttenteIE IE
Set oHTML = .document
temporiser 'tempo pour etre sur d'avoir capté l'objet avant de passer à l'instruction suivante
with oHTML
set collElem = .getElementsByclassname("pMenu") 'essayer ça aussi
temporiser 'idem
For Each elem In collElem 'pour chaque élément de la collection de liens de la class "pMenu"
If elem.innerText like "TG01A*" Then 'si innertext commence par "TG01A"
set link = elem
link.click
Exit For
End If
Next elem
end with
AttenteIE IE
temporiser
set oHTML = .Document
temporiser
end with
end subBonjour,
Merci pour votre réponse. Malheureusement, je ne peux pas vous communiquer le lien car il s'agit d'un lien interne à mon entreprise. Vous auriez besoin d'un vpn, de mon nom d'utilisateur ainsi que mon mot de passe, ce qui n'est malheureusement pas possible...
Je pense que pour la définition des variables, nous devons utiliser :
Dim collelem As IHTMLElementCollection
Dim element As HTMLAnchorElement 'ou
Dim element As HTMLLinkElement
'selon le site qwazerty.developpez. com/tutoriels/vba/ie-et-vba-excel/#LIV-G (IV-G. Agir sur un lien HyperText)J'ai essayé votre code mais:
dim collElem as DispHTMLElementCollection mais n'existe pas, j'ai donc utilisé dim collElem as IHTMLElementCollection --> Mais rien se ne passe. J'ai passé ma matinée à essayer d'autres techniques (variables définies ci-dessus, élément comme objet, etc.) mais je n'ai pas réussi.
Je pense que le problème vient de l'élément parce que VBA indique "élément = nothing". Et donc impossible de trouvé l'element dans collelem (objet). Peut-être avec le code ci-dessous a retravaillé:
Set Element = oHTML.anchors("xxx") 'selon le site qwazerty.developpez. com/tutoriels/vba/ie-et-vba-excel/#LIV-G (IV-G. Agir sur un lien HyperText)Je pense que nous sommes sur la bonne piste mais nous devons peut-être nous concentrer sur l'élément (le définir pour permettre à la VBA de le trouver). Le problème vient peut-être de la.
Normalement, je dois cliquer sur Direction générale (Grupo1) pour faire apparaître les éléments hypertextes présents dans cette section. Ensuite, je clique sur le rapport (lien hypertexte) que je veux, par exemple :
TG01A-P - Suivi des objectifs par pays (yc production DI) (TG01A) Je vous donne le code source de la page web ci-dessous (plus complet) pour vous aider éventuellement à mieux le comprendre.
<script language="javascript">
if (window!=top) top.location.href=location.href;
</script>
<frameset rows="80,*" framespacing="0" border="0" frameborder="0">
<frame name="topFrame" src="bandeau.jsp" framespacing="0" border="0" frameborder="0" framemargin="0" marginwidth="0" marginheight="0" scrolling="no" noresize>
<frame name="mainFrame" src="main3.jsp" framespacing="0" border="0" frameborder="0" framemargin="0" marginwidth="0" marginheight="0" scrolling="auto" noresize>
</frameset>Il faut s'intéresser à :
<frame name="mainFrame" src="main3.jsp" En cliquant sur
src="main3.jsp" Un autre code apparait:
<!-- BEGIN WEBOSCOPE MADAx -->
<!-- ALTER ONLY WEBO_ZONE AND WEBO_PAGE -->
<script language="javascript">
WEBO_ID='348';
WEBO_ZONE='84';
WEBO_PAGE='-2';
WEBO_PRF='2';
webo_ok=0;
</script>
<script language="javascript" src="/scripts/weboscope.js"></SCRIPT>
<SCRIPT>
if(webo_ok==1){webo_zpi(WEBO_ID,WEBO_ZONE,WEBO_PAGE,WEBO_PRF);}
</script>
<!-- Piwik -->
<script type="text/javascript">
var titulo = '-2';
var filial ='84';
var perfil='2';
var pwk_id = 55;
</script>
<!-- End Piwik Code -->
<html>
<head>
<title>MADAP</title>
<meta name="vs_showGrid" content="True">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="poe/P/style_ie.css" type="text/css">
<script type="text/JavaScript" src="site.js"></script>
<SCRIPT LANGUAGE="JavaScript">
<!--
function gotoInforme(url,grp,qc_inf){
//parent.location.href="index4.jsp?tipo=inf&grp="+grp+"&loc="+url;
//parent.location.href="index4.jsp?loc="+url;
form1.loc.value = url;
form1.codInforme.value = qc_inf;
form1.grp.value = grp;
form1.submit();
}
//-->
</SCRIPT>
</head>
<body bgcolor="#ffffff" marginwidth="0" marginheight="0" topmargin="0" leftmargin="0" onload="doAbrirMenu('GRUPO1')" > <!-- -->
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td width="100%" valign="top">
<table width="100%" border="0" cellpadding="0" cellspacing="4">
<tr valign="top">
<td width="60%" align="center" id="tdMenu">
<!-- MENU -->
<br>
<table cellpadding="5" cellspacing="0" border="0" width="100%">
<tr>
<td width="5"></td>
<td width="10" background="images/P/contenu_fondtitre.gif"><img width="1" height="1" src="images/P/spc.gif">
</td>
<td class="pTitreC" style="cursor:pointer;" onclick="doAccionMenu('GRUPO1')" nowrap="">Direction Générale</td>
<td align="right" class="iAction" onclick="doAccionMenu('GRUPO1')"><img id="imgGRUPO1" src="images/P/triangle_dw.gif">
</td>
<td align="right" width="100%" background="images/P/contenu_fondtitre.gif"></td>
</tr>
</table>
<table cellpadding="5" cellspacing="0" border="0" width="100%" id="tblGRUPO1" style="display:none;">
<tr>
<td width="5"></td>
<td width="100%">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="25" align="center" valign="top" bgcolor="#F2F2F2"><img src="images/P/puce_on.gif" vspace="3" width="9" height="10"> </td>
<td width="100%" valign="top" bgcolor="#F2F2F2"><a href="javascript:gotoInforme('tablero/tbl02tp_frames.jsp','GRUPO1','TBL02TP')" class="pMenu">TG01B-P - Suivi des objectifs par pays (TG01) </a>
</td>
</tr>
<tr>
<td width="25" align="center" valign="top" bgcolor="#F2F2F2"><img src="images/P/puce_on.gif" vspace="3" width="9" height="10"> </td>
<td width="100%" valign="top" bgcolor="#F2F2F2"><a href="javascript:gotoInforme('tablero/tbl25_frames.jsp','GRUPO1','TBL25B')" class="pMenu">TG01A-P - Suivi des objectifs par pays (yc production DI) (TG01A) </a>Le code continue sous la même forme mais un autre nom de lien est ajouté . Exemple:
href="javascript:gotoInforme('tablero/tbl28_frames.jsp','GRUPO1','TBL28B')" class="pMenu">TG28-B - Suivi des objectifs par villes (TG28B) </a>À la fin de l'énumération, nous avons un lien très long et ensuite ces dernières lignes:
<!-- FIN CHANNELS -->
</tr>
</table>
</body>
<form name="form1" id="form1" method="post" action="index4.jsp" target="_parent">
<input type="hidden" name="loc" id="loc" value="">
<input type="hidden" name="codInforme" id="codInforme" value="">
<input type="hidden" name="tipo" id="tipo" value="inf">
<input type="hidden" name="grp" id="grp" value="">
</form>
</html>Bonjour,
Et bien, c'est de la réponse
En fait, ce qui est compliqué, c'est que j'ai pratiqué un peu mais il y a un moment, et sans approfondissement particulier. Je saurais mieux tester moi-même car j'ai idée des pistes à suivre et comment les suivre.
Je ferais plein d'essais, notamment en essayant de trouver la bonne classname car ce serait je pense plus rapide (j'ai bien l'impression qu'il s'agit de la classe "pMenu"). Sinon, je ferais un essai avec .getelementsbytagname("a"), ou avec all("pMenu") pour l'instant. J'ai l'impression que le lien se trouve au sein d'une table et c'est peut-être ça qui joue ?
En tout cas, si vous voulez trouver, il faut absolument :
- exécuter le code au pas à pas (touche F8),
- marquer un (ou des) point(s) d'arrêt avant/au niveau des lignes charnières de code VBA,
- inspecter les variables (notamment la variable collelem) dans la fenêtre variables locales (qui en général se trouve sous l'éditeur de code). Sinon, vous pouvez l'ouvrir à l'aide du menu Affichage/fenêtre variables locales.
Ainsi, vous pourrez dérouler l'objet collelem. Il s'agit d'une collection d'items. Ce sera fastidieux mais au final un gain de temps si vous regardez chaque item (en déroulant toujours) pour y chercher celui qui a la propriété .innertext avec la valeur "TG01A....." ou .href avec la valeur du lien.
Vous l'aurez ainsi trouvé ! La solution de la facilité consisterait à ensuite faire collelem.item(N).click avec N le numéro de l'item en question. Mais la meilleure serait de regarder la valeur de la propriété classname de cet item et de partir sur notre idée de départ avec une boucle testant le innertext, à moins que cet item ait une valeur Id...
J'ai conscience que tout ce charabia puisse ne être pas très clair voire être indigeste. Mais c'est vraiment le seul moyen d'avancer quand ça bloque.
Et aussi, on pourrait essayer de modifier un peu la condition au cas où :
For Each elem In collElem 'pour chaque élément de la collection de liens de la class "pMenu"
If elem.innerText like "*TG01A*" or elem.outerText like "*TG01A*" Then 'si innertext commence par "TG01A"
set link = elem
link.click
Exit For
End If
Next elemSait-on jamais...
Re-bonjour,
Je tiens à vous remercier pour votre engagement pour m'aider.
Oui il me semble que mon lien est au sein d'une table (ci-dessous à quoi cela ressemble & --> à la fin du message le code html):
On clique sur "Direction Général pour dérouler les différents liens.
Je ne suis pas sûr d'avoir compris, mais j'ai fait ce que vous m'avez demandé de faire sans aucun résultat.
Pour le moment, j'ai fixé un point d'arrêt sur
with oHTML
set collElem = xxxxxxAfin d'étudier ColleElem avant de passer à l'élément.
J'ai donc essayé tout et n'importe quoi:
Pour:
with oHTML
set collElem = oHTML.getElementsByTagName("pMenu") 'ou
set collElem = .getElementsByTagName("pMenu")'ou
set collElem = oHTML.getElementsByTagName("pMenu")'ou
set collElem = oHTML.getElementsByTagName("pMenu")'ou
set collElem = oHTML.getElementsByTagName("pMenu")'ou
set collElem = oHTML.all("pMenu") 'ou (même chose avec .links)
set collElem = oHTML.all("a") 'ou (même chose avec .links)
set collElem = oHTML.anchors("a") 'ou (même chose avec .links)
set collElem = oHTML.anchors("pMenu") 'ou (même chose avec .links)
set collElem = oHTML.anchors("a.pMenu") 'ou (même chose avec .links)
set collElem = oHTML.anchors("*") 'ou (même chose avec .links)
set collElem = oHTML.anchors("a*") 'ou (même chose avec .links)L'espion collElem affiche cela:
Pour:
with oHTML
set collElem = .getElementsByTagName("a") 'ou
set collElem = oHTML.getElementsByTagName("a") 'ou
set collElem = oHTML.getElementsByTagName("a.") 'ou
set collElem = .getElementsByTagName("a.") 'ou
set collElem = .getElementsByTagName("a.pMenu") 'ou
set collElem = oHTML.getElementsByTagName("a.pMenu") 'ou
set collElem = oHTML.getElementsByTagName("a*") 'ou
set collElem = oHTML.getElementsByClassName("a*") 'ou
set collElem = oHTML.getElementsByClassName("a") 'ou
set collElem = oHTML.getElementsByClassName("a.pMenu") 'ou
set collElem = oHTML.getElementsByClassName("pMenu")L'espion collElem affiche cela:
Il me semble que normalement je devrais avoir des ITEMS et ensuite je devrais pouvoir choisir l'ITEM en fonction de son numéro comme vous l'avez expliqué.
Aucune idée si cela peut vous être utile mais j'ai également fait clique droit (sur l'hyperlink :"TG01A-P - Suivi des objectifs par pays (yc production DI) (TG01A)") et j'ai inspecté l'élément. Voici ce que le web m'a montré : (il me semble que cela montre le chemin dans l'ordre que prend le web pour aller pointer vers l'élément en question).
Je ne sais pas si j'utilise les bons termes mais pour chaque élément en dessous : nous avons element=nom de l'élément (ex : html --> élément= html) sauf pour:
td#tdMenu --> element=td & id=tdmenu
table#tblGRUPO1 --> element=table& id=tblGRUPO1
a.pMenu --> element=a & id=pMenu
Bonjour,
Je vous en prie !
Petite question : Qu'en est-il de votre variable oHTML ? Elle est à Nothing aussi ?
Franchement, c'est assez enigmatique... Vous avez exécuté au pas à pas ?
Vous avez bien à chaque changement de page
AttenteIE IE
temporiser
set oHTML = IE.Documentet avant/après chaque affectation d'objet
temporiserpour laisser le temps de capter l'objet précédent.
Pour moi, on a un lien qui pourrait s'obtenir par tagname("a") ou classname("pMenu")...
Oui j'ai bien exécuté pas à pas mais rien ne change. J'ai bien mis du temporiser (essayé avec 2secondes et 4secondes) un peu partout (avant,apres et même dans mes fonctions).
dim IE as new InternetExplorer
dim oHTML as HTMLDocument
dim collElem as IHTMLElementCollection
dim element as HTMLAnchorElement
'fin du code précédent
AttenteIE IE
Temporiser
set oHTMl=IE.document
Temporiser
With oHTML
Set collElem= oHTML.getelementsbytagname("a") 'aussi avec Set collElem= oHTML.getelementsbyclassname("pmenu") et collElem= oHTML.getelementsbytagname("a").getelementsbyclassname("pmenu") mais erreur.
Temporiser
For Each element In collElem
temporiser
If elem.innerText like "TG01A*" then
Msgbox "trouvé"
element.click
Exit For
End If
Next element
end if
AttenteIE IE
temporiser
end subCela voudrait dire que nous avons le mauvais classname ou le mauvais tagname, mais si je comprends bien, c'est ce que le code html indique. J'ai essayé par exemple avec:
td
table
body
mais rien par contre avec "frameset" j'ai des items.
Franchement, pour l'instant, je n'ai pas d'idée. Vous pouvez au moins approfondir la piste frameset...
En tout cas, en attendant, voici le code retouché (notamment parce qu'il restait la variable elem qui n'apparait plus) sans typer les objets dont on ne connait pas le type avec certitude, avec une condition étendue :
Sub navig()
dim IE as new InternetExplorer
dim oHTML as HTMLDocument
dim collElem 'as IHTMLElementCollection
dim element 'as HTMLAnchorElement
'fin du code précédent
AttenteIE IE
Temporiser
set oHTMl = IE.document
Temporiser
Set collElem= oHTML.getelementsbyclassname("pMenu")
Temporiser
For Each element In collElem
temporiser
If element.innerText like "*TG01A*" or element.outertext like "*TG01A*" or element.href like "*TBL25*" _
or element.tagname = "a" or element.classname = "pMenu" then
Msgbox "trouvé"
with Activesheet
.[AA1].value = element.classname
.[AB1].value = element.tagname
.[AC1].value = element.href
.[AD1].value = element.outertext
.[AE1].value = element.innertext
.[AF1].value = element.name
end with
Exit For
End If
Next element
AttenteIE IE
temporiser
end subSans accès, c'est difficile pour moi de faire plus...
Cdlt,
Bonjour, veuillez m'excuser pour ma réponse tardive (PS : Désolé pour ce long message plein d'images...).
En utilisant:
Set collElem= oHTML.getelementsbytagname("FRAME") J'obtiens 2 items comme ci dessous
En fait l'item 2 correspond à
src="main.3jsp"Je m'explique, en dessous la source html
En cliquant sur :
src="main.3jsp" 'correspond donc a notre ITEM 2Cela ouvre une autre page de code:
L'information que nous recherchons se trouve dans " main.3jsp ". Peut-être qu'en cherchant "pmenu" ou "a" dans cet item 2, nous trouverons l'élément. Je m'excuse pour mon amateurisme, peut-être que cela vous semble idiot. Et excusez-moi d'avoir mis beaucoup de photos à chaque fois, mais je trouve plus facile d'illustrer le problème avec. Encore merci de votre engagement!
Bonjour,
Non, c'est tout à fait normal on ne peut pas dire que je sois un initié... Je comprends les mécanismes mais je ne maitrise absolument pas HTML ni javascript ni le pilotage IE.
Mais, je ne me trompe pas une frame est une "fenêtre". C'est un peu l'objet principal grossomodo...
Ce serait bien si vous essayiez avec getelementsbytagname("table") pour qu'ensuite on réalise la boucle sur tous ses éléments. Mais franchement, je ne m'explique pas qu'on ne parvienne pas à obtenir un collection exploitable avec getelementsbytagname("a") et getelementsbyclassname("pMenu").
Pour que vous compreniez, il faut une fois l'objet capté aller explorer ses objets enfants. Car les éléments qu'on cible sont des éléments d'une collection élément d'une autre collection (un peu comme un arbre).
Sinon, est-ce que je peux voir votre code avant cette opération ? Que se passe-t-il juste avant ? Vous cliquez sur "Direction générale" afin de dérouler c'est ça ?
Bonjour,
Mon code précédent:
Private Sub Country()
Dim IE As New InternetExplorer
Dim oHTML as HTMLDocument
Dim collElem as IHTMLElementCollection
Dim element as HTMLAnchorElement
URL = "xxxxxxx"
with IE
.navigate URL
AttenteIE IE
Temporiser
Set oHTML = .Document
.Visible = True
With oHTML
.getElementById("uname").value= "user"
.getElementById("pass").value= "password"
.getElementById("btn").Click
end with
AtenteIE IE
Temporiser
set oHTML = .Document
oHTML.getElementById("countrySelect").value = "Paris"
oHTML.getElementById("countrySelect").FireEvent("onchange")
End with
AtenteIE IE
Temporiser
With oHTML= IE.document
Tempopriser
With oHTML
Set collElem=IE.document.getelementsbyname("mainFrame")
Temporiser
For Each element In collElem
temporiser
If element.innerText like "*TG01A*" or element.outertext like "*TG01A*" or element.href like "*TBL25*" _
or element.tagname = "a" or element.classname = "pMenu" then
Msgbox "trouvé"
with Activesheet
.[AA1].value = element.classname
.[AB1].value = element.tagname
.[AC1].value = element.href
.[AD1].value = element.outertext
.[AE1].value = element.innertext
.[AF1].value = element.name
end with
Exit For
End If
Next element
AttenteIE IE
temporiser
end subJ'ai fais plusieurs manipulations et si ma compréhension est bonne il faut d'abord se focaliser sur "mainFrame". Je m'explique avec
set collElem=IE.document.getelementsbyname("mainFrame")
On obtient cela avec l'espion. Et c'est dans l'item 1 que je retrouve getelementsbytagname("a") et getelementsbyclassname("pMenu"). Le chemin d'accès:
Item1-->Content document-->body-->children-->all ou Item1-->Content document-->body-->children-->item1-->tbodies-->all
On retrouve donc le chemin HTML:
Espion sur collElem donne:
Les premiers elements ne sont pas interessant mais ensuite ils correspondent au nom des liens hypertext que je dois cliquer
En cherchant dans les items j'ai trouvés similitudes:
Pour Variant/object/HTMLtablerow --> tagname="TR"
Pour Variant/object/HTMLtablecell --> tagname="TD"
Pour Variant/object/HTMLimg --> tagname="img"
Pour Variant/object/HTMLanchorelement --> tagname="A" et classname="pMenu"
C'est à dire:
Il faudrait donc sélectionner l'item1 de getelementsbyname("mainframe") (car sinon excel va pas chercher au bon endroit si j'ai bien compris avec mes manipulations) pour ensuite effectuer un getelementsbytagname("a") ou getelementsbyclassname("pMenu").
J'ai essayé divers manipulations mais sans succès..
Bonjour Asma,
C'est bien, tu avances. Je ne sais pas si tu sais mais tu peux faire comme ceci :
Set collElem = IE.document.getelementsbyname("mainFrame").item(1).item(X) 'X étant un nombre bien sûrMais là, j'ai l'impression qu'on tient quelque chose. Si je ne me trompe pas, c'est bête, ça serait beaucoup de temps perdu pour un petit détail :
With oHTML
Set collElem = .getelementsbytagname("A")
Temporiser
For Each element In collElem
temporiser
If element.textcontent like "TG01*" then
Msgbox "trouvé"
'element.click
Exit For
End If
Next element
end withCdlt,
