Manipulation d'Internet Explorer via VB

Les rubriques (actu, forums, tutos) de Développez
Réseaux sociaux


 Discussion forum

Le 03/03/2012, par Qwazerty, Expert Confirmé Sénior
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


 Poster une réponse

Avatar de sogedic sogedic
Invité de passage
le 02/09/2012 16:13
Je voulais utiliser le super tuto de QUAZERTY, mais ie.navigate affichait la page et perdait la connection.
Apres de longue recherche sur Internet :


Code :




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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
'Activer les références
'   - Microsoft HTML Objects Library
'   - Microsoft Internet Controls
'   - Microsoft shell control et automation

'Dans un module
Option Explicit
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'---
Const StUrl = "C:/Users/Saugedic/Documents/MonSite/CreationPage.html"
'---

'*********************************************
' Se Connecter à une page Html local
'*********************************************
Sub connexion()
On Error GoTo ERR_Sub

'Afficher la page html
'---------------------
Dim ie As InternetExplorer
Set ie = New InternetExplorer

With ie
    .Visible = True
    .navigate StUrl
    'affiche la page et .. perd la connection - ie.readystate vide -> err
    '   Do Until .readyState = 4
    '       DoEvents
    '   Loop
End With
' Attendre la fin du chargement
Sleep (300)

'Se (re)connecter
Dim objShell As Object, obj As Object
Set objShell = New Shell

For Each obj In objShell.Windows
    If TypeName(obj.document) = "HTMLDocument" Then
        If obj.LocationName Like "*CreationPage*" Then
        'Des que l'on trouve l'instance chargée - Reconnecter la page
            Set ie = obj
            Exit For
        End If
    End If
Next

'Ecrire dans la page
'---------------------
' Dim IEdoc As Object - Set IEdoc = ie.document

' Formulaire de connexion ...
     ie.document.all("autre").Value = "login"
     ie.document.all("Bouton1").Click
 'F12 sur Google pour connaitre les noms des champs    
     
GoTo FIN_Sub
'--------------------

ERR_Sub:
    MsgBox "Erreur : " & Err.Number & " (" & Hex(Err.Number) & ")" & vbCrLf & Err.Description
    On Error GoTo 0

FIN_Sub:
'--------------------
ie.Quit
Set ie = Nothing
'Set IEdoc = Nothing

'---
End Sub


'Pour tester
'*********************************************
' Créer une page html
'*********************************************
Sub test()
On Error GoTo ERR_Sub
   
'Creer la page html
'--------------------
Dim xFile As Integer

xFile = FreeFile
Open "C:\Users\Saugedic\Documents\MonSite\CreationPage.html" For Output As xFile

Print #xFile, "<HTML>"
    Print #xFile, "<HEAD>"
    Print #xFile, "<TITLE>Ma page de saisie</TITLE>"
    Print #xFile, "</HEAD>"

    Print #xFile, "<BODY>"
    Print #xFile, "<FORM>" & _
        "<input type='text' size='10' name='autre'><br>" & _
        "<Input type=button name='Bouton1' value='Validez'>" & _
        "</FORM>"
    Print #xFile, "</BODY>"
Print #xFile, "</HTML>"
    
Close xFile


Exit Sub
'---
ERR_Sub:
    MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description
    Error 0
'---
End Sub

** J etrouve toujours tout sur ce site, alors pour une fois **
Avatar de Qwazerty Qwazerty
Expert Confirmé Sénior
le 03/09/2012 7:30
Salut
Deux internautes ont des problèmes similaires. Voila l'un des posts, j'y apporte une solution similaire à celle que tu proposes.

Pour information, je ne pense pas que la liaison entre Ie et la variable se déconnecte, je pense plutôt que l'IE que tu ouvre, ouvre lui-même une autre fenêtre, puis se ferme. Pourquoi... ça je n'en sais rien...

Merci pour le retour, bonne journée

++
Qwaz
Avatar de Qwazerty Qwazerty
Expert Confirmé Sénior
le 07/09/2012 17:22
Salut

