IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Pilotage Internet Explorer


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Pilotage Internet Explorer
    Bonjour à tous,

    Tout d'abord, merci Qwazerty pour cet excellent tuto. Très bien construit.
    Il y a peut être juste un léger souci dans 2 commentaires sur la fin...

    J'interviens car je me retrouve confronté exactement au même problème que Le_ménéstrel.
    A mon travail, une instance IE s'ouvre, indique 'connexion en cours...' avec la petite animation, et la boucle do...loop qui suit ne finit jamais. J'ai différentes combinaisons de code, enlever le .navigate, le mettre après le .visible = true, le changer en .navigate2... j'ai aussi tenté le .stop, le .silent = true, le .GoHome (avec différentes pages d'accueil : l'intranet entreprise, google, about:blank), il veut rien savoir.
    En fait, juste avec le .visible, même à la main rien ne se charge, pas d'erreur mais l'affichage reste désespérément vide dans IE et toujours le message 'connexion en cours...'

    Bien sûr sur mon PC perso, tout fonctionne impeccable...

    Je continue de chercher, la solution de reprendre une instance existante ne me séduit qu'à moitié car l'idée est de lancer des traitements en fin de nuit.

    A vous lire

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    Citation Envoyé par bolof Voir le message
    Tout d'abord, merci Qwazerty pour cet excellent tuto. Très bien construit.
    Il y a peut être juste un léger souci dans 2 commentaires sur la fin...
    Peux tu m'en dire plus, si des passages ne te paraissent pas correct n'hésite pas à le signaler sur le post du tutoriel

    J'ai différentes combinaisons de code, enlever le .navigate, le mettre après le .visible = true,
    Ca ça ne changera jamais rien, le .visible=True rend seulement l'instance d'IE visible aux yeux de l'utilisateur, ce qui n'empêche pas à l'instance de poouvoir travailler normalement lorsque celle ci n'est pas visible.
    le changer en .navigate2...
    Dommage, j'avais bon espoir
    j'ai aussi tenté le .stop, le .silent = true, le .GoHome (avec différentes pages d'accueil : l'intranet entreprise, google, about:blank), il veut rien savoir.
    En fait, juste avec le .visible, même à la main rien ne se charge, pas d'erreur mais l'affichage reste désespérément vide dans IE et toujours le message 'connexion en cours...'
    Comme je l'ai dit au créateur du post, je n'ai pas le même cas au boulot, il m'est donc difficile de faire des essais.
    Je continue de chercher, la solution de reprendre une instance existante ne me séduit qu'à moitié car l'idée est de lancer des traitements en fin de nuit.
    Si je propose cette solution, et vous semblez avoir tout les deux le même problème, c'est parce que si j'ai bien compris, lorsque vous lancez une instance d'IE, celle-ci affiche une feuille d'attente et une second session d'IE est lancer contenant la page que vous souhaitiez charger?
    C'est donc cette seconde session qu'il serait intéressant de pointer, car c'est avec elle qu'il va falloir interagir.
    Il ne faut pas chercher à utiliser une boucle d'attente sur la 1ere instance d'IE, il faut ignorer cette instance.

    Voila ce que je vous propose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dite moi si ça colle à vos besoin.
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Re, merci de ta réponse rapide (et merci au modo au passage)
    Citation Envoyé par Qwazerty Voir le message
    Salut

    Peux tu m'en dire plus, si des passages ne te paraissent pas correct n'hésite pas à le signaler sur le post du tutoriel
    OK fait, merci.

    Citation Envoyé par Qwazerty Voir le message
    Ca ça ne changera jamais rien, le .visible=True rend seulement l'instance d'IE visible aux yeux de l'utilisateur, ce qui n'empêche pas à l'instance de poouvoir travailler normalement lorsque celle ci n'est pas visible.
    Est-ce que cela veut dire que l'instance d'IE est créée dès que la variable est déclarée, donc dès qu'on rentre dans la fonction ? J'ai pas contrôlé ça, mais maintenant que tu le dis c'est logique que l'instance ne soit pas créée par .visible, en effet.

    Citation Envoyé par Qwazerty Voir le message
    Dommage, j'avais bon espoir

    Comme je l'ai dit au créateur du post, je n'ai pas le même cas au boulot, il m'est donc difficile de faire des essais.

    Si je propose cette solution, et vous semblez avoir tout les deux le même problème, c'est parce que si j'ai bien compris, lorsque vous lancez une instance d'IE, celle-ci affiche une feuille d'attente et une second session d'IE est lancer contenant la page que vous souhaitiez charger?
    C'est donc cette seconde session qu'il serait intéressant de pointer, car c'est avec elle qu'il va falloir interagir.
    Il ne faut pas chercher à utiliser une boucle d'attente sur la 1ere instance d'IE, il faut ignorer cette instance.

    Voila ce que je vous propose.
    ...
    Dite moi si ça colle à vos besoin.
    ++
    Qwaz
    Faut-il activer une librairie pour l'objet shell ? Peux pas tester ton code... Mais je vois l'idée. J'arrive pas à savoir si c'est vraiment ça la cause de mon souci. J'ai plutôt l'impression qu'une seule instance se charge, y'a pas de seconde session. L'idée de le_menestrel doit être de charger un IE avant de lancer la macro, et de s'en servir dans la macro vba en récupérant cette instance déjà ouverte et fonctionnelle.

    Je pensais avoir trouvé une solution pour contourner cela, en travaillant sous access, avec un formulaire doté d'un contrôle WebBrowser, on récupère le IE dans Form.WebBrowser.Object et IEDoc dans IE.Documents etc., j'arrive bien à charger une page (IE.Navigate "http...") mais je ne trouve pas les informations de la page dans IEDoc en fouinant dans l'espion :-(

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Ok pour le retour, c'est en cours de traitement .

    Pour la session, celle-ci est en effet créée lors de sa déclaration parce que New est utilisé, voir le passage sur early et late biding.

    Il faut activé la bibliothèque "Microsoft Shell controls and automation".

    Peux tu me ré-expliquer le problème, que ce passe t il lorsque tu essais de lancer une instance via le code VBA? c'est cette instance qui se plante et plus rien ne se passe?

    A ton boulot, est ce que tu ne fonctionnerais pas avec un server applicatif distant? n'aurais tu pas un IE local et un IE distant?

    Pour la dernière partie de ton mail, j'ai mois-même des soucis sur certaine appli web que l'on utilisent au boulot, certaine (notamment une) ne permet pas la manipulation via VBA... le code source est bien visible, mais la variable VBa Document ne contient pas la même chose.... Je n'ai pas encore d'explication à se phénomène.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    OK pour le New, en effet

    Ce matin j'ai activé cette bibliothèque 'Shell control et automation', et là magie, IE s'ouvre sans erreur, dans toutes les macros... Bon, du coup pour vérifier, je la désactive, ben ça fonctionne toujours pour finir, je l'ai laissée activée, on sait jamais. Enfin ça fonctionne.

    Mais effectivement, même chose que dans access, la variable locale VBA ne contient pas la structure de la page, ça pourrait être lié aux frames (hé oui on développe encore des pages pourries à base de frames...) - j'ai deux bêtes frames vides dans la structure de document, va falloir fouiner encore un peu...

    Merci de ton aide !

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Trouvé !

    C'est bien ça, ma page d'accueil ne contient guère plus que 2 frames, et tout le code de la page 'utile' est dans un des deux. Dans l'espion, impossible de trouver le contenu de la frame (ou bien ai-je mal cherché ?...), mais après un peu de recherche, avec une ligne de code en plus on y est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Set IEDoc = IE.document
        Set IEDoc = IEDoc.frames(0).document
    Et le reste de la macro ne bouge pas. Là, dans l'espion, on retrouve bien toute la structure :-) [C'est ptet pas très propre, mais avec un bout de commentaire ça me conviendra très bien ]

    Ca va être génial tout ça

  7. #7
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Ben non y'a rien de "pas propre" tu accèdes au contenu en pointant le contenu de la frame, c'est parfait.

    Bonne continuation

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pilotage Internet Explorer
    Par itwoo dans le forum Macros et VBA Excel
    Réponses: 333
    Dernier message: 13/11/2015, 10h55
  2. Réponses: 193
    Dernier message: 13/12/2014, 07h48
  3. [XL-2010] Pilotage Internet explorer contenant javascript depuis excel
    Par anthony14123 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/12/2013, 15h08
  4. [XL-2003] Pilotage Internet Explorer
    Par clarinet dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 25/03/2013, 19h13
  5. [OLE] Pilotage internet explorer
    Par yaclo dans le forum MFC
    Réponses: 4
    Dernier message: 22/03/2005, 20h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo