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. #81
    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
    Ok je mets à jour tous les onglets que je peux (à priori tous sauf synthèse et devise). Ça va prendre un peu de temps mais j’essaie de faire cela ce soir.

    Citation Envoyé par patricktoulon Voir le message
    il me faut le fichier avec toutes les valeurs du tableau

    ensuite je vais regarder je ne comprends pas ton soucis tracker pas tracker mais surtout il faut que l'on travail sur le meme fichier de base

    supprime ton tableau carré bleu et orange il serve a rien puisque tu a maintenant les carré dans les commentaire

    on verra ensuite pour l'intégrer dans les fiche portefeuil
    allez donne moi ce fichier que l'on revoit tout ca
    ensuite il y a des colonnes qui visiblement ne servent a rien
    je pourrais m'en servir pour stocker des données
    par exemple derniere cotation en euros
    il y a aussi variation% celle la elle pourrais ce mettre a jour l'ors de la creation fiche en récupérant la valeur du tableau du meme nom

    etc....et des exemples j'en ai beaucoup
    Pièce jointe 176479
    Voici le fichier que j'ai mis à jour même si tout n'est pas encore parfait (il me manque le PEE entreprise car les données ne sont pas disponibles sur morningstar donc on verra plus tard, car la il faut que j'aille me coucher trop fatigué).

    Toutes les colonnes prévues sont utiles mais pour pouvoir toutes les remplir, il faut avancer la programmation (j'ai quand même rempli avec des exemples les colonnes que je pouvais mais les formules seront à remplacer par du code pour certaines, comme par exemple pour la colonne "Dernière cotation en euro" qui servira à avoir la valeur de la ligne en euro lorsque la devise initiale n'est pas "EUR"). S'il te faut des colonnes en plus pour stocker des données tu peux en ajouter selon le besoin.

    L'onglet "Synthèse" a été rempli juste pour que l'on comprennes ce que je souhaite faire à terme, à savoir saisir tous les mouvements vente/achat des différents portefeuilles depuis cet onglet (mais pour le moment nous travaillons directement sur chaque portefeuille c'est beaucoup plus facile).

    Pour l'onglet "devise" je pensais récupérer les valeurs de parité sur http://www.xe.com/fr/currencyconverter/ mais il y a pleins d'autres site qui sont peut être plus faciles à "récupérer" via des requêtes.

    N'hésites pas à poser des questions si besoin car je ne suis pas sûr que tout soit vraiment parfaitement clair.

    Bonne nuit et encore merci pour ton aide

    PS1 : j'ai renommé le fichier en "v_1.00" pour faciliter le suivi des versions
    PS2 : je n'ai pas retouché les deux onglets en cours de travail ("PEA Binck" et "AVie Linxea Evol") pour ne pas impacter le code mais il faudrait faire la mise en forme comme pour les autres onglets. Je le ferai si tu me donne le top.
    PS3 : sur les nouveaux onglets, j'ai décalé le point de repère de fin du tableau (*) en colonne A au niveau de la ligne "total" pour pouvoir insérer par la suite des lignes plus facilement. je n'ai par contre pas mis à jour le code en conséquence
    => j'ai laissé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    derlig = Columns(1).Find("*").Row
    qu'il faudra à priori mettre à jour avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    derlig = Columns(1).Find("*").Row-1
    PS4 : j'ai complété le code du module "menu" des différents portefeuilles (avec morningstar).
    Fichiers attachés Fichiers attachés

  2. #82
    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 à tous,

    Je vois qu'il y a du mouvement sur le sujet du coup cela me motive à m'y remettre aujourd'hui. Comme j'étais en déplacement puis maintenant en congé je n'ai pas avancé mis à par quelques tests (je suis toujours sur la version 1.00 de mon poste #98), je ne dispose que de mon petit portable pas confortable pour travailler.

    Le premier problème à traiter est la diversité de forme des pages morningstar. J'en ai identifié 3 types pour le moment :

    • type 1 : exemple ici => parfaitement fonctionnel avec la macro actuelle
    • type 2 : exemple ici => non fonctionnel mais presque identique
    • type 3 : exemple ici => plus compliqué car plusieurs occurrences apparaissent pour le même isin lors de la recherche voir ici et forme totalement différente de la page


    Dans un premier temps je pensais donc m'attaquer au type 2 qui semble être a ma portée mais je m'aperçois que je bloque. Je pense qu'il faut modifier la partie suivante du code et ajouter une condition si la première occurrence de "line text" n'est pas celle souhaitée.

    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
    Function recup_valeur(cel)
    (...)
            Set groupetd = .getElementsByTagName("TD")
            For Each elem In groupetd
                'line text
                If elem.classname = "line text" Then
                    tablo(1, 1) = Replace(Split(elem.innertext, " ")(1), ",", ".")
                    tablo(1, 2) = Split(elem.innertext, " ")(0)
                    cel.Offset(0, 5) = Replace(elem.ParentNode.Children(0).Children(0).innertext, vbCrLf, "")
                    Exit For
                End If
            Next
        End With
        recup_valeur = tablo
    End Function
    En effet dans le cas des pages de type 2 le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If elem.classname = "line text" Then
    renvoi la première occurrence de "line text" et non la 2ème.

    Or la page de type 2 est construite de la manière suivante :
    Nom : cap22.PNG
Affichages : 402
Taille : 19,5 Ko

    alors que la page de type 1 est construite de la manière suivante :
    Nom : cap11.PNG
Affichages : 391
Taille : 13,4 Ko

    Pour les pages de types 3 étant donnée qu'il y a plusieurs occurrences pour le même ISIN je bloque avez-vous des idées ou des pistes ? Est-il possible (par exemple) de proposer à l’utilisateur les différentes possibilités pour qu'il choisisse celle qui convient par un clique de souris ? Il me semble de toute façon qu'il faudrait gérer ce type de page dans une macro séparée étant donnée que la page internet est complétement différente.

    Merci pour votre aide !

  3. #83
    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
    re
    salut Dap
    comme excel ne devine pas il faut te servir de ce que tu a
    alors une solution pour le type 2 serait de prendre celui qui n'a pas le symbole"%" on est bien d'accord
    dans ce cas 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
    Function recup_valeur(cel)
            Set groupetd = .getElementsByTagName("TD")
            For Each elem In groupetd
                'line text
                If elem.classname = "line text" Then
                    If InStr(elem.innertext, "%") < 0 Then
                    tablo(1, 1) = Replace(Split(elem.innertext, " ")(1), ",", ".")
                    tablo(1, 2) = Split(elem.innertext, " ")(0)
                    cel.Offset(0, 5) = Replace(elem.ParentNode.Children(0).Children(0).innertext, vbCrLf, "")
                    Exit For
               End If
               End If
            Next
        End With
    je t'ai donné un squelette a toi maintenant de l'arranger a ta sauce
    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

  4. #84
    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

  5. #85
    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
    pour le type 3
    regarde la capture d'écran et dis moi que la classe de l'élément ne te rappelle rien
    Nom : Capture.JPG
Affichages : 475
Taille : 262,9 Ko
    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

  6. #86
    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
    Oui c'est une programmation du style (je l'ai pas essayée) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set groupespan = .getElementsByTagName("SPAN")
               For Each elem In groupespan
                        If elem.classname = " price" Then
                        tablo(1, 1) = Val(Replace(elem.innertext, Left(elem.innertext,1),""))
                        tablo(1, 2) = Left(elem.innertext,1)
    Mais ma grosse difficulté est :
    • d'identifier ce type de page (type 3)
    • de traiter le problème induit par les multiples résultats pour un même ISIN (voir ici par exemple).

  7. #87
    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
    et ben dis donc ca rame fort

    analyse bien cette proposition type1,type2,type3 en un!!!!!!
    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
    Function recup_valeur(cel)
     
    trouvé = False
    Set groupespan = .getElementsByTagName("SPAN")
            Set groupetd = .getElementsByTagName("TD")
            For Each elem In groupetd
                'line text
                If elem.classname = "line text" Then
                    If InStr(elem.innertext, "%") < 0 Then
                    tablo(1, 1) = Replace(Split(elem.innertext, " ")(1), ",", ".")
                    tablo(1, 2) = Split(elem.innertext, " ")(0)
                    cel.Offset(0, 5) = Replace(elem.ParentNode.Children(0).Children(0).innertext, vbCrLf, "")
                    trouvé = True
                    Exit For
               End If
               End If
            Next
        If trouvé = False Then
        For Each elem In groupespan
                'line text
                If elem.classname = "price" Then
        tablo(1, 1) = Replace(elem.innertext, "$", "")
        'etc......pour le reste du code
        'blablabla
        'blablabla
            End If
         End With
    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

  8. #88
    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
    Oui ça rame

    Je teste ta proposition ce soir !

  9. #89
    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
    en fait la proposition est simple
    principe:

    si dans les td il y a line texte on prend celui qui n'a pas le symbole
    ce qui reviens a prendre le 1 er ou le 2 eme et trouvé devient true et sorti de boucle for

    ensuite on passe dans le 2 eme if mais sur les span si trouvé = false

    si trouvé = true on saute jusqu'à la fin puisque que l'on a trouvé les valeurs
    pas plus compliqué que ca
    ainsi c'est comme le W40 "3 en un"
    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. #90
    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
    Bon j'ai avancé suivant ta proposition. La macro tourne mais sans faire aucune action visible et les espions sur elem, groupespan et groupetd sont tous "hors du context" ?

    La ligne qui semble ne pas correctement être interprétée est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If InStr(elem.innertext, "%") < 0 Then
    d’ailleurs j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If InStr(elem.innertext, "%") = 0 Then
    car il me semble que InStr renvoi 0 si la fonction ne trouve pas d’occurrence ?

    Je mets la version 1.01 pour faciliter la compréhension avec tout le code

    Nota : sur mon portable que j'ai actuellement en vacances je suis sous Excel 2010 (au lieu de 2013 sur mon fixe)
    Fichiers attachés Fichiers attachés

  11. #91
    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
    re
    oui c'est vrai
    j'utilise aussi une autre astuce pour remplacer la condition sur le instr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if replace(elem.innertext,"%","")=elem.innertext then
    des solutions il y en a plein
    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. #92
    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
    Bon j'ai trouvé c'était juste une erreur de positionnement de "Exit For" du coup les pages type 1 et type 2 fonctionnent maintenant il reste le souci des pages de type 3.

    En PJ, la version 1.02 fonctionnelle pour les pages type 1 et type 2 (pas type 3).

    Edit : la ruche ne fonctionne que pour les pages type 1
    Fichiers attachés Fichiers attachés

  13. #93
    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
    a non justement le exit for doit être a l'intérieur de la condition instr!!!!!!!!!!
    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. #94
    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
    Oui c'était mon erreur que j'ai corrigé dans la v 1.02

    Re,

    Bon concernant les pages de type 3 je bloque non pas à cause de vba mais à cause de la construction de l'url que je n'arrive pas à comprendre.

    Si je prends par exemple IBM (ISIN => US4592001014) :

    1) le programme va chercher l'id morningstar (en fait le premier id de la liste s'il y en a plusieurs).

    Pour cela il se rends à l'adresse suivante : "http://www.morningstar.fr/fr/funds/SecuritySearchResults.aspx?search=US4592001014&type=" lien


    Puis il trouve l'id : 0P000002RH

    Nom : Capture.PNG
