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


 Poster une réponse

Avatar de AlainTech AlainTech
http://www.developpez.com
Modérateur
le 07/01/2014 17:07
Bonjour,

Suite à la demande de itwoo à propos d'un Frame, voici ce que j'ai pu retrouver dans mes archives:

Code :
1
2
3
4
5
6
7
8
9
10
11
  Dim objFrame As HTMLIFrame 
 
    Set objDoc = objIE.document 
    Do While Not objDoc.readyState = "complete" 
      DoEvents 
    Loop 
 
    Set objFrame = objDoc.getElementsByName("page")(0) 
    Do While Not objFrame.readyState = "complete" 
      DoEvents 
    Loop
Dans mon cas, la frame avait pour nom "page".
Un objet Frame a une propriété readyState comme un Document.
Avatar de noftal noftal
http://www.developpez.com
Membre actif
le 08/01/2014 13:13
Bonjour,
Euh, c'était quoi la question de itwoo ?
De mon côté, je n'ai toujours pas de solution au pb de l'attente du chargement d'une page Web (hormis la technique du sleep qui n'est pas très robuste)
J'ai essayé le WaitIE, le WaitDoc évoqués plus haut.
Ca ne résout pas totalement la question.
Avatar de AlainTech AlainTech
http://www.developpez.com
Modérateur
le 08/01/2014 16:29
Bonjour,

Il s'agissait de l'attente du remplissage d'une partie de la page qui est, en fait, un Frame.
Il est possible de contrôler le ReadyState d'un Frame tout comme pour IE et le Document.
Avatar de Eric Eric
http://www.developpez.com
Invité de passage
le 17/01/2014 18:37
Merci à AlainTech pour la résolution du problème (à partir de IE8)
"Erreur Automation : L'objet invoqué s'est déconnecté de ses clients"
En suivant ses recommandations mon problème a disparu...
Avatar de Maume Maume
http://www.developpez.com
Invité de passage
le 05/02/2014 22:35
Citation Envoyé par Qwazerty  Voir le message

Je n'ai pas plus d'info à propos de ce problème, j'ai un soucis "similaire" à mon travail, nous avons un programme intranet sur lequel on gère notre activité journalière. Le code du site semble généré dynamiquement à l'ouverture de la page, j'accède bien au code avec l'inspecteur de code de mon navigateur, par contre impossible d'y accèder via un code VBA...
Par contre aucun message.

En conclusion, tout ne semble pas faisable par cette méthode, j'esserai peut-être de faire plus de recherche sur le sujet en regardant sur la page de ma banque si le même problème apparait (mais c'est pas pour tout de suite désolé ).

++
Qwaz

Bonjour

Ne serait-il pas possible de contourner le problème? Existe-t-il une commande VBA pour faire une action similaire à Crtl+A Ctrl+C sous internet explorer. Si c'est le cas on peut s'en servir pour copier collé le contenus d'une page web dans une feuille excel et après le retravailler avec une macro.

Cordialement
Fabian
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.
Offres d'emploi IT
Rédacteur technique
CDI
Easy Partner - Provence Alpes Côte d'Azur - Marseille (13000)
Parue le 01/07/2014
Responsable Marketing Client
CDD
Lagardere Active Digital - Ile de France - Levallois-Perret (92300)
Parue le 12/06/2014
Développeur php5
Alternance
IP-FORMATION - Ile de France - Paris (75000)
Parue le 04/07/2014

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

PlanetHoster
Ikoula