... j'ai oublié le lien vers le sujet en question... le voici

Et le code en question

Code :




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
Sub PremierIEGet()
'Déclaration des variables
Dim FirstIE As New InternetExplorer 'cette instance contiendra la page qui charge en boucle
 
Dim IE As InternetExplorer 'Dim IE As New InternetExplorer
Dim objShell As Shell
Dim obj As Object
 
FirstIE.Navigate "www.google.fr"
FirstIE.Visible = True ' a vous de voir, il est possible de la garder masquée, mais attention a ne pas oublier de la fermer avant de finir la macro
 
'Ensuite on recherche la nouvelle instance d'IE qui a été ouverte par la 1ère instance...
'Ici il faudra peut-être mettre une petit Sleep histoire d'être sur que cette 2ème instance se soit chargée
'Je suis pas fan des sleep, mais bon... des fois...
 
'On charge la collection des appli lancés
Set objShell = New Shell
'On boucle
For Each obj In objShell.Windows
    'On regarde si l'appli est de type Document internet
    If TypeName(obj.document) = "HTMLDocument" Then
        'On regarde si c'est bien l'instance qui a chargé Google
        If obj.LocationName = "Google" Then
            'On pointe cette instance via la variable IE
            Set IE = obj
            'On quite la boucle
            Exit For
        End If
    End If
Next
 
'Ensuite on utilise IE
'...
'...
'IE.Visible = True 'Logiquement celle-ci doit déjà être visible
IE.Navigate "www.developpez.com"
 
 
'Fermeture d'IE
'IE.Quit
 
'On libère la variable IE (bien que VBA s'en occupe à la fin de la procédure)
Set IE = Nothing
End Sub

++
Qwaz
Avatar de Qwazerty Qwazerty
Expert Confirmé Sénior
le 19/09/2012 19:11
Salut

Petite mise à jour, suite à une question sur les positions d'éléments en fonction des numéros d'items.

