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 :

Récupération donnée sur page internet fonction getElementsByClassName


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet
    Inscrit en
    Avril 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 49
    Par défaut Récupération donnée sur page internet fonction getElementsByClassName
    Bonjour,

    Tout d'abord je précise que je suis débutant en VBA mais j'ai lu le tuto suivant (lien) pour m'aiguiller sur les interactions avec Internet Explorer via VBA Excel

    J'ai besoin de votre aide pour la récupération d'information sur la page internet suivante : lien

    Il s'agit de récupérer la valeur de cours d'une action, sur cet exemple : GDF Suez

    Nom : Capture2.PNG
Affichages : 2904
Taille : 78,0 Ko

    Le code source de la page est le suivant :

    Nom : Capture1.PNG
Affichages : 2950
Taille : 49,3 Ko

    Pour atteindre cette information, j'ai choisi d'utiliser la fonction getElementsByClassName (voir code ci-dessous) (j'ai aussi essayé avec getElementsById mais il y a trop d'item dans vba, et je ne trouve pas le bon item )

    Mais lorsque je lance le code l'espion placé sur la variable "cOtation" est vide :

    Nom : Capture3.PNG
Affichages : 2654
Taille : 5,1 Ko

    Mon début de code est visible ci-dessous :

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    Sub RecuperationBloomberg()
     
    'Déclaration des variables
    Dim Ie As New InternetExplorer
    Dim IEdoc As HTMLDocument
    Dim rNg As Range
    Dim tiCker As String
    'Dim quOte As HTMLGenericElement
    Dim cOtation() As IHTMLElement
     
    Set rNg = Sheets("PEA").Range("C5")
    tiCker = rNg.Value
    On Error GoTo handler
     
    'Chargement de la page bloomberg
    Ie.navigate "http://www.bloomberg.com/quote/" & tiCker
    Ie.Visible = True
     
    'Attente chargement complet de la page
    WaitIE Ie
     
    Set IEdoc = Ie.document
     
    cOtation = getElementsByClassName(IEdoc.body, "price", False)
     
    On Error GoTo 0
     
    'Cells(5, 5).Value = cOtation
     
    Ie.Application.Quit
     
     'libération variable IE
    Set Ie = Nothing
    Set cOtation = Nothing
    'Set quOte = Nothing
     
    Exit Sub
    handler:
    MsgBox "le ticker suivant :" & tiCker & "n'est pas valide."
     
    End Sub
     
    ----------------------------------------------------------------
    Sub WaitIE(Ie As InternetExplorer)
     
        'On boucle tant que la page n'est pas totalement chargée
        Do Until Ie.readyState = READYSTATE_COMPLETE
            DoEvents
        Loop
     
    End Sub
     
    ------------------------------------------------------------------
    Function getElementsByClassName(IEParentElement As IHTMLElement, aClassName As String, Optional JustChildren As Boolean = False) As IHTMLElement()
     
    'IEParentElement    Nom de l'élément dans lequel sera recherché les éléments ayant comme classe aClassName.
    'aClassName         Chaîne de caractères représentant le nom de classe qui sera recherché.
    'JustChildren       Facultatif. Cette valeur de type booléen prend la valeur False (valeur par défaut) si la recherche doit se faire dans l'intégralité des sous-éléments. Il prend la valeur True, si la recherche doit se faire uniquement dans les éléments fils, de l'élément IEParentElement, la recherche s'effectue alors dans les éléments contenus dans le membre Children de l'objet IEParentElement.
     
     
    'Retourne un tableau contenant les éléments de la page ayant pour Class aClasseName
    Dim aElement As IHTMLElement
    Dim FuncElements() As IHTMLElement
    Dim SourceElem As IHTMLElementCollection
    Dim iElem As Integer
     
       'On prend en compte le lieu de recherche
       If JustChildren Then
           'Ici on ne tiendra compte que des enfants directs de IEParentElement
           Set SourceElem = IEParentElement.Children
       Else
           Set SourceElem = IEParentElement.all
       End If
     
       'On boucle sur tous les éléments contenus dans SourceElem
       For Each aElement In SourceElem
     
           'On vérifie si l'élément correspond à notre recherche
           If aElement.className = aClassName Then
     
               'On redimensionne notre tableau
               'Cela semble inutile de regarder si FuncElements est un Array...
               'Mais sans cette ligne FuncElement n'est jamais reconnu comme tel...
               iElem = IIf(IsArray(FuncElements), UBound(FuncElements) + 1, -1)
               ReDim Preserve FuncElements(iElem)
     
               'Et on place l'élément trouvé à l'intérieur
               Set FuncElements(UBound(FuncElements)) = aElement
           End If
       Next
     
       'On place le tableau en retour de notre fonction
       getElementsByClassName = FuncElements
     
       'On libère l'espace mémoire occupé par notre tableau provisoire
       Erase FuncElements
    End Function
    Merci par avance pour votre aide

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    essaie getelementsbyclassname d'origine (sans la fonction de qwazerty)

    et dans le wait ie
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    do:doevents:loop while IE.busy or IE.readystate<>4
    en effet des fois le readystate donne la main alors que la page travaille encore
    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

  3. #3
    Membre averti
    Homme Profil pro
    Chef de projet
    Inscrit en
    Avril 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 49
    Par défaut
    Merci beaucoup,

    J'ai modifié le code comme suis et grâce à vos conseils cela marche .

    Par contre l’exécution de la macro semble être assez lente pour la récupération d'une seule valeur, je ne suis pas sûr que mon code soit très académique ou optimisé. D'ailleurs si vous avez des conseils pour optimiser ce code ils sont les bienvenus.

    Il ne me reste plus qu'a généraliser mon code au reste de ma feuille Excel

    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
    Sub RecuperationBloomberg()
     
    'Déclaration des variables
    Dim Ie As New InternetExplorer
    Dim IEdoc As HTMLDocument
    Dim rNg As Range
    Dim tiCker As String
    Dim cOtation As IHTMLElementCollection
     
    Set rNg = Sheets("PEA").Range("C5")
    tiCker = rNg.Value
     
    'Chargement d'une page web Google
    Ie.navigate "http://www.bloomberg.com/quote/" & tiCker
    Ie.Visible = False
     
    'Test si Ticker erroné
    On Error GoTo handler
     
    'On attend le chargement complet de la page
    WaitIE Ie
     
    Set IEdoc = Ie.document
    Set cOtation = IEdoc.getElementsByClassName("price")
     
    Cells(5, 5).Value = cOtation(0).innerText
     
    On Error GoTo 0
     
    'quiter IE
    Ie.Application.Quit
     
    'On libère la variable IE
    Set Ie = Nothing
    Set IEdoc = Nothing
    Set cOtation = Nothing
     
    Exit Sub
    handler:
    MsgBox "le ticker suivant :" & tiCker & "n'est pas valide."
     
    End Sub
     
    '-------------------------------------------------------------------------------
    Sub WaitIE(Ie As InternetExplorer)
     
        'On boucle tant que la page n'est pas totalement chargée
        Do: DoEvents: Loop While Ie.Busy Or Ie.readyState <> 4
     
    End Sub

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut re une solution pour la velocité
    tout d'abords visiblement tu démarre avec ce genre de manipulation alors va doucement

    pour le reste de ta page continu comme ca

    après pour la vélocité on travaillera avec une requête (xmlhttp2)pour récupérer le code html de la page et pouvoir travailler dessus
    mais pour le moment tu a la possibilité de travailler avec IE ce qui t'apporte une certaine visibilité des éléments
    des que je rentre chez moi je regarde ca
    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

  5. #5
    Membre averti
    Homme Profil pro
    Chef de projet
    Inscrit en
    Avril 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 49
    Par défaut
    Merci encore pour l'aide.

    Vous avez raison je vais y aller pas-à-pas car j'ai débuté le vba cette semaine mais je suis pressé d'apprendre.
    Je passerai à l'optimisation ensuite mais elle sera je pense nécessaire car j'aurai pleins d'autres valeurs à récupérer et l’exécution de la macro sera alors très longue.

    J'ai donc complété mon code qui est fonctionnel (voir plus bas et l'image qui montre que la colonne E est bien remplie).

    Maintenant je voudrais savoir comment "nettoyer" la valeur récupérée pour en mettre "un bout" dans la colonne E et le reste dans la colonne F.

    Pour être plus claire j'ai mis une image de ce que je souhaites faire :
    • passer la devise (dans mon exemple "EUR") dans la case F
    • transformer le point de séparation des décimales en virgule et faire en sorte pour que la chaine de caractère soit reconnue comme un chiffre

    Nom : Capture4.PNG
