Manipulation d'Internet Explorer via VB

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


 Discussion forum

Le , 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


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


 Poster une réponse

Avatar de Maume Maume
http://www.developpez.com
Invité de passage
le 07/02/2014 14:00
Après quelque recherche j'ai trouvé qu'il était possible de copier coller une page internet.
Fin copier pour l'instant, le code ci dessous permet de copier la page dans le presse papier mais pas de le coller dans excel je pense que c'est du au fait que excel passe en tache de fond quand on utilise internet explorer, mais je sais pas comment le corriger...

Code :
1
2
3
4
5
6
7
8
9
10
11
Sub Copypaste() 
    Set IE = CreateObject("InternetExplorer.Application") 
    IE.navigate "http://fr.wikipedia.org/wiki/ASIT" 
    IE.Visible = True 
    Application.Wait (Now + TimeSerial(0, 0, 5)) 
    SendKeys "^a" 
    SendKeys "^c" 
    Sheets("Feuil1").Select 
    Range("A1").Select 
    ActiveSheet.Paste 
End Sub
Avatar de Oliv- Oliv-
http://www.developpez.com
Membre Expert
le 04/03/2014 14:57
Citation Envoyé par AlainTech  Voir le message
Bonjour à tous,

Je l'ai déjà mentionné dans de nombreuses discussion mais il me paraît utile de le dire ici.
Même quand IE a terminé, il se peut que le Document (le contenu de la page) n'ait pas fini de se charger.

Après chaque changement de page, il faut répéter la structure suivante:

Code :
1
2
3
    WaitIE IE 
    Set IEDoc = IE.document 
    WaitDoc IEDoc
avec les 2 procédures d'attente:
Code :
1
2
3
4
5
6
7
8
9
10
11
Sub WaitIE(IE As InternetExplorer) 
  Do While Not IE.readyState = READYSTATE_COMPLETE 
    DoEvents 
  Loop 
End Sub 
  
Sub WaitDoc(doc As HTMLDocument) 
  Do While Not doc.readyState = "complete" 
    DoEvents 
  Loop 
End Sub
Testé et retesté dans de nombreux contextes...

Bonjour,
J'utilises effectivement cette méthode, qui fonctionne bien en général par contre je fais face à une page utilisant du angular.js et les infos dont j'ai besoin n'arrivent qu' après que IE.readyState = READYSTATE_COMPLETE et doc.readyState = "complete"

Peut on attendre la fin du chargement du DOM à l'aide de l'événement DOMContentLoaded ?
Voyez vous une autre solution ?
Avatar de noftal noftal
http://www.developpez.com
Membre actif
le 04/03/2014 18:32
@Oliv
J'applique tes conseils depuis l'origine (WaitIE et WaitDoc) mais cela ne m'empêche pas d'avoir des plantages aléatoires selon la réactivité de l'affichage des pages web
Avatar de Qwazerty Qwazerty
http://www.developpez.com
Expert Confirmé Sénior
le 07/03/2014 11:51
Salut

@Maume : Justement le but du tutoriel est d'éviter ce mode opératoire. AlainTech dans son message du 20/12/2013, 11h47, semble avoir donné une solution pour ces problèmes de décrochages.

@Oliv : DOMContentLoaded est validé dès le chargement de la page et justement sans que les données ne soient entièrement chargées, http://ie.microsoft.com/TEStdrive/HT...d/Default.html

Je n'ai pas pris le temps de faire plus ample recherche sur le problème.

++
Qwaz
Avatar de metramo metramo
http://www.developpez.com
Invité de passage
le 05/06/2014 10:06
D'habord merci pour ces explications qui sont plus claires et utilisables que tou ce que j'ai pu trouver en anglais sur le web.

Mais avec mon deuxième page web intranet a automatiser, je rencontre un problème, au moment de
"Set IEDoc = ie.Document"
ce message d'erreur
"Run Time Error
Automation error
The document has disconnected from its clients"

Ca parle un peu, mais comment contourner.

J'ai vu qu'on peut creer une reference a excel et la session retouné est la (ou un des) sessions excel

Est-ce le me^me type de problèmatique qu'avec un pop up ?
Avatar de AlainTech AlainTech
http://www.developpez.com
Modérateur
le 05/06/2014 12:44
Bonjour metramo,