Afin de faciliter les recherches d'éléments dans les pages web, j'ai ajouté une page supplémentaire au fichier lié au tutoriel(j'ajouterais une petite info rapide dans le corps du tutoriel dès que possible).

Vous trouverez sur l'onglet "Arborescence" deux boutons, le première nommé "Web" charge une page IE, un message s'affiche, vous invitant à naviguer jusqu'à la page que vous souhaitez scanner. Une fois cette page atteinte, il vous suffit d'appuyer sur le 2ème bouton, "Scan".
La liste des éléments contenus dans la page apparaît alors, avec les attributs que vous avez demandé à afficher. Pour obtenir des attributs supplémentaires, il suffit d'ajouter des entêtes de colonne en respectant le nom exact de l'attribut souhaité (la casse n'est pas prise en compte).

Si vous souhaitez scanner une autre page, il vous suffit de continuer à utiliser la même instance d'IE pour rejoindre la nouvelle page et de cliquer de nouveau sur le bouton "Scan"

Pour info, dans la colonne type, vous trouverez certainement des "Permission refusée", visiblement c'est le cas lorsque l'élément en question est une frame, je ne peux pas malgré tout garantir que ce ne sera le cas uniquement pour les frames... quoiqu'il en soit, c'est peut-être un bon moyen de les repérer rapidement

Bon dev' à tous

++
Qwaz
Avatar de Qwazerty Qwazerty
Expert Confirmé Sénior
le 22/09/2012 12:21
Salut
Suite à un MP de bolof qui me proposait d’exploiter ce fichier pour lister également le contenu des frames, j'ai modifier un peu le contenu du fichier.
Voila une nouvelle évolution, je ne l'ai pas mise en ligne pour l'instant, ça mérite quelques teste avant . Si vous avez l'occasion de tester tenez moi au courant.

Amélioration
  • Un paramètre permet de choisir de lister le contenu des frames et égallement les frames, des frames, des frames....

  • Des groupes sont placés sur la feuille pour permettre de déployer ou non les sous frames



++
Qwaz
Avatar de poilou2607 poilou2607
Invité de passage
le 14/11/2012 16:14
Bonjour,
Est-il possible de créer le même type d'objet que :

Code :




Set IE = CreateObject("InternetExplorer.Application")

mais avec Google Chrome ? Et par conséquent avoir les mêmes propriétés qui permettraient par exemple de lire la source HTML, d'extraire des données ...

Merci d'avance !

PS : J'ai essayé : CreateObject("ChromeTab.ChromeFrame") mais sans succès
Avatar de Qwazerty Qwazerty
Expert Confirmé Sénior
le 25/11/2012 8:33
Salut

A ma connaissance, non.

Pour que ça fonctionne il faudrait avoir un descriptif et un accès aux bibliothèques qu'utilisent chrome ou avoir au moins un fichier tlb peut-être.
Enfin je ne suis pas sur à 100% de ce que je te dis la, mais je ne suis pas sur que google offre la possibilité de manipuler sont explorateur, pour IE ont reste dans le même distributeur, il a donc tout interêt a rendre ses produit compatible et/ou interactif.
Ceci dis, pour le boulot j'ai déjà fait des macro VBA qui manipuler le logiciel conversationnel Extra! d'Attachmate et j'avais à l'époque trouvé un fihcier tlb qui permet d'avoir la descriptif des outils en utilisant l'inspecteur d'objet VBA. Les déclaration par contre étaient forcement en late binding.

++
Qwaz
Avatar de xavion xavion
Invité de passage
le 04/04/2013 22:52
Bonsoir,

merci pour le tuto. Pensez-vous que cela est "adaptable" à safari pour mac?
Bien à vous,

xav
Avatar de Qwazerty Qwazerty
Expert Confirmé Sénior
le 05/04/2013 20:27
Salut

Non je ne pense pas mais je ne peux pas le confirmer, par contre le code serait différent, les méthodes ne serait pas les mêmes, il faudrait que Safari mette à dispo une DLL contenant les méthodes pour communiquer avec lui.

En cherchant vite fait Safari + vba sur google, j'ai vu des codes qui utilisent du script apple mais ça semble limité (?).

Bon courage

++
Qwaz
Avatar de gsweet1981 gsweet1981
Invité de passage
le 15/04/2013 0:54
Bonjour,

Voulant créer un tableau excel qui reprendrait certaines infos sur le net pour ma passion de la simulation aérienne afin de préparer mes vols (info météo,itinéraire, calcul du fuel et extra fuel, reprises des pistes de décollages et d’atterrissage selon les conditions météos ....)
Je souhaiterai récupérer quelques données à partir de certains site internet site (itinéraire) , c'est ainsi que l'on m'as aiguillé vers vous et que j'ai pu lire un peu lu votre tutoriel mais comme je ne suis pas sure des codes VBA a utiliser et la complexité de programmation, je n'ai jamais touché au VBA et j'ai donc peur de faire une mauvaise manipulation dans mon tableur qui viendrait à foutre en l'air le travail dont j'ai déjà fait jusqu’à présent.
Vous trouverez mes ambitions avec toute les précisions dont je souhaiterai faire sur ce tableur : http://www.developpez.net/forums/d13...le--question-/

C'est ainsi que je voudrais vous demander s'il est possible que vous me donniez les codes VBA (prêt à l'usage pour mon projet).
Serait-il possible selon votre envie et votre disponibilité que vous me fassiez celà?
Bien à vous,
Greg
Avatar de nabil44 nabil44
Invité de passage
le 17/04/2013 16:40
Bonjour,

Toutes mes félicitations pour ce travail de qualité et généreux.

Il m'a bien servi pour mon projet. J'ai juste un peu de mal avec les techniques de récupération de texte à partir d'une page web. C'est du probablement à ma très relative maîtrise du sujet. Aurais-tu une référence à me conseiller pour approfondir ce point ?
Merci d'avance et encore bravo.

PS : Je sais j'ai découvert un peu tard le tuto !
 
 
 
 
Partenaires

Hébergement Web