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 :

macro vba pour recuperer du texte sur un site internet


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    rien
    Inscrit en
    Juin 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Juin 2015
    Messages : 46
    Points : 24
    Points
    24
    Par défaut macro vba pour recuperer du texte sur un site internet
    bonjour,
    Je souhaiterais automatiser le fait de récupérer des donnés depuis le site abc bourse.
    j'ai fait une macro qui parcourt ma feuille excel et pour chaque code ISIN va sur le site https://www.abcbourse.com/
    je trouve la zone de recherche je copie le code isin, je fait la recherche et j'arrive sur la page de la société en question.
    Jusque la je m'en suis sortie plutôt bien.

    Par contre pour trouver les info dont j'ai besoin j'ai du mal. le code affiche des erreurs qui ne sont pas tout le temps les même alors que je ne fait pas de modif. Ca ne fonctionne pas et je ne comprends pas pourquoi.
    voila le premier module qui fonctionne :
    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
    Global WsValo As Worksheet
     
    Sub Macro1()
     
        '1 Selection du l'onglet a traiter
            Set WsValo = ThisWorkbook.Worksheets("valo")
     
        '3 creation du range ListeIsin
            Dim RgListeIsin As Range
            With WsValo
            .Range("B1").Value = 10
                Set RgListeIsin = .Range(.Cells(1, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 1))
            End With
     
        '4 On pracourt le tableau et on va sur le net pour chaque ligne.
            Dim cellule As Range
            For Each cellule In RgListeIsin
                Internet cellule
            Next cellule
    End Sub
    et le module qui ne fonctionne pas completement
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
     
    Sub Internet(RgIsin As Range)
     
        'Chargement de la page page Web ABC bourse
        SiteUrl "https://www.abcbourse.com/"
     
        'On lance la recherche du code isin dans la barre de recherche
        RechercheNet "txtAutoComplete", "btnAC", RgIsin.Value
     
        'On recherche les valeurs
        Dim collec As HTMLDivElement
        Set collec = IEDoc.body.all("dis03")
        WsValo.Range("f8").Value = collec.innerText
     
        'On libère les variables
        Set IE = Nothing
        Set IEDoc = Nothing
     
    End Sub
     
    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
     
    Sub SiteUrl(url As String)
        'Chargement de la page web
        IE.navigate url
     
       'Affichage de la fenêtre IE
       IE.Visible = True
     
       'On attend le chargement complet de la page
       WaitIE IE
     
       'On pointe le membre Document
       Set IEDoc = IE.document
    End Sub
     
    Sub RechercheNet(IdZone As String, IdBouton As String, Isin As String)
        Dim ZoneRecherche As HTMLInputElement
        Dim BoutonRecherche As HTMLInputButtonElement
        'On pointe la zone de recherche
        Set ZoneRecherche = IEDoc.all(IdZone)
     
        'On entre le code isin
        ZoneRecherche.Value = Isin
     
        'On pointe le bouton ok
        Set BoutonRecherche = IEDoc.all(IdBouton)
     
        'On click sur le bouton ok
        BoutonRecherche.Click
        'On attend le chargement complet de la page
        WaitIE IE
     
        'On pointe le membre Document
       Set IEDoc = IE.document
    End Sub
    Tout fonctionne jusqu'a la partie 'On recherche les valeurs. la je n'y comprends plus rien.
    la variable collec affiche nothing.

    merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour,

    soit une mauvaise observation du fonctionnement du site avec classiquement un problème de synchro
    soit le site a été modifié pour une meilleure protection …

    Effectuer déjà une recherche sur ce forum sur abcbourse pour trouver les discussions traitant déjà ce sujet.

    ___________________________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Membre à l'essai
    Homme Profil pro
    rien
    Inscrit en
    Juin 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Juin 2015
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    je tourne vraiment en rond.
    Avec le meme code, j'arrive a avoir des résultats differant. Des fois je récupérè des donnés de la première page que j'ai charger. dès fois je récupère des donnés de la deuxième page.
    c'est comme si la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set IEDoc = IE.document
    que je fait après avoir charger la page ne s’appliquait pas tout le temps

  4. #4
    Membre à l'essai
    Homme Profil pro
    rien
    Inscrit en
    Juin 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Juin 2015
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    j'ai modifier la fonction wait IE par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub WaitIE(IE As Object)
        While IE.readyState <> 4 Or IE.Busy
            DoEvents
        Wend
    End Sub
    ça a l'air de mieux marcher

  5. #5
    Membre à l'essai
    Homme Profil pro
    rien
    Inscrit en
    Juin 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Juin 2015
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    je tombe de temps en temps sur des messages:
    erreur d'exécution 91 : variable objet ou variable de bloc with non définie.
    et à chaque fois c'est parce que la variable collec est vide. Mais je ne comprends pas pourquoi.

    Mais pas à tout les coup. j'arrive parfois à faire fonctionner jusqu’à la fin.

    je remet une version plus récente de mon 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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
     
    Sub Internet(RgIsin As Range)
     
        'Chargement de la page page Web ABC bourse
        SiteUrl "https://www.abcbourse.com/"
     
        'On lance la recherche du code isin dans la barre de recherche
        RechercheNet "txtAutoComplete", "btnAC", RgIsin.Value
     
        'On recherche les valeurs
        Dim collec As HTMLDivElement
            '1 cloture
            Set collec = IEDoc.body.all("vZone").Children(0)
            WsValo.Cells(RgIsin.Row, RgIsin.Column + 1).Value = collec.innerText
            '2 ouverture
            Set collec = IEDoc.body.all("open")
            WsValo.Cells(RgIsin.Row, RgIsin.Column + 2).Value = collec.innerText
            '3 plus haut
            Set collec = IEDoc.body.all("high")
            WsValo.Cells(RgIsin.Row, RgIsin.Column + 3).Value = collec.innerText
            '4 plus bas
            Set collec = IEDoc.body.all("low")
            WsValo.Cells(RgIsin.Row, RgIsin.Column + 4).Value = collec.innerText
     
        IE.Quit
     
        'On libère les variables
        Set IE = Nothing
        Set IEDoc = Nothing
     
    End Sub
     
    Sub WaitIE(IE As Object)
        While IE.readyState <> 4 Or IE.Busy
            DoEvents
        Wend
    End Sub
     
     
    Sub SiteUrl(url As String)
        'Chargement de la page web
        IE.navigate url
     
       'Affichage de la fenêtre IE
       IE.Visible = 0
     
       'On attend le chargement complet de la page
       WaitIE IE
     
       'On pointe le membre Document
       Set IEDoc = IE.document
    End Sub
     
    Sub RechercheNet(IdZone As String, IdBouton As String, Isin As String)
        Dim ZoneRecherche As HTMLInputElement
        Dim BoutonRecherche As HTMLInputButtonElement
        'On pointe la zone de recherche
        Set ZoneRecherche = IEDoc.all(IdZone)
     
        'On entre le code isin
        ZoneRecherche.Value = Isin
     
        'On pointe le bouton ok
        Set BoutonRecherche = IEDoc.all(IdBouton)
     
        'On click sur le bouton ok
        BoutonRecherche.Click
        'On attend le chargement complet de la page
        WaitIE IE
        'On pointe le membre Document
        Set IEDoc = IE.document
    End Sub

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut De l'observation naît la solution …

    C'est un problème de synchro, le code pointant sur un élément inexistant / pas encore chargé, bref la charrue avant les bœufs !
    A l'ouverture initiale, il faut attendre tant que Busy (est à True) et ReadyState < 4 (propriétés d'IE).

    Pour la mise à jour d'une page, après un click ou une validation par exemple,
    il faut attendre tant que ReadyState - du Document - est différent de "complete".

    C'est la base mais cela ne suffit pas avec certains sites faisant appels à des requêtes indépendantes
    venant alimenter la page après le feu vert des ReadyState !
    Et même parfois selon la version de Windows et d'IE le ReadyState peut rester bloqué à 3 !
    Dans ces cas, il suffit juste d'observer le fonctionnement de la page
    afin de pouvoir détecter par code la présence d'un élément particulier via la fonction IsObject par exemple …

    Voir les discussions de ce forum sur le site abcbourse, je me souviens d'une discussion initiée fin mai 2016 s'étant étirée jusqu'à fin août !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Membre à l'essai
    Homme Profil pro
    rien
    Inscrit en
    Juin 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Juin 2015
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    j'ai bien une fonction qui s'apelle wait IE qui attends que la page ce charge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub WaitIE(IE As Object)
        While IE.readyState <> 4 Or IE.Busy
            DoEvents
        Wend
    End Sub
    pourtant j'ai toujours ce problème

  8. #8
    Membre à l'essai
    Homme Profil pro
    rien
    Inscrit en
    Juin 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Juin 2015
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Marc-L Voir le message



    Pour la mise à jour d'une page, après un click ou une validation par exemple,
    il faut attendre tant que ReadyState - du Document - est différent de "complete".
    Si je te comprend bien, il me manque une fonction wait pour IE.document a utiliser lorsque je charge une nouvelle page ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub WaitDoc(doc As HTMLDocument)
      Do While Not doc.readyState = "complete"
        DoEvents
      Loop

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Peut-être, là il est tard …
    L'élément pointé n'existe pas encore dans la page malgré les feux au vert, juste un problème de synchro !
    A tester via IsObject par exemple comme dans les exemples de ce forum sur abcbourse …

    Sinon trouve un site plus simple pour toi à piloter !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #10
    Membre à l'essai
    Homme Profil pro
    rien
    Inscrit en
    Juin 2015
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Juin 2015
    Messages : 46
    Points : 24
    Points
    24
    Par défaut
    j'ai fait ça
    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 RechercheNet(IdZone As String, IdBouton As String, Isin As String)
        Dim ZoneRecherche As HTMLInputElement
        Dim BoutonRecherche As HTMLInputButtonElement
        'On pointe la zone de recherche
        Set ZoneRecherche = IEDoc.all(IdZone)
       
        'On entre le code isin
        ZoneRecherche.Value = Isin
       
        'On pointe le bouton ok
        Set BoutonRecherche = IEDoc.all(IdBouton)
       
        'On click sur le bouton ok
        BoutonRecherche.Click
        'On attend le chargement complet de la page
        WaitDoc IEDoc
        'On pointe le membre Document
        Set IEDoc = IE.document
    End Sub
    c'est beaucoup plus long mais ça a fonctionnè sans problème.

    Juste ce que je trouve bizarre c'est de faire un test sur IEDoc juste avant de le mettre à jour par IEdoc = IE.document

  11. #11
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Tant mieux !

    Mais pas bizarre pour autant car comme je l'ai indiqué après un click si la page est de nouveau chargée
    il faut bien attendre sa mise à jour, éliminant de facto le souci de synchronisation …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour

    peut etre que si tu regardais l'url de ta page apres avoir rempli l'imput de recherche et cliquer

    et que par la suite tu utilisais cette url au lieu de l'url d'acceuil
    tu n'aurais pas toute la demarche de gestion d'attente et remplissage et click etc.......

    et peut etre meme que si tu utilisais cette url avec une requete dans un htmldocumenten memoire en utilisant le responsetext comme innerhtml a l'interieur tu irais plus vite
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut


    Salut Patrick,

    tu m'as devancé !     Mais s'il avait effectué la recherche conseillée, il serait déjà tombé dessus …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/10/2014, 15h13
  2. [XL-2007] Macro VBA pour imprimer plusieurs onglets sur une feuille recto verso
    Par oekoniko dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/03/2014, 15h24
  3. [XL-2003] macro VBA pour imposer signe "-" sur une cellule
    Par cilala dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/09/2010, 00h13
  4. Réponses: 1
    Dernier message: 03/01/2010, 12h49
  5. Réponses: 1
    Dernier message: 31/12/2009, 11h22

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