Manipulation d'Internet Explorer via VB

Le , par Qwazerty, Expert éminent
Salut

Je vous propose un tutoriel sur l’interaction entre Excel VBA et Internet Explorer.

Les sujets développés sont
  • la déclaration des variables
  • la navigation dans le code source d'une page
  • récupérer et saisir des données, agir sur des boutons, des liens, des cases à cocher...
  • le téléchargement de fichiers
  • adapter ses méthodes d'interaction en fonction du contenu de la page
  • un rappel sur l'utilisation des espions et des point d'arrêt


Afin d'y parvenir, vous trouverez dans ce document des exemples concrets mettant en pratique une partie des méthodes fournies par VBA pour manipuler le contenu d'une page Web. Nous développerons par exemple un code visant à obtenir les résultats du loto sportif ou encore la sélection d'un trajet sur le site de la SNCF.

Merci de laisser sur ce topic votre avis sur mon document, toutes les critiques constructives sont les bienvenues .

Si vous avez la flemme de taper, pensez à minima à noter la discussion

Bonne lecture et bon apprentissage

++
Qwaz


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de patricktoulon patricktoulon - Expert éminent sénior http://www.developpez.com
le 04/11/2015 à 20:00
onjour
en effet je viens de tester sur l'exemple d url que tu avais donné et la list3 semble etre innacessible en mode vba

c'est en effet assez récurent sur les pages web aujourd'hui il colle la protection onwindowsbygoogleapps ce qui implique que les manipulation ne peuvent se faire qu'avec la souris sur la page web et donc on window

sur certains cite n'ayant besoins que de récupérer du texte je la supprime mais la si je fait ca la page plante
resultat des courses WALOUHH!!!!!!!!

j'ai bien essayé par le parent (div id="object")mais ca pase pas non plus

c'est assez ragent!!! surtout que j'arrive a récupérer le code innerhtml de la liste

voila encore un defit pour moi

voila le responsable
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
<script type="text/javascript">
   var _gaq = _gaq || [];
   _gaq.push(['_setAccount', 'UA-27882341-1']);
   _gaq.push(['_trackPageview']);
   (function() {
     var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
     ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
   })();
 </script>
Avatar de patricktoulon patricktoulon - Expert éminent sénior http://www.developpez.com
le 04/11/2015 à 20:34
re
voila prends celui la
j'ai bloqué la derniere ligne du code elle sert a cliquer sur le bouton debloque si tu veux cliquer
je l'ai bloqué pour que tu vois bien que les items des 3 listes sont bien changés
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
sub test()
Dim ie As Object, url As String, liste1 As Object, liste2 As Object, parentliste3 As Object, lescript, code As String
url = "http://habitat-developpement.tm.p15.siteinternet.com/particuliers/index.cfm?cont=aide_habitat"
Set ie = CreateObject("internetexplorer.application")
ie.navigate url
ie.Visible = True
Do: DoEvents: Loop While ie.readystate <> 4 Or ie.busy
'*****************************************************************************************
'on casse la protection en coupant les script du code html
code = ie.document.body.innerhtml
lescript = Split(code, "<script")
code = Replace(code, Split(lescript(2), "/script>")(0), "")
ie.document.body.innerhtml = code 'on réimplante le code html dans le body du document
'*****************************************************************************************
Set liste1 = ie.document.all("departement")
Set liste2 = ie.document.all("code_beneficiaire")
'maintenant on va selectionner mon departement (83) par son index
liste1.selectedIndex = 84
'je suis proprio  donc le 2 item de la liste2  (locataire) donc l'index 2 puisque le 1 er c'est l'entete
liste2.selectedIndex = 2: liste2.onchange
    Application.Wait (Now + TimeValue("0:00:02"))
Set parentliste3 = ie.document.getelementbyid("objet")
 parentliste3.Children(0).selectedIndex = 2
'debloque cette ligne pour cliquer sur le bouton
ie.document.getelementbyid("monform").submit
End Sub
Avatar de Shaekin Shaekin - Futur Membre du Club http://www.developpez.com
le 09/11/2015 à 10:35
Bonjour,