Affichages : 475
Taille : 56,2 Ko

    2) Si l'on suis la logique des pages type 1 ou type 2 il suffirait alors d'aller à l'url suivante : "http://www.morningstar.fr/fr/funds/snapshot/snapshot.aspx?id=0P000002RH" lien (qui ne fonctionne pas)

    En fait si l'on clique sur 1er lien donnée à l'url suivante : lien

    On arrive à l'adresse suivante plus complexe : "http://tools.morningstar.fr/fr/stockreport/default.aspx?Site=fr&id=0P000002RH&LanguageId=fr-FR&SecurityToken=0P000002RH]3]0]E0WWE$$ALL" lien (qui est la bonne adresse)

    Quelqu’un a-t-il une idée d’où est stockée la bonne url dans le code source de la page internet ? ou bien comment l'url est construite ?

    Merci d'avance

  15. #95
    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 dap

    c'est normal c'est un fond qui n'est pas vendu en France le message est parfaitement explicite
    et la base de l'url "http://www.morningstar.fr/fr/funds/snapshot/snapshot.aspx?id="
    c'est pour les fond géré aussi par les bourses françaises d'où le fr/fr
    Nom : Capture.JPG
Affichages : 444
Taille : 127,2 Ko
    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. #96
    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
    re,

    Oui j'ai bien compris cela, je me suis mal exprimé.

    Ce que je ne trouve pas c'est où se situe l'information dans le code source de la page internet qui indique que lorsque l'on clique sur le lien hypertexte (surligné en jaune sur l'image ci-dessous, lien de la page).
    Nom : Capture2.PNG
