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 :

Manipulation d'Internet Explorer via VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut Manipulation d'Internet Explorer via VBA
    Bonjour,

    Bravo pour ce tutoriel.
    J'ai un peu de mal à l'exploiter à fond car l'astuce qui consiste à espionner la valeur IE ne donne pas les mêmes résultats chez moi.



    Uploaded with ImageShack.us
    A quoi est-ce dû ?

    Je travaille avec Excel 2000 et visual basic 6

  2. #2
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    @Qwazerty

    J'ai bien compris la fonction F12 et je l'ai bien sûr utilisée mais ce que j'aime bien dans ta méthode avec l'espionnage de IE c'est que l'on a le type de chaque élément. Ce qui est drôlement utile pour déclarer ses propres variables.
    Et même en mettant un espion sur Set IEdoc, je n'obtiens pas ces infos.
    et cela ne semble pas dû qu'au site web car j'ai le même pb avec l'exemple de ton tuto (google.fr).

    Sinon, j'ai quelques questions pour bien comprendre.

    1°/ Existe-t-il une méthode qui permet d'aller chercher des infos d'un site web sans ouvrir la page web ?

    2°/ Pour m'entraîner, j'essaye d'appliquer ta méthode pour récupérer les infos qui se trouve dans un tableau name=info-valeur list" du site web suivant :
    http://www.boursorama.com/cours.phtml?symbole=3eFILBB
    et les copier dans 2 colonnes d'un fichier XL

    J'ai trouvé une première méthode qui se base sur la recherche de l'Id situé juste au-dessus. Ca marche mais je trouve pas ça très beau, intuitivement.

    Voici le code :


    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
    Sub Boursorama_Id()
    ' extraction du cours, de la date du cours et d'autres information avec la méthode "id"
     
    'Déclaration des variables
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    Dim InputGoogleZoneTexte As HTMLInputElement
    Dim InputGoogleBouton As HTMLInputElement
    Dim FormGoogleCherche As HTMLFormElement
    Dim htmlTabElement() As IHTMLElement
    Dim GenericElem As HTMLGenericElement
    Dim Ws_Scores As Worksheet
    Dim htmlTabResultat As HTMLGenericElement
    Dim htmlLigneResultat As HTMLGenericElement
    Dim NumLigne As Byte
    Dim NumImg As Byte
     
       'Chargement d'une page Web boursorama
       IE.Navigate "http://www.boursorama.com/cours.phtml?symbole=3eFILBB"
       IE.Visible = True
       WaitIE IE
       Set IEDoc = IE.document
       Set Ws_Scores = ThisWorkbook.Sheets("Feuil1")
     
      'on pointe <tbody> du tableau qui nous intéresse en partant du premier "id" situé juste au-dessus qui se nomme fiche_cours_details
       Set htmlTabResultat = IEDoc.body.all("fiche_cours_details").children(1).children(0).children(0).children(0)
     
       NumLigne = 3
     
       For Each htmlLigneResultat In htmlTabResultat.children
     
        Ws_Scores.Cells(NumLigne, "A") = htmlLigneResultat.children(0).innerText
        Ws_Scores.Cells(NumLigne, "B") = htmlLigneResultat.children(1).innerText
     
        NumLigne = NumLigne + 1
       Next
     
       Set IE = Nothing
       Set IEDoc = Nothing
    End Sub
    J'ai voulu mettre au point un code plus direct qui part directement du tableau dont je n'ai que le Name. Cette méthode est basée sur ta fonction getElementsByClassName.

    Voici le code :

    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
    Sub Boursorama_class()
    ' extraction du cours, de la date du cours et d'autres information avec la méthode "name"
     
    'Déclaration des variables
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    Dim InputGoogleZoneTexte As HTMLInputElement
    Dim InputGoogleBouton As HTMLInputElement
    Dim FormGoogleCherche As HTMLFormElement
    Dim htmlTabElement() As IHTMLElement
    Dim GenericElem As HTMLGenericElement
    Dim Ws_Scores As Worksheet
    Dim htmlTabResultat As HTMLGenericElement
    Dim htmlLigneResultat As HTMLGenericElement
    Dim NumLigne As Byte
    Dim NumImg As Byte
     
       'Chargement d'une page Web boursorama
       IE.Navigate "http://www.boursorama.com/cours.phtml?symbole=3eFILBB"
       IE.Visible = True
       WaitIE IE
       Set IEDoc = IE.document
       Set Ws_Scores = ThisWorkbook.Sheets("Feuil1")
     
        Set GenericElem = IEDoc.all("content-gauche")
     
        'on pointe directement sur le tableau name="info-valeur list"
        htmlTabElement = getElementsByClassName(GenericElem, "info-valeur list", False)
     
    NumLigne=3
        Ws_Scores.Cells(NumLigne, "A") = htmlTabElement(0).innerText
        ' dans la ligne qui précède je récupère dans une seule cellule toutes les cellule de <table> sans espaces
        ' entre 2 cellules adjacentes et avec un retour chariot à chaque changement de ligne du tableau
     
       Set IE = Nothing
       Set IEDoc = Nothing
    End Sub

    Comme indiqué en commentaire, le résultat htmlTabElement(0) me renvoie les 2 colonnes du tableau mais dans une seule cellule. Je sens qu'il ne me manque pas grand chose pour obtenir le résultat voulu, mais je ne sais pas comment modifier la ligne Ws_Scores.Cells(NumLigne, "A") = htmlTabElement(0) pour y parvenir. Peux-tu m'aider ?

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

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 126
    Par défaut
    Salut

    Pour ce qui est de l'espionnage, si tu regardes dans IEDoc il contient bien les informations dont tu as besoin

    1°/ Sur Excel il existe les Données externe, si tu vas dans l'onglet/menu "Données" tu les trouveras, elles permettent de pointer une source de données extérieures, comme le nom l’indique , il est ainsi possible de pointer tout ou partie d'un site web. Pour le cas de boursorama, seule la page complète peut-être liée, il n'est pas possible de lier uniquement un des petits tableaux, mais toutes les informations de la page semblent importées et tu peux ensuite faire une recherche.

    2°/Il n'y a pas que les Ids dans la vie , les names peuvent être utilisés aussi et tu en as un disponible immédiatement au dessus du tableau que tu veux manipuler. Ensuite tu n'as plus qu'à utiliser cette méthode

    Bonne journée
    ++
    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

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Concernant la méthode getElementsByClassName, j'ai réussi à récupérer le cours (1ère ligne du tableau HTML, 2ème cellule dont le name est "cotation") à l'aide du code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        htmlTabElement = getElementsByClassName(GenericElem, "cotation", False)
     
        NumLigne = 3
        Ws_Scores.Cells(NumLigne, "A") = htmlTabElement(0).innerText
    la 3ème ligne (TR) du tableau HTML, 2ème cellule, ne possède pas de nom ni d'id, ni de class.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <tr><td class="label">
          Dernier échange
        </td><td>
          06/08/13 09:03:24
        </td>
    Comment faire pour récupérer la cellule contenant la date ?
    Je suppose qu'il faut repartir de le class du tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    htmlTabElement = getElementsByClassName(GenericElem, "info-valeur list", False)
    Mais ensuite ?

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Après quelques heures de recherche, j'ai fini par à peu près comprendre. Donc je m'autoréponds

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        'on pointe directement sur le tableau name="info-valeur list"
        htmlTabElement = getElementsByClassName(GenericElem, "info-valeur list", False)
     
        'on récupère le cours et la date dans 2 cellules Excel
        Ws_Scores.Cells(3, "A") = Val(htmlTabElement(0).Cells(1).innerText)
        Ws_Scores.Cells(4, "A") = Format(htmlTabElement(0).Cells(5).innerText, "dd/mm/yyyy")
    Maintenant, j'aimerais connaître votre avis : lequel de ces 2 codes vous semble le plus efficace (le plus rapide et le moins gourmand en ressource) :

    Code 1
    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
    Sub Boursorama_Id()
     
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    Dim Ws_Scores As Worksheet
    Dim htmlTabResultat As HTMLGenericElement
    Dim htmlLigneResultat As HTMLGenericElement
     
       'Chargement d'une page Web boursorama
       IE.Navigate "http://www.boursorama.com/cours.phtml?symbole=3eFILBB"
       IE.Visible = True
       WaitIE IE
       Set IEDoc = IE.document
       Set Ws_Scores = ThisWorkbook.Sheets("Feuil1")
     
      'on pointe <tbody> du tableau qui nous intéresse en partant du premier "id" situé juste au-dessus qui se nomme fiche_cours_details
       Set htmlTabResultat = IEDoc.body.all("fiche_cours_details").children(1).children(0).children(0).children(0)
     
       'on récupère le cours et la date dans 2 cellules Excel
       Ws_Scores.Cells(3, "A") = Val(htmlTabResultat.children(0).children(1).innerText)
       Ws_Scores.Cells(4, "A") = Format(htmlTabResultat.children(2).children(1).innerText, "dd/mm/yyyy")
     
       Set IE = Nothing
       Set IEDoc = Nothing
     
    End Sub
    Code 2 :
    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
    Sub Boursorama_class()
     
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    Dim htmlTabElement() As IHTMLElement
    Dim GenericElem As HTMLGenericElement
    Dim Ws_Scores As Worksheet
     
       'Chargement d'une page Web boursorama
       IE.Navigate "http://www.boursorama.com/cours.phtml?symbole=3eFILBB"
       IE.Visible = True
       WaitIE IE
       Set IEDoc = IE.document
       Set Ws_Scores = ThisWorkbook.Sheets("Feuil1")
     
        Set GenericElem = IEDoc.all("content-gauche")
     
        'on pointe directement sur le tableau name="info-valeur list"
        htmlTabElement = getElementsByClassName(GenericElem, "info-valeur list", False)
     
        'on récupère le cours et la date dans 2 cellules Excel
        Ws_Scores.Cells(3, "A") = Val(htmlTabElement(0).Cells(1).innerText)
        Ws_Scores.Cells(4, "A") = Format(htmlTabElement(0).Cells(5).innerText, "dd/mm/yyyy")
     
       Set IE = Nothing
       Set IEDoc = Nothing
     
    End Sub
    Merci pour vos lumières

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

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 126
    Par défaut
    Salut

    @noftal:
    J'obtiens bien le même résultat que toi, il n'y a pas d'erreur. Si tu remontes le fil de conversation tu verras qu'il y a souvent des soucis de se genre avec les site contenant des Forms, ce qui est le cas ici. Tu as malgré tout de la chance, car le contenu est tout de même accessible.
    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
    Sub Boursorama()
    'Génére une erreur d'exécution dut au retour de deux élément
    'suite à la recherche faite avec All
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    Dim Generic As HTMLGenericElement
     
    'Ouvre la page WEB
    IE.Navigate "http://www.boursorama.com/cours.phtml?symbole=3eFILBB"
    IE.Visible = True
    WaitIE IE
    Set IEDoc = IE.document
     
    'On pointe l'élément "exa_q"
    Set Generic = IEDoc.all("select_marche")
     
    Set IE = Nothing
    Set IEDoc = Nothing
    End Sub
    Dans cette exemple si tu break après le Set Generic =... tu pourras étudier son contenu.

    Pour récupérer "select_marche" j'ai tout simplement cherché dans le code source de la page à l'aide de l'outil de développement d'IE (accessible par la touche F12). Ensuite tu utilises le bouton qui représente une flèche pour pointer l'élément qui t’intéresse sur la page ensuite tu remontes dans la hiérarchie pour trouver un élément ayant un id ou un name que tu pourras pointer. Tu trouveras tous les détails nécessaire dans le tutoriel.

    Bonne journée
    ++
    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

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

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 126
    Par défaut
    Salut

    Etant donné le peu de différence entre les 2 codes je doute qu'on puisse objectivement voir une différence en terme de rapidité et de consommation de ressource).

    A++
    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

Discussions similaires

  1. [Article] Manipulation d'Internet Explorer via VBA
    Par Qwazerty dans le forum Contribuez
    Réponses: 116
    Dernier message: 13/02/2020, 15h47
  2. Manipulation d'Internet Explorer via VBA
    Par pegase33 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/04/2018, 09h49
  3. Manipulation d'Internet Explorer via VBA
    Par jll13 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/01/2013, 19h24
  4. probleme Manipulation d'Internet Explorer via VBA
    Par casefayere dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/03/2012, 20h36

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