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 :

Erreur code vba pour "programme extraction données web"


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Erreur code vba pour "programme extraction données web"
    Bonjour à tous !!!

    Je suis débutant (je pars de zéro ! ) en programmation vba (pour Excel 2013 sous Windows7).

    J’essaie d’écrire un programme pour récupérer des infos sur un site web à partir d'un tableau Excel pour ensuite les réintégrer dedans.
    Pour être « franc » et plus précis (vous le comprendrez en voyant le début du code), ce serait pour compléter des infos sur un tableau un peu comme le modèle dans excel : « liste de films ». En « automatisant » bien sur l’enregistrement des infos qui m’intéressent !
    Je suis donc parti du "code source" de la page d'accueil du site (je ne pense "déroger" à des "droits privés", ce faisant...) et repéré les valeurs concernées avec leurs propriétés.

    Je voudrai dans un premier temps pouvoir « placer » une valeur dans le champ « recherche » et lancer celle-ci automatiquement. Je verrai après comment récupérer mes données…

    Mais je bloque déjà sur une partie de mon code (ça commence mal et j’ai l’impression que ce n’est pas fini !!!) avec ce message d'erreur:
    "Erreur d'exécution '91': variable objet ou variable de bloc with non définie"...
    Le code bloque à cet endroit :
    Set Input_allocine_ZoneTexte = IEDoc.all("search_input")

    Est-ce que quelqu’un pourrait m’aider, SVP ?

    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
    41
    42
    43
    44
    45
    Sub Recherche_infos_films()
     
    'Déclaration des variables
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    'avec Dim Input_allocine_ZoneTexte as HTMLInputElement ou Dim Input_allocine_ZoneTexte As Variant, le code ne fonctionne pas...
    Dim Input_allocine_ZoneTexte As Variant
    Dim Input_allocine_Bouton As HTMLButtonElement
     
        'Chargement d'une page Web
        IE.Navigate "http://www.allocine.fr/"
     
        'Affichage de la fenêtre IE
        IE.Visible = True
     
        'On attend le chargement complet de la page
        Do Until IE.readyState = READYSTATE_COMPLETE
        DoEvents
        Loop
     
        'On pointe le membre Document
        Set IEDoc = IE.document
     
        'On pointe notre Zone de texte avec la formule IEDoc.all("q")ou IEDoc.all("search_input")
        Set Input_allocine_ZoneTexte = IEDoc.all("search_input")
     
     
        'On définit le texte que l'on souhaite placer à l'intérieur
        Input_allocine_ZoneTexte.Value = "titre au hasard"
     
        'On pointe notre bouton
        Set Input_allocine_Bouton = IEDoc.all("btn_form")
     
        'On simule un clic
        Input_allocine_Bouton.Click
     
        'On attend le chargement complet de la page
        Do Until IE.readyState = READYSTATE_COMPLETE
        DoEvents
        Loop
     
        'On libère les variables
        Set IE = Nothing
        Set IEDoc = Nothing
    End Sub
    Ah oui, je vous précise qu'au début, à la ligne 25, j'avais écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Input_allocine_ZoneTexte = IEDoc.all("q")
    Mais comme bizarrement il y a plusieurs " id="q"", j'ai remplacé le code par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Input_allocine_ZoneTexte = IEDoc.all("search_input")
    pour "spécifier" la valeur qui m’intéresse, main en vain...

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonjour,

    tu peu faire une recherche dans la balise div Header.. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (...)
    Dim IEEntete  As HTMLDivElement
    (..)
     
        Set IEEntete = IEDoc.all("header")
        Set Input_allocine_ZoneTexte = IEEntete.all("q")
    (...)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour à tous et à ...bbil

    Merci pour cette réponse Hyper-rapide et géniale !!!

    Cela fait 4 jours que je "buche" ou plutôt que je bute sur le problème...
    Et même en parcourant les forums, je n'aurai JAMAIS trouvé la solution !

    Je pensai qu'en indiquant bien le chemin des variables à partir du "corps" de la page (désolé pour le vocabulaire légèrement inadapté!) jusqu'à la racine, c'était suffisant...
    Mais je vois qu'il est "mieux" de se placer dans la "balise/div_racine" où se situe les "boutons concernés".
    Mais pourquoi ? Et comment reconnaitre la balise/div où se placer ?

    Encore merci à vous, bbil , et comme c'est l'heure du repas, je vous offre cet apéro et vous dit: "à la votre!!!"

    Je suis très content de pouvoir poursuivre mon code mais je ne ferme pas tout de suite le post car je crois qu'il y aura d'autres surprises...
    Je regrette seulement d'avoir été un peu timide et d'avoir attendu si longtemps pour demander de l'aide !!!

    amitiés.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Comment "trier+pointer" sur liens qui n'ont pas de "Name,Id ou Class" mais sous forme de : <a href= "...">
    Bonjour à tous,

    J’ai dû rechanger mon code (fallait s’y attendre et ce n’est pas fini à mon avis…) car je n’ai pas réussi à exploiter la manière de faire (bbil) pour écrire le titre du film dans le « input_ rechercher » pour valider ensuite le bouton « rechercher (btn_form) ».
    Je vous passe les détails des différents codes utilisés…

    J’ai donc réussi en utilisant la fonction « oDoc.getElementsByClassName("btn_form")(0).Click » pour valider le bouton de recherche.
    Pour cela, il m’a fallu télécharger la version IE10 avec les mises à jour…puisque cette fonction n’est pas exploitable avec IE8 (je crois ?).

    Si je mets autant de détails, c’est pour le « pauvre pèlerin » qui rencontrerait les mêmes difficultés que moi. Si ça peut aider, j’en serais ravi ! Car je suis sûr que le code final en intéressera plus d’un quand il sera terminé (faudra être patient !)

    Alors voilà le nouveau problème :
    Avant, avec le titre exact du film, le moteur de recherche de « allociné » pointait directement sur la fiche du film. Ce qui n’est plus tout à fait le cas maintenant. Prenons l’exemple de « Terminator (The Terminator) ».

    http://www.allocine.fr/recherche/?q=Terminator

    On arrive sur une page avec 4 résultats dans les « titres de films » et 2 résultats dans celui des « séries TV ».
    Sans compter les résultats des « vidéos » et « photos » qui ne m’intéressent pas...

    Comment faire pour « récupérer » le bon titre du film (du lien) et pointer ensuite sur celui-ci pour enfin « arriver » sur sa fiche ?

    Car le lien n’a pas de classe, ni de nom, ni d’Id (comme moi !!! ) :
    <a href= « /film/fichefilm_gen_cfilm=183219.html » >
    Pas facile pour le comparer aux autres liens et le différencier… J’ai essayé de récupérer tous les liens de « <h2> Films » par son id ou sa classe mais pas de résultat valable :
    <a name="121001" class="anchor" id="121001"/>

    Je vous donne mon code actuel (ce qui fonctionne pour l’instant !) et si quelqu’un a des idées, je suis preneur !!!

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    ' Attend que la page internet soit chargée
    ' pTimeOut est un time out en secondes (WaitIE vaut True si Timeout)
     
    Public Function WaitIE(oIE As InternetExplorer, Optional pTimeOut As Long = 0) As Boolean
    Dim lTimer As Double
    lTimer = Timer
     
    Do
        DoEvents
       If oIE.readyState = READYSTATE_COMPLETE And Not oIE.Busy Then Exit Do
       If pTimeOut > 0 And Timer - lTimer > pTimeOut Then
           WaitIE = True
           Exit Do
       End If
    Loop
     
    End Function
     
     
    Public Sub CreerNavigateur()
     
    Dim oNav As SHDocVw.InternetExplorer
    Dim oDoc As MSHTML.HTMLDocument
    ' variables d'essais pour la suite du code et " trouver le bon lien puis pointer dessus"...
    'Dim MesElements As Objet, i As Long, j As Long
     
    Set oNav = New SHDocVw.InternetExplorer
    oNav.Visible = True
     
    oNav.navigate "http://www.allocine.fr/"
     
    ' Attente avec timeout de 10 s
        If WaitIE(oNav, 10) Then
    ' 10 s écoulées et page non chargée
        MsgBox "Time out!"
        Else
    ' Page chargée, on continue
       Set oDoc = oNav.document
       End If
     
    ' Valeur recherchée
       oDoc.getElementsByName("q")(0).Value = "Terminator (The Terminator)"
     
    ' Clic sur bouton
       oDoc.getElementsByClassName("btn_form")(0).Click
     
       ' Attente avec timeout de 10 s
        If WaitIE(oNav, 10) Then
    ' 10 s écoulées et page non chargée
        MsgBox "Time out!"
        Else
    ' Page chargée, on continue
       Set oDoc = oNav.document
       End If
     
    End Sub

Discussions similaires

  1. Un code VBA pour récupérer un type de donnée ?
    Par KEROZEN dans le forum VBA Access
    Réponses: 22
    Dernier message: 26/09/2019, 11h12
  2. Ligne de Code VBA pour actualiser des données sous PPT
    Par harald78 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/10/2016, 09h27
  3. Code VBA pour importer des données vers Excel
    Par thanmirt dans le forum SDK
    Réponses: 1
    Dernier message: 09/04/2011, 17h53
  4. [XL-2007] Code VBA pour lire données d'un tableau dans Excel
    Par PierreL dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/10/2009, 19h31
  5. Code VBA pour un renvoie de données
    Par Prekestolen dans le forum IHM
    Réponses: 4
    Dernier message: 23/06/2008, 14h31

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