Affichages : 432
Taille : 49,1 Ko

    Il faut alors se rendre au lien suivant : "http://tools.morningstar.fr/fr/stockreport/default.aspx?Site=fr&id=0P000002RH&LanguageId=fr-FR&SecurityToken=0P000002RH]3]0]E0WWE$$ALL" lien.

    J'ai besoin de trouver cette information pour pouvoir modifier le code vba pour le traitement des pages de type 3 et faire la requête sur la bonne page web.

    Car le code actuel fait une requête sur une "mauvaise page" (pour le type 3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function recup_valeur(cel)
        Dim trouvé As Boolean
        Dim oHttP2 As Object, baseuRl, tablo(1, 2)
        trouvé = False
        URL = "http://www.morningstar.fr/fr/funds/snapshot/snapshot.aspx?id=" & cel.Value
        Set oHttP2 = CreateObject("MSXML2.XMLHTTP")
        oHttP2.Open "POST", URL, False
        oHttP2.send
        With CreateObject("htmlfile")
            .write oHttP2.responseText
    '(...)
    Edit : c'est bon en fait il faut tout simplement ajouter l'adresse indiquée à la suite de la racine :
    "http://www.morningstar.fr/fr/stockquicktake/default.aspx?id=0P000002RH" qui se transforme alors en
    "http://tools.morningstar.fr/fr/stockreport/default.aspx?Site=fr&id=0P000002RH&LanguageId=fr-FR&SecurityToken=0P000002RH]3]0]E0WWE$$ALL".

    Je me prends la tête pour rien

  17. #97
    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
    re,

    J'ai bien avancé et je pense même que mon code devrait être fonctionnel pour tous les types de pages morningstar (types 1, 2 et 3).

    Mais en fait il me reste une "erreur d’exécution", "accès refusé" sur la ligne 10 (voir code ci-dessous) lorsque la page est de type 3 (uniquement). Pourtant l'espion m'indique que l'URL est bien la bonne. D'ailleurs si je l'entre à la main directement dans internet explorer cela marche parfaitement. Il semble que c'est la page internet qui bloque l'accès. Y a-t-il une astuce pour contourner ce blocage ?

    Nom : Capture3.PNG
Affichages : 410
Taille : 7,7 Ko


    code avec les requêtes des fonctions "recup_valeur" et "Recup_link_Morningstar" modifiées
    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
    Function recup_valeur(cel)
        Dim trouvé As Boolean
        Dim oHttP2 As Object, baseuRl, tablo(1, 2), groupeSPAN As Object, groupeTD As Object, uRl As String
     
        trouvé = False
        'uRl = "http://www.morningstar.fr/fr/funds/snapshot/snapshot.aspx?id=" & cel.Value '<-------- ancienne ligne v 1.02
        uRl = cel.Hyperlinks(1).Address
        Set oHttP2 = CreateObject("MSXML2.XMLHTTP")
        oHttP2.Open "POST", uRl, False
        oHttP2.send
        With CreateObject("htmlfile")
            .write oHttP2.responseText
     
            Set groupeSPAN = .getElementsByTagName("SPAN")
            Set groupeTD = .getElementsByTagName("TD")
     
            For Each elem In groupeTD
                'line text
                If elem.classname = "line text" Then
                    If InStr(elem.innertext, "%") = 0 Then
                        tablo(1, 1) = Replace(Split(elem.innertext, " ")(1), ",", ".")
                        tablo(1, 2) = Split(elem.innertext, " ")(0)
                        cel.Offset(0, 5) = Replace(Replace(Replace(elem.ParentNode.Children(0).Children(0).innertext, vbCrLf, ""), "(", ""), ")", "")
                        trouvé = True
                        Exit For
                    End If
                End If
     
            Next
     
            If trouvé = False Then
     
                For Each elem In groupeSPAN
                    'price
                    If elem.classname = "price" Then
                        If InStr(elem.innertext, "$") > 0 Then
                            tablo(1, 1) = Replace(elem.innertext, "$", "")
                        ElseIf InStr(elem.innertext, "€") > 0 Then
                            tablo(1, 1) = Replace(elem.innertext, "€", "")
                        Else
                            tablo(1, 1) = elem.innertext
                        End If
     
                     Exit For
                     End If
                Next
            End If
        End With
     
        recup_valeur = tablo
     
    End Function
     
    'Fonction de recherche des liens morningstar en fonction des ISIN
     
    Function Recup_link_Morningstar(cel As Range)
     
        'Déclaration des variables
        Dim oHttp As Object, mylink As Object, groupeTD As Object, uRl As String, i As LongPtr
     
        'Requête HTTP
        Set oHttp = CreateObject("MSXML2.XMLHTTP")
        oHttp.Open "POST", "http://www.morningstar.fr/fr/funds/SecuritySearchResults.aspx?type=ALL&search=" & cel.Value, False
        oHttp.send
        With CreateObject("htmlfile")
            .write oHttp.responseText
            Set groupeTD = .getElementsByTagName("TD")
     
            'Recherche de l'URL correspondant à l'ISIN
            For i = 1 To groupeTD.Length - 1
                If groupeTD(i).classname = "msDataText searchLink" Then Set mylink = groupeTD(i).Children(0): Exit For
            Next
            uRl = "http://www.morningstar.fr/" & Split(mylink.href, "about:")(1)
    '       cel.Offset(0, 1) = Split(mylink.href, "=")(1) ' ancien code version 1.02
            cel.Hyperlinks.Add Anchor:=cel.Offset(0, 1), Address:=uRl, TextToDisplay:=Split(mylink.href, "=")(1)
        End With
     
        Range(Cells(cel.Row, 6), Cells(cel.Row, 7)) = recup_valeur(Cells(cel.Row, 4))
        reg = True
     
    End Function
    Je joins également la version 1.03 associée si besoin
    Fichiers attachés Fichiers attachés

  18. #98
    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
    Re,

    Bon j'ai trouvé une solution qui consiste à remplacer la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oHttP2 = CreateObject("MSXML2.XMLHTTP")
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oHttP2 = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    avec cela ça tous les types de page fonctionnent .

    Par contre je ne sais pas si cela entraine des inconvénients et je n'ai pas compris pourquoi cela ne marchais pas avec l'autre méthode mais le résultat est la.

  19. #99
    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 dap
    De la meme maniere que je construit les lien s Pour les graphiques et mes carrés
    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. #100
    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,

    Le programme avance:
    • j'ai fini de traiter tous les types de pages morningstar type 1, type 2 ou type 3 (il me reste à adapter les versions "ruche" que je n'ai mis à jour)
    • j'ai modifié le programme pour traiter le cas où l'ISIN n'est pas trouvé sur morningstar.
    • j'ai ajouté une nouvelle macro pour récupérer les taux de change des devises (onglet "Devise")
    • j'ai ajouté une macro pour remplir cet onglet avec une version VBScript (ruche)



    Suite à cela j'ai 3 questions :

    Question n°1 :

    Pour la version ruche de l'onglet "Devise, j'obtiens le message d’erreur suivant (erreur sur ligne n°12) :
    Nom : Capture.PNG
