Extraire le code source d'une "Selectlist" sur Internet et comparer

11test2.zip (391.62 Ko)

Bonjour,

C'est quand on pense arrivé a la fin d'un projet qu'on découvre un nouveau problème apparemment...

Je fais un code ayant pour but de remplir automatiquement des formulaires sur un intranet grace a des données que j'ai sur excel.

Je suis parvenu a automatiser la navigation et à remplir toutes les cases de mon formulaire sauf une.
(Vu que c'est sur un "intranet" je ne peux malheureusement pas fournir le site…) Mais voila comment commence mon code :

Public IE As SHDocVw.InternetExplorer
Public idoc As MSHTML.HTMLDocument
Public Link As Object
Public ElementCol As Object

Sub Nav ()

Set IE = New InternetExplorerMedium
IE.Visible = True
IE.Navigate ("monsite")

Donc après avoir naviguer jusqu'à la page en question voici ce que je fais (Dim strNom, strPrenom, strDDN, strEmploi as string)

    Do While IE.Busy Or IE.ReadyState <> 4                                                  
        DoEvents
        Loop

    Set idoc = IE.Document                                                               
    Set ElementCol = idoc.getElementsByTagName("a")
    Set ElementCol1 = idoc.getElementsByClassName("selectlist")

idoc.all.P2300_NOM1.Value = strNom
idoc.all.P2300_PRENOM1.Value= strPrenom

Cela fonctionne pour tout le formulaire sauf a un endroit.

En effet, la case emploi est une "SelectList". Les choix sont souvent les mêmes mais la "value" attribué est malheureusement toujours différente.
(Bénévole peut avoir pour valeur 2365 pour le formulaire 737 mais aura pour valeur 4299 pour le formulaire 788)
Même si je respecte l'orthographe à la lettre, il m'est impossible de sélectionner l'emploi avec du texte.
J'ai pensé a un SendKeys "{TAB 3}" Sendkeys "{B}" mais si j'ai deux emplois qui commence par la même lettre, les erreurs vont commencer.
(Chaque formulaire ne me propose pas forcement les même emplois ni la même combinaison d'emploi)

        For Each Link In ElementCol1
            If Link.innerHTML = "P2300_HAS_CLIENT_FNCTN_ID" Then
                'comparer avec strEmploi et choisir la bonne valeur
                    Exit For
            End If
        Next Link

Voici une photo du code de l'élément :

Imaginons que strEmploi = "Stagiaire"
Comment puis-je faire pour comparer le code suivant avec mes datas (strEmploi) et ainsi sélectionner l'option : value 2408 ?

Merci d'avance
J'espère que l'explication a été assez claire.

selectlist

Bonjour Sartou,

Ces sujets sont toujours difficiles surtout sans accès au site...

Voici un essai quand même :

        For Each Link In ElementCol1
            If Link.id = "P2300_HAS_CLIENT_FNCTN_ID" Then 'ou if link.name = "p_t23" then
                'comparer avec strEmploi et choisir la bonne valeur
                    link.value = "2408"
                    Exit For
            End If
        Next Link

Le mieux est d'exécuter le code au pas à pas, d'essayer de tomber sur l'élément en question et de regarder toutes ses propriétés dans la fenêtre de variables locales pour voir la/lesquelle(s) tu pourras utiliser.

Cdlt,

Bonjour sartou, bonjour 3GB

(Chaque formulaire ne me propose pas forcement les même emplois ni la même combinaison d'emploi)

        For Each Link In ElementCol1
            If Link.innerHTML = "P2300_HAS_CLIENT_FNCTN_ID" Then
                'comparer avec strEmploi et choisir la bonne valeur
                    Exit For
            End If
        Next Link

Voici une photo du code de l'élément :

Imaginons que strEmploi = "Stagiaire"
Comment puis-je faire pour comparer le code suivant avec mes datas (strEmploi) et ainsi sélectionner l'option : value 2408 ?

@sartou ... je ne suis pas certain qu'il faille que tu affectes la valeur, mais plus simplement qu'une fois l'option trouvée correspondante grâce à innerHTML, tu affectes true au numéro de cette option sans t'occuper de la valeur (quand tu simuleras le clic sur le bouton submit, c'est la form qui traduira ce clic en valeur). Il faudrait construire une page html pour faire le test.

J'ai fait un test sur un formulaire comme suit :

<select name="selection">
    <option value="option1">votre option 1</option>
    <option value="option2" selected >votre option 2</option>
    <option value="option3">votre option 3</option>
</select>

l'option 2 est pré-cochée

le code

 '===============
 Dim element As HTMLElementCollection, elem As HTMLElementCollection
    For Each element In IEDoc.getElementsByTagName("select")
        Debug.Print element.Name & " >>> " & element.Type
        For Each elem In element
            Debug.Print "avant", elem.innerHTML, elem.Selected, elem.Value
        Next
        For Each elem In element
            If elem.innerHTML = "votre option 1" Then elem.Selected = True
            Debug.Print "apres", elem.innerHTML, elem.Selected, elem.Value
        Next
    Next
'===============

le résultat, c'est bien l'option 1 qui a été cochée par VBA

selection >>> select-one
avant         votre option 1              Faux          option1
avant         votre option 2              Vrai          option2
avant         votre option 3              Faux          option3
apres         votre option 1              Vrai          option1
apres         votre option 2              Faux          option2
apres         votre option 3              Faux          option3

c'est ensuite l'envoi du formulaire qui s'occupe d'envoyer elem.value de elem.selected, je n'ai pas à m'en occuper.

Bonjour 3GB,
Bonjour Steelson,

Merci beaucoup pour votre aide.
Malheuresement 3GB, je ne connais pas à l'avance la valeur des différents emplois.
Mais c'est parfait car le code de Steelson fonctionne très bien, je l'ai juste modifié comme ceci pour essayer

    Set idoc = IE.Document  

    Dim element As HTMLElementCollection, elem As HTMLElementCollection
    For Each element In idoc.getElementsByTagName("select")
        Debug.Print element.Name & " >>> " & element.Type
        For Each elem In element
            Debug.Print "avant", elem.innerHTML, elem.Selected, elem.Value
        Next
        For Each elem In element
            If elem.innerHTML = "Bénévole/Stagiaire scolaire" Then elem.Selected = True
            Debug.Print "apres", elem.innerHTML, elem.Selected, elem.Value
        Next
    Next

(A partir de là je vais remplacer "Bénévole/Stagiaire scolaire" par strEmploi)

Par contre j'ai pu remarquer qu'il fallait que l'orthographe soit exactement le meme pour que cela fonctionne.
Est-il possible de faire en sorte que le programme fasse des choix lorsque l'orthographe identique n'est pas présent ?

Exemple :

Enseignant > Choix 1 : Enseignant > Choix 2 : (toute option semblable et dans ce cas : ) Enseignant(e)

Stagiaire > Choix 1 : Stagiaire > Choix 2 : (toute option semblable et dans ce cas : ) Bénévole/Stagiaire scolaire

Niv 1 Bénévole > Choix 1 : Niveau 1 Bénévole > Choix 2 : toute option semblable meme si il existe aussi Niveau 1 Stagiaire

J'ai pensé à modifier directement la valeur de "strEmploi" mais malheureusement il se peut que chaque formulaire puisse me proposer des variantes dans l'orthographe...

En tout cas un grand merci pour vos solutions :)

Tu peux mettre UCase pour tout passer en majuscule dans la comparaison,

voire mettre

If Ucase(elem.innerHTML) like "*ENSEIGNANT*" then

ou in fine, la Rolls qui est de comparer la vraisemblance en comptant le nombre de caractères identiques à 80% (usine à gaz)

Bonjour sartou, bonjour Steelson,

Pourquoi une usine à gaz ? Tu parles de l'opérateur Like ?

Hello 3GB

Pourquoi une usine à gaz ? Tu parles de l'opérateur Like ?

Non, c'est s'il fallait comparer caractère par caractère et trouver une ressemblance entre, par exemple enseignante et renseignement qui se ressemblent à 72% ! (c'est juste pour illustrer) 72% c'est le nombre de caractères de enseignante que l'on retrouve dans renseignement, c'est pas une usine à gaz ça ?

Le like est bien, c'est simple !

Ah d'accord, j'avais pas suivi... J'ai eu peur, je pensais qu'il ralentissait le code.

Le Like, "j'adore"

Merci Beaucoup tout fonctionne parfaitement.

Après quelques test, j'ai pu voir que le like fonctionnait jusqu'à un certain point.

Par exemple si j'écris "*BENEVOLE*" ca ne fonctionne pas mais si j'écris "*BÉNÉVOLE*" ca sélectionne bien "BÉNÉVOLE/STAGIAIRE scolaire".

Du coup voila mon code final :

EMP = Array("é", "è", "ê", "ë", "e", "E", "É", "È")    For Each e In EMP      stremploi = Replace(stremploi, e, "?")    Next e
If UCase(elem.innerHTML) Like "*" & stremploi & "*" Then elem.Selected = True

Merci encore !

C'est que malheureusement BENEVOLE même en majuscules n'existe pas en bon français !

https://www.projet-voltaire.fr/culture-generale/accent-majuscules-capitales/

Si tout est ok, n'oublie pas de clore ce fil de discussion en cliquant sur

Rechercher des sujets similaires à "extraire code source selectlist internet comparer"