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
image

Manipulation n2:

Set oHTML = IE.document
        With oHTML
                oHTML.execScript "gotoinforme('tablero/tbl25_frames.jsp','GRUPO1','TBL25B')", "JScript"
                End With
image

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
          Next

Rien 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 If

Rien 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
            Next

Rien 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 sub

Je 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").links

VBA 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 IHTMLElement

Mais 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 sub

Avec 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 IHTMLImgElement

Mais 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 sub

Bonjour,

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 elem

Sait-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):

sanitre

On clique sur "Direction Général pour dérouler les différents liens.

sare

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 = xxxxxx

Afin 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:

sans t

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:

sans

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).

sans tit

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 ?

Non, j'ai beaucoup d'info/d'éléments. Je pourrais peut-être trouver les informations que vous recherchez avec ça, mais il faudra me dire où chercher.

sans titaare

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.Document

et avant/après chaque affectation d'objet

temporiser

pour 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 sub

Cela 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 sub

Sans 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

sans titr

En fait l'item 2 correspond à

src="main.3jsp"

Je m'explique, en dessous la source html

sans titre

En cliquant sur :

src="main.3jsp" 'correspond donc a notre ITEM 2

Cela ouvre une autre page de code:

aasans titre bsans titre csans titre dsans titre

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 sub

J'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")
aaqsans titre

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:

az

Espion sur collElem donne:

az

Les premiers elements ne sont pas interessant mais ensuite ils correspondent au nom des liens hypertext que je dois cliquer

sassans titre

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:

azssans titre azswsans titre sqswsans titre

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ûr

Mais 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 with

Cdlt,

Rechercher des sujets similaires à "cliquez element hypertexte fonction valeur innertext"