Affichages : 2784
Taille : 33,1 Ko

    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
    Sub RecuperationBloomberg()
     
    'Déclaration des variables
    Dim Ie As New InternetExplorer
    Dim IEdoc As HTMLDocument
    Dim rNg As Range
    Dim tiCker As String
    Dim cOtation As IHTMLElementCollection
    Dim cOurs As Variant
     
     
    dernliGne = Worksheets("PEA Binck").Range("C" & Rows.Count).End(xlUp).Row
     
    i = 2
     
    For i = 2 To dernliGne
        Set rNg = Sheets("PEA Binck").Range("C" & i)
        tiCker = rNg.Value
     
        If tiCker = "" Then
     
     
        Else
            'Chargement d'une page web bloomberg
            Ie.navigate "http://www.bloomberg.com/quote/" & tiCker
            Ie.Visible = False
     
            'Test si Ticker erroné
            On Error GoTo handler
     
            'On attend le chargement complet de la page
            WaitIE Ie
     
            Set IEdoc = Ie.document
            Set cOtation = IEdoc.getElementsByClassName("price")
     
            cOurs = cOtation(0).innerText
     
            Cells(i, 5).Value = cOurs
            On Error GoTo 0
        End If
    Next
     
     
    'quitter IE
    Ie.Application.Quit
     
    'On libère la variable IE
    Set Ie = Nothing
    Set IEdoc = Nothing
    Set cOtation = Nothing
     
    Exit Sub
    handler:
    MsgBox "le ticker suivant :" & tiCker & "n'est pas valide."
     
    End Sub
     
    '--------------------------
    Sub WaitIE(Ie As InternetExplorer)
     
        'On boucle tant que la page n'est pas totalement chargée
        Do: DoEvents: Loop While Ie.Busy Or Ie.readyState <> 4
     
    End Sub

  6. #6
    Expert éminent
    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
    Par défaut

    Bonjour,

    démonstration à tester dans un classeur vierge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Demo()
                  cOurs = "19.3150 EUR"
                     SP = Split(cOurs)
        With Feuil1
            .[E5].Value = Val(SP(0))
            .[F5].Value = SP(1)
        End With
    End Sub
    _____________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo

Discussions similaires

  1. Récupération de données sur page distante
    Par depelek dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 27/04/2010, 14h10
  2. récupération données depuis page web
    Par Elay dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/01/2008, 07h35
  3. récupération de données sur page dynamique
    Par jpconrad dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 07/06/2007, 19h40
  4. récupération données de page à page
    Par Hisander dans le forum Langage
    Réponses: 3
    Dernier message: 10/05/2007, 10h22
  5. Excel et données sur site internet
    Par jevany dans le forum Excel
    Réponses: 3
    Dernier message: 16/03/2007, 22h46

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