Voir le message 66 de cette discussion.
Avatar de patricktoulon patricktoulon
http://www.developpez.com
Expert Confirmé Sénior
le 13/07/2014 13:36
bonjour a tous

curt :
pour récupérer le code source tu peut de servir d'une requête avec l'object (micosoft,xmlhttp) tu trouvera plein exemple dans mes discutions et même dans le forum contribuer (getcodesource) avec mon identifiant

qwazerty :
je viens de découvrir une chose bien étonnante je n'y avais jamais fait attention mais ca me parait important

il se trouve que si je déclare l'object IE en late binding
Code :
1
2
dim ie as object  
set ie=createobject("internet.application")
il n'est plus nécessaire d'activer les références
Microsoft internet control
Microsoft HTML object Library
il semblerait que ces api soit embarqué l'ors de la création de l'objet

je viens de faire l'essai sur 10 fichiers Excel vierges et c'est sans exception aucun plantage
utilisation de getelementby(tagname,id,classname)
simulation de click ect......tout a fonctionné

l'avais tu remarqué?
Avatar de Marc-L Marc-L
http://www.developpez.com
Expert Confirmé Sénior
le 13/07/2014 14:52


Bonjour,

heu oui, comme dans cette discussion ?
Avatar de Qwazerty Qwazerty
http://www.developpez.com
Expert Confirmé Sénior
le 13/07/2014 15:40
Salut

Oui Patrick, c'est tout l'intérêt du late binding, c'est justement de ne pas avoir à activer les références, c'est d'ailleurs pour cette raison que le late binding résout les problèmes de versions.

Je le dis d'ailleurs dans mon tutoriel

II-B-1. Late Binding

Si vous choisissez de ne pas utiliser le référencement, voici le type de code que vous utiliserez

Toutefois, j'utilise souvent le early binding pour répondre au gens, car l’auto-complétion est un très bon moyen pour que les gens qui demande de l'aide puisse modifier à leur compte le code, et ainsi, je l'espère, mieux comprendre l'objet qu'ils manipulent.
Et pour être honnête, l'auto-complétion m'arrange bien aussi car je ne connais pas par coeur toutes les propriétés et les fonctions des objets IE. Quand il s'agit de rechercher de nouvelles façon de faire, il est souvent très utile d'aller rechercher et tester des propriétés ou fonctions "nouvelles" et où les trouver si ce n'est dans l'explorateur d'objet VBA ou dans l'auto-complétion, tout deux liés au référencement.

Bonne continuation

++
Qwaz
Avatar de patricktoulon patricktoulon
http://www.developpez.com
Expert Confirmé Sénior
le 13/07/2014 15:51
bonjour qwazerty

ayant basculer très vite avec le Microsoft xmlhttp pour des raison de velocité je n'ai pas lu jusque la

10 coup de fouet pour moi
Avatar de Marc-L Marc-L
http://www.developpez.com
Expert Confirmé Sénior
le 30/07/2014 17:29

Bonjour,

juste une observation à propos du chapitre IV-B-2. GetElementsByName :
cette méthode n'est pas traitée dans cet excellent tutoriel car la méthode all renvoie les mêmes éléments.

Pour des éléments ne possédant pas d'ID (zone de sélection, bouton image, …) mais disposant bien d'un nom (Name),
sur une page tordue (dans le sens où même un form.submit ne déclenche rien) la méthode Document.all ne trouvant pas
un bouton image, j'étais passé par une cascade de children de children …
Hors en testant pour un autre élément, la méthode Document.GetElementsByName trouve bien ce bouton image !

En résumé, si la méthode all ne trouve pas un élément par son nom, penser alors à la méthode GetElementsByName …

_________________________________________________________________________________________________
We are all very ignorant, what happens is that not all ignore the same things … (Albert Einstein)

Offres d'emploi IT
Comptable Gérance (H/F) - CDI
CDI
Grey Consulting - Ile de France - Paris - 2ème arrondissement
Parue le 02/09/2014
Ingénieur qualification et tests logiciels (h/f)
CDI
Page Personnel - Nord Pas-de-Calais - Métropole lilloise
Parue le 19/09/2014
Chef de Projet Technique php/mysql
CDI
Easy Partner - Ile de France - Paris (75000)
Parue le 19/09/2014

Voir plus d'offres Voir la carte des offres IT
 
 
 
 
Partenaires

PlanetHoster
Ikoula