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

  1. #1
    Candidat au Club
    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
    Points : 4
    Points
    4
    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 : 2730
Taille : 78,0 Ko

    Le code source de la page est le suivant :

    Nom : Capture1.PNG
Affichages : 2762
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 : 2518
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 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
    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
    Candidat au Club
    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
    Points : 4
    Points
    4
    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 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 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
    Candidat au Club
    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
    Points : 4
    Points
    4
    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 : 2622
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 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,

    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
    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
    Candidat au Club
    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
    Points : 4
    Points
    4
    Par défaut
    Bonjour Marc-L,


    Merci pour votre aide, j'ai testé votre méthode dans un classeur vierge et cela marche très bien et correspond à ce que je souhaite faire.

    Par contre pouvez-vous m'aiguillez car je voudrais mettre votre méthode dans ma boucle à savoir faire varier la ligne .[E5].Value => .[E5].Value puis .[E6].Value puis .[E7].Value jusqu’à .[EdernliGne].Value et pareille pour .[F5].value.


    Merci par avance

  8. #8
    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





    Modifier la ligne n°39 de votre code

    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)

  9. #9
    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

    pourquoi spliter?
    pourquoi ne pas le determiner avant
    apercu de l'arborescence de l'element dans l'espion de IE
    Pièce jointe 175352

    essaie celui la
    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 RecuperationBloomberg()
    'Déclaration des variables
        Dim Ie As Object, IEdoc As Object, cOurs As String, UnitéValeur As String, TiCKer As String, RnJ As range
        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
                Set Ie = CreateObject("internetexplorer.application")
                '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).Children(0).innertext
                UnitéValeur = cOtation(0).Children(1).innertext
                Cells(i, 5).Value = cOurs
                Cells(i, 6).Value = UnitéValeur
                On Error GoTo 0
            End If
        Next
     
        'quitter IE
        Ie.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 )
    'On boucle tant que la page n'est pas totalement chargée
        Do: DoEvents: Loop While Ie.Busy Or Ie.readyState <> 4
    End Sub
    tu remarquera que je suis passer en late binding pour IE(déclaration tardive") cela te dispense d'avoir a cocher les références internet
    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

  10. #10
    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 !

    J'ai juste répondu à la question vis à vis de la photo de la page Excel et, comme tu dois t'en douter,

    je ne me suis pas intéressé à la page Web, sachant que tu étais déjà sur l'affaire : Let it Bee ?!
    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)

  11. #11
    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
    autant pour moi
    il y a pas 2 efant mais un nœud et un enfant
    alors ce sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cOurs = Val(cOtation(0).innertext)
                UnitéValeur = cOtation(0).Children(1).innertext
    mille excuse marcL je ne t'ai pas salué

    ca me manquait ca!!!!! une question sur IE
    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

  12. #12
    Candidat au Club
    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
    Points : 4
    Points
    4
    Par défaut
    Merci à tous les deux,

    Désolé pour mes questions qui je le sais peuvent paraitre basiques mais comme je débute tout juste et que je ne suis pas du tout programmeur je ne maitrise pas tout, j'ai juste quelques notions qui datent maintenant de fort longtemps.

    En tout cas Patrick votre méthode tourne bien avec votre dernier correctif. Il m'a juste fallu dans ma feuille Excel modifier le format des cellules en catégorie "texte" sinon la valeur 19,135 € se transformait en 19 135€.

    Je met le code complet au cas où cela intéresserait d'autres personnes

    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
    Sub RecuperationBloomberg()
     
    'Déclaration des variables
        Dim Ie As Object, IEdoc As Object, cOurs As String, UnitéValeur As String, TiCKer As String, rNg As Range
     
        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
                Set Ie = CreateObject("internetexplorer.application")
     
                '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 = Val(cOtation(0).innerText)
                UnitéValeur = cOtation(0).Children(1).innerText
                Cells(i, 5).Value = cOurs
                Cells(i, 6).Value = UnitéValeur
                On Error GoTo 0
            End If
        Next
     
        'quitter IE
        Ie.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)
    'On boucle tant que la page n'est pas totalement chargée
        Do: DoEvents: Loop While Ie.Busy Or Ie.readyState <> 4
    End Sub

    Marc-L,

    Dans la question que je vous posais, je savais bien qu'il fallait retoucher la ligne n°39 (votre poste #2). C'est en faite la syntaxe qui me fait défaut.

    J'avais essayé la syntaxe suivante (ne pas se moquer svp ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     '(...)
    dernliGne = Worksheets("PEA Binck").Range("C" & Rows.Count).End(xlUp).Row
        i = 2
        For i = 2 To dernliGne
        With Feuil1
            .[Ei].Value = Val(SP(0))
            .[Fi].Value = SP(1)
        End With
     '(...)
    mais ce n'est vraisemblablement pas bon

    Sinon concernant les requêtes xmlhttp 2 qui disiez-vous sont plus rapides, avez vous des liens ou des sujets du forum à me conseiller ? Je vais essayer de m'intéresser à cela pour comprendre au moins la base.

    Merci encore

  13. #13
    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
    je viens d'essayer avec une requette xmlhttp2
    ca ne fonctionne pas si on est pas loguer(login + password)
    ensuite pour ton soucis de string

    on peut rectifier
    essaie ca
    dans la declaration des variables en haut de macro tu change cOurs en long a la place de "string"
    et pour la restitution c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cOurs = Val(Replace(cOtation(0).innertext, ",", "."))
    c'est en effet le soucis dans exel le point se transforme en virgule
    mais si on tape une virgule c'est du texte (rigolo non??)
    on intègre ainsi un numérique avec pour séparateur décimal le point qui sera transformé tout de suite en virgule dans la cell

    c'est vraiment rigolo
    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

  14. #14
    Candidat au Club
    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
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    je viens d'essayer avec une requette xmlhttp2
    ca ne fonctionne pas si on est pas loguer(login + password)
    Bonjour Patrick,

    J'ai trouvé sur un autre site une fonction avec cette méthode qui semble tourner d'après les utilisateurs.

    Me concernant la fonction me retourne "PriceTag not found" j'en déduit que je m'arrête à la ligne de code n°16

    Qu'en pensez-vous?

    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
    Function GetPrice(symb)
    Const PriceTag = "span class="" price"">"
    Dim oHttp As Object, txt$, i&, j&
    On Error Resume Next
    Set oHttp = CreateObject("MSXML2.XMLHTTP")
    If Err <> 0 Then Set oHttp = CreateObject("MSXML.XMLHTTPRequest")
    If oHttp Is Nothing Then MsgBox "MSXML2.XMLHTTP not found", 16, "Error": Exit Function
    On Error GoTo 0
     
    With oHttp
    .Open "GET", "http://www.bloomberg.com/quote/" & symb, False
    .send
    txt = .responseText
    i = InStr(1, txt, PriceTag, 1)
    If i = 0 Then
    GetPrice = "PriceTag not found"
    Else
    i = i + Len(PriceTag)
    j = InStr(i, txt, "<", 0)
    GetPrice = Trim(Application.Clean(Mid(txt, i, j - i))) * 1
    End If
    End With
    Set oHttp = Nothing
    End Function

  15. #15
    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
    oui je pense
    avec une requête ca ne fonctionne pas même en mettant le header request a jour

    donc choux blanc
    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

  16. #16
    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
    Citation Envoyé par - Dap - Voir le message
    Me concernant la fonction me retourne "PriceTag not found"
    La constante PriceTag n'est pas trouvée, le code est caduque car la page HTML a dû être modifiée depuis …


    Citation Envoyé par patricktoulon Voir le message
    je viens d'essayer avec une requette xmlhttp2
    ca ne fonctionne pas si on est pas loguer(login + password)
    Citation Envoyé par patricktoulon Voir le message
    avec une requête ca ne fonctionne pas même en mettant le header request a jour donc choux blanc
    J'aurais bien aimé voir ta tentative car aucun souci pourtant de mon côté avec la bibliothèque MSXML2 ou encore WinHttp :

    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
    Sub DemoBloombergSplitSplitSplit()
        Const URL = "http://www.bloomberg.com/quote/", _
              PRI = "<meta itemprop=""price"" content=""", CUR = "<span itemprop=""priceCurrency"">"
     
        With Worksheets("PEA Binck")
            TCK = .Cells(1).CurrentRegion.Columns(3).Value
            ReDim VA(2 To UBound(TCK), 1)
            On Error Resume Next
     
            With CreateObject("WinHttp.WinHttpRequest.5.1")
                For R& = 2 To UBound(TCK)
                    If TCK(R, 1) > "" Then
                        .Open "GET", URL & TCK(R, 1), False
                        .SetRequestHeader "DNT", "1"
                        .Send
                        If .Status <> 200 Then MsgBox "Erreur de connexion !", 16, Space(7) & Split(URL, "/")(2): Exit Sub
                              SP = Split(Split(.ResponseText, PRI)(1), CUR)
                        VA(R, 0) = Val(SP(0))
                        VA(R, 1) = Split(SP(1), "<")(0)
                    End If
                Next
            End With
     
            On Error GoTo 0
            .[E2:F2].Resize(UBound(VA) - 1).Value = VA
        End With
    End Sub
    Split de Split de Split : Chrüterchraft ‼ Hein Patrick !

    _____________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion
    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)

  17. #17
    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 c'est bon requette possible
    re
    essaie ca
    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
    Option Base 1
    Function GetPrice(symb)
    Const PriceTag = "span class="" price"">"
    Dim tablo(1, 2)
    Dim oHttp As Object, txt$, i&, j&
    On Error Resume Next
    Set oHttp = CreateObject("MSXML2.XMLHTTP")
    If Err <> 0 Then Set oHttp = CreateObject("MSXML.XMLHTTPRequest")
    If oHttp Is Nothing Then MsgBox "MSXML2.XMLHTTP not found", 16, "Error": Exit Function
    On Error GoTo 0
     
    With oHttp
    .Open "GET", "http://www.bloomberg.com/quote/" & symb, False
    .send
    txt = .responseText
    i = InStr(1, txt, PriceTag, 1)
    If i = 0 Then
    GetPrice = "PriceTag not found"
    Else
    code = Split(txt, PriceTag)(1)
    code = Split(code, "</span>")(0)
    code = "<" & PriceTag & vbCrLf & code & "</span></span>"
    Debug.Print code
    With CreateObject("htmlfile")
    .body.innerhtml = code
    tablo(1, 1) = Replace(.getelementsbytagname("span")(0).innertext, "EUR", "")
    tablo(1, 2) = .getelementsbytagname("span")(0).Children(0).innertext
    End With
    End If
    End With
    Set oHttp = Nothing
    GetPrice = tablo
    End Function
    Sub test()
        For i = 5 To Cells(Rows.Count, 3).End(xlUp).Row
        Range(Cells(i, 5), Cells(i, 6)) = GetPrice(Cells(i, 3).Value)
    End Sub
    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

  18. #18
    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




    Patrick, tu as oublié le Next dans la procédure Test !

    Et l'exécution est un peu plus longue que celle de la procédure de mon précédent message …
    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)

  19. #19
    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
    marc on s'est croisé

    oui j'ai essayé avec les 3

    Microsoft.xmlhttp

    MSXML.XMLHTTPRequest

    MSXML2.XMLHTTP

    et semblerait que l'on ai pas le même résultat avec chacun d'entre eux

    le "Microsoft.xmlhttp" visiblement a un soucis avec les cookies et comme c'est celui que j'utilise habituellement

    je sens que je vais revenir au bon vieux "MSXML.XMLHTTPRequest"
    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

  20. #20
    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




    Lors d'une série de tests dans un contexte particulier, MSXML était plus lent que MSXML2 et WinHttp.

    J'obtiens le même résultat ici entre MSXML2 et WinHttp sauf lorsque la cotation évolue entre temps …


    _____________________________________________________________________________________________________
    Quand vous citez un texte con, n'oubliez pas le contexte. (Jacques Prévert)
    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é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