Tout d'abord, merci beaucoup patricktoulon !!

Comment as-tu appris cette technique ? Je cherche des bouquins ou autres qui puissent m'aider à devenir autonome. Car encore une fois, j'arrive à faire des choses, mais pas tout.

J'ai presque fini les macros pour extraire la base de données. Grâce à vous logiquement. Je compte poster le fichier une fois fini, car je pense qu'il peut être utile pour d'autres personnes (sujet liste déroulantes cachées : comment les faire apparaître, sujet bloqué sur VBA : comment le contourner, etc.)

Cependant, j'ai encore un dernier soucis. J'arrive à ouvrir une par une les différents "aides du département". J'arrive bien à copier les informations qui sont dans les cadres. Cependant, je n'arrive pas à copier l'innertext (le nom de l'aide - cadre vert).



C'est -à-dire, chaque cadre a un nom (logique) décrit comme :

Code : Sélectionner tout
1
2
<div class="titre_aide" id_titreaide_1="">>
Aide à la rénovation énergétique des logements anciens
Il n'a pas d'id (c'est vide). Il y a juste la class. J'ai cherché sur internet voir si la commande getElementsByClass existe (getElementsByClassname). Apparemment il y a des problèmes avec IE8 pour utiliser cette fonctionalité. J'ai continué à regarder, et il y a des gens qui ont créé des fonctions. Cependant, je n'arrive pas à les faire fonctionner.

Est-ce que quelqu'un a eu le même soucis ? Comment peut-on faire pour trouver des objets qui n'ont pas d'id ?

D'avance merci !!

Shaekin

Citation Envoyé par patricktoulon Voir le message
re
voila prends celui la
j'ai bloqué la derniere ligne du code elle sert a cliquer sur le bouton debloque si tu veux cliquer
je l'ai bloqué pour que tu vois bien que les items des 3 listes sont bien changés
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
sub test()
Dim ie As Object, url As String, liste1 As Object, liste2 As Object, parentliste3 As Object, lescript, code As String
url = "http://habitat-developpement.tm.p15.siteinternet.com/particuliers/index.cfm?cont=aide_habitat"
Set ie = CreateObject("internetexplorer.application")
ie.navigate url
ie.Visible = True
Do: DoEvents: Loop While ie.readystate <> 4 Or ie.busy
'*****************************************************************************************
'on casse la protection en coupant les script du code html
code = ie.document.body.innerhtml
lescript = Split(code, "<script")
code = Replace(code, Split(lescript(2), "/script>")(0), "")
ie.document.body.innerhtml = code 'on réimplante le code html dans le body du document
'*****************************************************************************************
Set liste1 = ie.document.all("departement")
Set liste2 = ie.document.all("code_beneficiaire")
'maintenant on va selectionner mon departement (83) par son index
liste1.selectedIndex = 84
'je suis proprio  donc le 2 item de la liste2  (locataire) donc l'index 2 puisque le 1 er c'est l'entete
liste2.selectedIndex = 2: liste2.onchange
    Application.Wait (Now + TimeValue("0:00:02"))
Set parentliste3 = ie.document.getelementbyid("objet")
 parentliste3.Children(0).selectedIndex = 2
'debloque cette ligne pour cliquer sur le bouton
ie.document.getelementbyid("monform").submit
End Sub
Avatar de patricktoulon patricktoulon - Expert éminent sénior http://www.developpez.com
le 09/11/2015 à 10:46
re
la technique de outrepasser la protection onwindow tu ne la trouvera null part

sans vouloir me venter je pense etre le seul sur le forum a avoir trouver ce subterfuge en meme temps c'est tellement evident (si une serrure est trop dure a ouvrir/ supprime la serrure )

appris comment :
et bien un peu beaucoup tout seul en lisant le code html des pages web en essayant de comprendre ce que chaque ligne veut dire

apres pour le reste il y a beaucoup d'exemple sur le forum et bien sur le tutoriel de qwazerty qui est exellent pour les debutants (manipulation des elements dans leur contexte)

apres pour certaines manips il te faudra apprendre et te gaméller plusieurs fois par toi meme
apres il faut dire que c'est un sujet qui m'interesse beaucoup on est 3 ou 4 a s'interesser au html/VBA

je vais regarder pour ton soucis d'element en vert bien que je comprend pas pourquoi si tu arrive a récupérer le reste
Avatar de patricktoulon patricktoulon - Expert éminent sénior http://www.developpez.com
le 09/11/2015 à 11:02
Bon voila

en fait visuellement les bandes vertes sont les barre de titres du div contenant le tetxte je dis bien visuellement

car dans le code se sont des elements bien éparés du div

donc comme a chaque div en vert (barre de titre) on aussi un div en dessous pour le reste c'est assez facile de faire le rapprochement

j'ai ajouter 4 ligne de code et c'est tout

c'est juste un exemple si tu tu veut detaille la récuperation il te faudra discéque le div "aide" a chaque fois
en l'etat je récupère dans une variable les titre et dans l'autre le reste

teste celui la
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Sub test()
Dim ie As Object, url As String, liste1 As Object, liste2 As Object, parentliste3 As Object, lescript, code As String
url = "http://habitat-developpement.tm.p15.siteinternet.com/particuliers/index.cfm?cont=aide_habitat"
Set ie = CreateObject("internetexplorer.application")
ie.navigate url
ie.Visible = True
Do: DoEvents: Loop While ie.readystate <> 4 Or ie.busy
'*****************************************************************************************
'on casse la protection en coupant les script du code html
code = ie.document.body.innerhtml
lescript = Split(code, "<script")
code = Replace(code, Split(lescript(2), "/script>")(0), "")
ie.document.body.innerhtml = code 'on réimplante le code html dans le body du document
'*****************************************************************************************
Set liste1 = ie.document.all("departement")
Set liste2 = ie.document.all("code_beneficiaire")
'maintenant on va selectionner mon departement (83) par son index
liste1.selectedIndex = 84
'je suis proprio  donc le 2 item de la liste2  (locataire) donc l'index 2 puisque le 1 er c'est l'entete
liste2.selectedIndex = 2: liste2.onchange
    Application.Wait (Now + TimeValue("0:00:02"))
Set parentliste3 = ie.document.getelementbyid("objet")
 parentliste3.Children(0).selectedIndex = 2
'debloque cette ligne pour cliquer sur le bouton

ie.document.getelementbyid("monform").submit
Do: DoEvents: Loop While ie.readystate <> 4 Or ie.busy
Set titreaide = ie.document.getelementsbyclassname("titre_aide")
Set aide = ie.document.getelementsbyclassname("aide")
For i = 0 To titreaide.Length - 1
MsgBox titreaide(i).innertext & vbCrLf & aide(i).innertext
Next
ie.Quit
End Sub
Avatar de Shaekin Shaekin - Futur Membre du Club http://www.developpez.com
le 09/11/2015 à 11:42
Merci beaucoup pour les réponses et surtout pour la réactivité!!

Effectivement, je trouve génial le tutoriel de qwazerty, mais il y a logiquement beaucoup plus de choses à comprendre/savoir.

J'essayerai donc d'aller peu à peu avec des codes HTML. Merci !

Concernant ta réponse sur le problème "technique", effectivement j'avais pensé d'utiliser le commande "GetElementsByClassName". J'ai copié-collé ton code et j'ai l'erreur 438 "Propriété ou méthode non gérée par cet objet". En gros par rapport aux recherches que j'ai fait, j'ai l'impression qu'il doit s'agir de ma version d'internet Explorer.

Peux-tu me dire quelle est ta version ? Penses-tu qu'il peut s'agir de ça (problème bête) ?

Merci encore une fois. J'ai déjà commencé avec un autre type de base de données dont il faut clicker pour aller au niveau inférieur, etc. J'espère arriver à comprendre le code tout seul et pourquoi par à développer une macro comme celle-ci.

En tout cas, vous êtes très sympas de m'aider.

Shaiken
Avatar de Shaekin Shaekin - Futur Membre du Club http://www.developpez.com
le 13/11/2015 à 14:56
Bonjour,

Je n'ai toujours pas réussi à faire fonctionner getElementsByClassName sur mon pc (Excel 2010 + IE V8). J'a trouvé sur internet des possibles bibliothèques (jQuery) mais je n'ai pas su les installer. Quelqu'un a rencontré le même problème ?

Je viens vers vous car je suis en train d'essayer de faire la même chose, récupérer une base de données internet mais cette fois ce n'est pas à travers une liste déroulante mais une liste dont il faut clicker pour afficher l'arborescence.

J'arrive à cliquer, mais je souhaite obtenir le nom des "options" ou "enfants". Exemple :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<DIV id=titre_arbo_after_recherche>Choisissez une catégorie de travaux ci-dessous :</DIV>
 
<DIV style="CLEAR: both"></DIV></DIV>
 
<DIV id=fam_69486 class="ligne_famille active" level="1" jQuery1447422562671="52">Gros oeuvre</DIV>
 
<DIV id=liste_fam_69486 level="1">
 
<DIV style="TEXT-ALIGN: center"><IMG src="http://chiffrage.batiactu.com/images/wait.gif"></DIV></DIV>
 
<DIV id=fam_66719 class=ligne_famille level="1" jQuery1447422562671="53">Second oeuvre</DIV>
 
<DIV id=fam_48646 class=ligne_famille level="1" jQuery1447422562671="54">Génie climatique - Plomberie - Sanitaire</DIV>
 
<DIV id=fam_48629 class=ligne_famille level="1" jQuery1447422562671="55">Électricité</DIV>
 
<DIV id=fam_48647 class=ligne_famille level="1" jQuery1447422562671="56">Aménagements extérieurs</DIV>
 
<DIV id=fam_48659 class=ligne_famille level="1" jQuery1447422562671="57">Multiservices</DIV></DIV></DIV></FORM></TD></TR>
 
<TR>
Comme j'ai "cliqué sur la première option, gros oeuvre, la ligne "<DIV id=liste_fam_69486 level="1">" s'active. C'est qui permet de regarder le submenu. Ci-dessous une capture d'écran :



Je souhaite récupérer les "id" des options (exemple : "fam_69487", etc. J'avais pensé à utiliser la commande "children" mais soit je ne sais pas l'utiliser, soit il ne s'agit pas d'enfants. Quelqu'un à une idée ?

Je vous remercie d'avance de votre aide

Shaiken
Avatar de patricktoulon patricktoulon - Expert éminent sénior http://www.developpez.com
le 13/11/2015 à 15:11
re
bonjour
getelementsbyclass name marche pas avec IE 8 ,tres mal avec IE9 a peu pres bien avec IE10 ,ie 11 c'est une autre histoire les librairies sont conditionnées autrement mais c'est une autre histoire

conclusion au mieux IE 10 ou IE11 sinon va faire une promenade ca te changera les idées
Avatar de haribo91 haribo91 - Membre à l'essai http://www.developpez.com
le 25/11/2015 à 12:02
Bonjour à tous,

Je relance mon poste puisqu'il est passé à la trappe suite au pbl de Shaekin^^.

Pour ma part j'essaye tout simplement de "recharger" la page en fonction de valeurs dans une liste déroulante.

Citation Envoyé par haribo91 Voir le message
Bonjour,

D'abord un grand bravo pour cet excellent tuto .

Pour ma part j'ai une question sur les listes déroulantes. Tu a montré comment sélectionner un item dedans ou comment récupérer tous les choix de cette liste, mais sur certains site lorsque l'on sélectionne un item et bien la page change en fonction de celui-ci.

Or avec la méthode de sélection que tu as décrite, rien ne se passe. Enfin le bon item est sélectionné dans la liste, mais la page ne change pas pour autant, et il n'y a pas de bouton "OK" pour valider mon choix sur la page..

Peux-tu m'aider sur ce point ?

Merci.

Haribo.

Voici mon code :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Sub ListeDeroulanteRecup()
 
Dim IE As New InternetExplorer
Dim IEDoc As HTMLDocument
Dim htmlTagCol As IHTMLElementCollection
Dim htmlSelectElem As HTMLSelectElement
Dim htmlGeneric As HTMLGenericElement
Dim NbrEntree As Integer
Dim TableauValeurDate()
Dim TableauValeurResultats()
Dim TheEntree As Integer
 
   'Ouvre la page Web
   IE.Navigate "https://www.fdj.fr/jeux/jeux-de-tirage/loto/resultats"
   IE.Visible = False
 
   WaitIE IE
 
   Set IEDoc = IE.document
 
   'On va sur l'objet qui contient la liste des indices
   Set htmlSelectElem = IEDoc.getElementById("selectTirage")
 
   'On détermine le nombre d'entrées contenues dans la liste
   'Ce nombre correspond au nombre de balises <option
   Set htmlTagCol = htmlSelectElem.getElementsByTagName("option")
   NbrEntree = htmlTagCol.Length
 
   'On redimensionne le tableau qui va contenir les valeurs
   ReDim TableauValeurDate(NbrEntree)
   ReDim TableauValeurResultats(NbrEntree)
 
   'On boucle sur chaque entrée
   For TheEntree = 1 To NbrEntree - 1
      ' DATE
      TableauValeurDate(TheEntree - 1) = htmlTagCol(TheEntree).innerText
 
      ' RESULTATS TIRAGE
      TableauValeurResultats(TheEntree - 1) = IEDoc.getElementsByClassName("loto_numeros mb10 fl sprite-jeux-bg_resultat_loto")(0).innerText
 
      'On sélectionne l'indice n+1
      htmlSelectElem.selectedIndex = TheEntree
      htmlSelectElem.FireEvent ("onchange")
      'htmlSelectElem.Click
 
      WaitIE IE
   Next
 
   'On place ces valeurs dans une Feuille Excel
   ThisWorkbook.Sheets("Valeur_Liste").[A4].Resize(NbrEntree).Value = WorksheetFunction.Transpose(TableauValeurDate)
   ThisWorkbook.Sheets("Valeur_Liste").[B4].Resize(NbrEntree).Value = WorksheetFunction.Transpose(TableauValeurResultats)
 
   Set IE = Nothing
   Set IEDoc = Nothing
 
End Sub
 
Sub WaitIE(IE As InternetExplorer)
   'On boucle tant que la page n'est pas totalement chargée
   Do Until IE.ReadyState = READYSTATE_COMPLETE
      DoEvents
   Loop
End Sub
J'ai essayé avec .click() et .fireEvent("onchange") mais aucun ne semble fonctionner.
Je suis avec IE 11.

Merci

Haribo.
Avatar de haribo91 haribo91 - Membre à l'essai http://www.developpez.com
le 04/01/2016 à 15:11
Hello,

Personne ne veut plus m'aider ?
Avatar de Qwazerty Qwazerty - Expert éminent http://www.developpez.com
le 04/01/2016 à 19:09
Salut et bonne année à tous

Alors, la FDJ fait visiblement quelques contrôles supplémentaires pour s'assurer que les manip sur la page ne sont pas faite via du code mais bien par actions humaines. J'imagine donc qu'ils n'apprécient pas trop la manœuvre.

Quoiqu'il en soit merci de créer un autre fil pour traiter des différents problèmes rencontrés afin de ne pas surcharger encore plus celui-ci, merci .

Envoi moi un MP quand tu auras créé ce fil de discussion, même si je vois pas trop de solution.

++
Qwaz
Offres d'emploi IT
Chrome Apps
Stage
Substantiel - Ile de France - Montrouge (92120)
ASSISTANT(E) EN GESTION LOCATIVE
CDI
Groupe Ergalis - Ile de France - PARIS
Analyste programmeur html5
CDI
CTS - Bretagne - Rennes (35000)

Voir plus d'offres Voir la carte des offres IT
Responsable bénévole de la rubrique Visual Basic 6 : le Service Publications -