Affichages : 381
Taille : 9,0 Ko

    Quel peut en être la raison ?
    le code est le suivant :
    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
    Sub Ruchedevise()
        createabeille3
        abeille2 = ThisWorkbook.Path & "\abeille3" & ".vbs"
        derlig = Range("B" & Rows.Count).End(xlUp).Row
        SC = """" & abeille3 & """ "
        Range("c4:c" & derlig) = ""
     
     
        For i = 3 To derlig
            If Cells(i, 2) <> "" Then
                With CreateObject("WScript.Shell")
                    .Run SC & " " & i
                End With
            End If
        Next
    End Sub
    Sub createabeille3()
    'exemple http://www.bloomberg.com/quote/USDEUR:CUR
    'contrairement à la version sans vbscript "RecupDevise" cette version ne gère pas la récupération lorsque la page XXXEUX:CUR n'existe pas : exemple http://www.bloomberg.com/quote/AEDUSD:CUR
     
        texte = texte & vbCrLf & "deVise= GetObject(, ""Excel.Application"").Workbooks(""" & ThisWorkbook.Name & """).Worksheets(""" & ActiveSheet.Name & """).Range(""B""& WScript.Arguments(0))"
        texte = texte & vbCrLf & "Set oHttp = CreateObject(""MSXML2.XMLHTTP"")"
        texte = texte & vbCrLf & "oHttp.Open ""GET"", ""http://www.bloomberg.com/quote/"" & deVise & ""EUR:CUR"", False"
        texte = texte & vbCrLf & "oHttp.send"
        texte = texte & vbCrLf & "texto = oHttp.responseText"
     
        texte = texte & vbCrLf & "Set oHttp = Nothing"
        texte = texte & vbCrLf & "divo = Split(texto, ""<span class="""" price"""">"")(1)"
        texte = texte & vbCrLf & " texte1 = Split(divo, ""</span>"")(0)"
        texte = texte & vbCrLf & "texte1 = ""<span class="""" price"""">"" & texte1 & ""</span>"" & ""</span>"""
     
     
        texte = texte & vbCrLf & "With CreateObject(""htmlfile"")"
           texte = texte & vbCrLf & " .write texte1"
           texte = texte & vbCrLf & " For Each elem In .all"
                texte = texte & vbCrLf & "If elem.classname = "" price"" Then"
     
                    texte = texte & vbCrLf & "valeur = Split(elem.innertext, "" "")(0)"
     
     
                texte = texte & vbCrLf & "End If"
     
            texte = texte & vbCrLf & "Next"
        texte = texte & vbCrLf & "End With"
    texte = texte & vbCrLf & "GetObject(, ""Excel.Application"").Workbooks(""" & ThisWorkbook.Name & """).Worksheets(""" & ActiveSheet.Name & """).Range(""C""& WScript.Arguments(0))= valeur"
     
     
        With ThisWorkbook
            'On copie le code dans un fichier
            Set FSys = CreateObject("Scripting.FileSystemObject")
            Set MonFic = FSys.CreateTextFile(.Path & "\abeille3" & ".vbs")
            With MonFic    'Pour écrire dans le fichier texte
                .write texte
            End With
        End With
    End Sub
    La version "sans ruche" qui fonctionne est le suivant :
    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
    Option Base 1
    Function RecupDevise(roww)
    'exemple http://www.bloomberg.com/quote/USDEUR:CUR
        Dim cUr As Double, oHttp As Object, deVise As String, oCc As Boolean
     
        oCc = False
     
        Set oHttp = CreateObject("MSXML2.XMLHTTP")
     
        deVise = Cells(roww, 2).Value
     
        With oHttp: .Open "get", "http://www.bloomberg.com/quote/" & deVise & "EUR:CUR", False: .send
     
            If oHttp.Status = 200 Then
     
                With CreateObject("htmlfile")
                    .body.innerhtml = oHttp.responseText
                    For Each elem In .all
     
                        If elem.classname = " price" Then
                            oCc = True
                                cUr = Val(Replace(elem.innertext, ",", "."))
                        End If
                    Next
                End With
            End If
        End With
     
        Set oHttp = Nothing
     
        If oCc = True Then
     
            RecupDevise = cUr
     
        Else
     
            RecupDevise = RecupDeviseUSD(roww) * RecupDevise(4)
     
        End If
    End Function
     
    'gestion de la devise lorsque la page XXXEUX:CUR n'existe pas
    '*************************************************************
     
    Function RecupDeviseUSD(roww)
    'exemple http://www.bloomberg.com/quote/AEDUSD:CUR
        Dim cUr As Double, oHttp As Object, deVise As String, derlig As Single
     
     
        Set oHttp = CreateObject("MSXML2.XMLHTTP")
     
        deVise = Cells(roww, 2).Value
     
     
        With oHttp: .Open "get", "http://www.bloomberg.com/quote/" & deVise & "USD:CUR", False: .send
     
            If oHttp.Status = 200 Then
     
                With CreateObject("htmlfile")
                    .body.innerhtml = oHttp.responseText
                    For Each elem In .all
     
                        If elem.classname = " price" Then
     
                                cUr = Val(Replace(elem.innertext, ",", "."))
     
                        End If
                    Next
                End With
            End If
     
        End With
     
     
        Set oHttp = Nothing
        RecupDeviseUSD = cUr
     
    End Function
     
    Public Sub mise_a_jour_devise()
    Dim derlig As Single
        derlig = Range("B" & Rows.Count).End(xlUp).Row
        Range("c4:c" & derlig) = ""
     
        For i = 4 To derlig
            Cells(i, 3) = IIf(Cells(i, 2) <> "", RecupDevise(i), "")
        Next
    End Sub
     
    Sub mise_ajour_ligne_Devise(lig)
     Range("c4:c" & lig) = ""
     
     Cells(lig, 3) = IIf(Cells(lig, 2) <> "", RecupDevise(lig), "")
     
    End Sub
    Question n°2 :

    Pour les pages de type 3, j'obtiens en plus de la date l'heure et le fuseau horaire, voir exemple ci-dessous :
    Nom : Capture2.PNG
Affichages : 464
Taille : 32,8 Ko

    Est-il possible de convertir facilement (sans passer par l’écriture d'une fonction complexe) cette date et heure en date et heure locale tenant compte des heures d'hiver/été ?

    J'ai vu qu'il existait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TimeZoneInfo.ConvertTime(dateTime, destinationTimeZone)
    est-ce la bonne piste car cela ne semble convertir seulement l'heure et pas la date ?

    Question n°3 :
    Je souhaite ajouter les menus personnalisés lors du clique droit sur d'autres onglets (exemple onglet "Devise")

    J'ai ajouté le code suivant (en rouge) dans le module "Menu" :
    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
    Sub barreGENERALE(Sh)
        deletebar "GENERALEMENU"
        Set MaBarre = Application.CommandBars.Add(Name:="GENERALEMENU", Position:=msoBarPopup)
        With MaBarre
            Set cpop = .Controls.Add(Type:=msoControlPopup)
            With cpop: .Caption = "*** Menu Pages ***"
                For Each SHS In ThisWorkbook.Worksheets
                    Set bout = .Controls.Add(Type:=msoControlButton)
                    bout.Enabled = SHS.Name <> Sh.Name
                    With bout
                        .Caption = "page  " & SHS.Name
                        .OnAction = "'choixpage " & Chr(34) & SHS.Name & Chr(34) & "'"
                    End With
    
                Next
            End With
    '(...)
                '**********************************************************************************************
                '**********************************************************************************************
                'SI C EST LE SHEET DEVISE METTRE CES BOUTON DANS LA BARRE
                ElseIf Sh.Name = "Devise" Then
    
    
                'Set bout = .Controls.Add(Type:=msoControlButton)
                'With bout: .Caption = "*** Menu CTO Degiro ***": .Enabled = False: End With
                ' reste des bouton ici
    
                Set bout = .Controls.Add(Type:=msoControlButton)
                With bout: .Caption = "*** Menu MORNINGSTAR ***": .Enabled = False: End With
                
    '            Set cpop2 = .Controls.Add(Type:=msoControlPopup)
    '            With cpop2
    '                .Caption = "mise a jour integrale"
    '
    '                Set bout = .Controls.Add(Type:=msoControlButton)
    '                With bout: .OnAction = "mise_ajour_int_MORNING": .Caption = "sans  la ruche ": End With
    '
    '                Set bout = .Controls.Add(Type:=msoControlButton)
    '                With bout: .OnAction = "RucheMorning": .Caption = "avec la ruche ": End With
    '
    '            End With
    '
    '            Set bout = .Controls.Add(Type:=msoControlButton)
    '            With bout: .OnAction = "'mise_ajour_ligneM " & Chr(34) & ActiveCell.Row & Chr(34) & "'": .Caption = "mise a jour de la Ligne": End With
    '
    '            Set bout = .Controls.Add(Type:=msoControlButton)
    '            With bout: .OnAction = "'fichePorT " & Chr(34) & ActiveCell.Row & Chr(34) & "'": .Caption = "Céation de la fiche portefeuille": End With
    '
    '            Set bout = .Controls.Add(Type:=msoControlButton)
    '            With bout: .OnAction = "'visiter2 " & Chr(34) & Cells(ActiveCell.Row, 2).Value & Chr(34) & "'": .Caption = "visiter la page de cette valeur": End With
    
                '**********************************************************************************************
    '(...)
            End If
    
        End With
    
        MaBarre.ShowPopup
        Cancel = True
    End Sub
    Le problème est que je ne comprends pas comment marche cette fonctionnalité, je n'arrive pas à exécuter la macro qui semble être cachée

    Nota : Si besoin ou pour ceux que cela intéresse, en pj la version 1.04
    Fichiers attachés Fichiers attachés

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