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 :

Cours de bourse et VBA - API Yahoo Finance


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    ingénieur industriel
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur industriel
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Par défaut Cours de bourse et VBA - API Yahoo Finance
    Bonjour à tous,

    Je cherche à me créer un fichier de reporting pour le suivi de portefeuille boursier.

    L'utilisateur rentre dans la colonne A les codes mnemo spécifiques à Yahoo Finance (ou autre, je suis preneur d'idées) et la macro va chercher les informations suivantes :
    - nom de l'entreprise
    - devise
    - yield
    - cours
    - rendement

    Mon code est inspiré de celui-ci :

    Mon début de code récupère bien ces informations (testé avec un debug.print) mais me remplis seulement la première ligne. Je dois mal utiliser le Split en vba....
    Voir fichier joint.

    De plus j'aimerais aussi récupérer le secteur de chaque entreprise (ex: consommation de base / consommation discrétionnaire / immobilier / énergie / santé / etc) mais je n'ai pas trouvé comment faire.

    Mon code utilise la référence Microsoft WinHttp, est-il possible d'activer cette référence automatiquement par vba (utiles afin de pouvoir se servir du fichier sur plusieurs postes sans penser à recocher à chaque fois la référence).


    D'avance merci aux âmes charitables et désolé pour la longueur apparente du message.

    Si vous souhaitez des précisions je serais heureux de vous les fournir.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    quand tu crées ton tableau Lines, il ne contient qu'une seule ligne. Cette ligne contient l'ensemble de tes lignes de cotation, car la constante VbNewLine n'est pas la bonne

    utilise plutôt la constante de retour à la ligne VbLf (ou Chr(10) qui est un équivalent)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Lines = Split(Resp, vbLf) ' on peut aussi utiliser Chr(10))

    Ensuite, pour éviter de devoir activer la référence WinHttpRequest, tu peux travailler en liaison tardive.
    On déclare la variable en objet, et on l'instancie en créant l'objet WinHttpRequest :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim X As Object 'New WinHttpRequest
    Set X = CreateObject("WinHttp.WinHttpRequest.5.1")

  3. #3
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Pour la virgule de FB
    Commencer par ajouter la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function Separ(ByVal Tmp As String)
    Dim Rg As Object, A As Object, B As Object
     
    Set Rg = CreateObject("Vbscript.Regexp")
    With Rg
        .Pattern = "(""|\d|N/A)(,)"
        .Global = True
        If .Test(Tmp) Then Separ = .Replace(Tmp, "$1;")
    End With
    Set Rg = Nothing
    End Function
    et remplace dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    '...
    Resp = Replace(Separ(X.responseText), """", "") '<<ICI 
    Lines = Split(Resp, vbLf)
     
    For i = 0 To UBound(Lines)
        sLine = Lines(i)
        If InStr(sLine, ";") > 0 Then
            Valeur = Split(sLine, ";")
            W.Cells(i + 6, 2).Value = Valeur(1)
            W.Cells(i + 6, 4).Value = Valeur(2)
    '...
    Et pour bien te former, les cours et tutoriels pour apprendre Excel : https://excel.developpez.com/cours/

  4. #4
    Membre régulier
    Homme Profil pro
    ingénieur industriel
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur industriel
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Par défaut
    Bonjour à tous les deux

    Merci pour vos réponses et retours rapides.

    Je teste cette après midi et je vous tiens au courant.

    Pour récupérer les secteurs des industries avez vous une piste ?
    Sinon je le ferais à la main avec une liste des secteurs possibles et un petit coup de data validation.

  5. #5
    Membre régulier
    Homme Profil pro
    ingénieur industriel
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur industriel
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Par défaut
    BRAVO et MERCI à tous les deux cela fonctionne super bien.

    Je laisse la discussion ouverte encore quelques temps si jamais je trouve pour les secteurs.

    bien à vous

  6. #6
    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 heu
    bonjour
    pirouette cacahuette
    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
    Sub refresh_portefeuille()
        Dim W As Worksheet: Set W = Worksheets("Portefeuille")
        Dim groupeticker As String, URL As String, Resp As String, X As New WinHttpRequest, ligne As Variant, Valeur As Variant,ind as long,plage as range 
        With W
            If .Cells(6, 1) = "" Then Exit Sub
            Set plage = .Range(.Cells(6, 1), .Cells(Rows.Count, 1).End(xlUp))
            groupeticker = Join(Application.Transpose(plage), "+")
        End With
        URL = "http://finance.yahoo.com/d/quotes.csv?s=" & groupeticker & "&f=snc4yl1d"
        X.Open "GET", URL, False
        X.send
        Resp = Replace(X.responseText, Chr(34), "")
        ligne = Split(Resp, Chr(10))
        For i = 0 To UBound(ligne)
            If InStr(ligne(i), ",") > 0 Then
                Valeur = Split(ligne(i), ",")
                Debug.Print UBound(Valeur)
                m = 6 + i
                'm saute d'une ligne a chaque tour
                'si il y a plus de 6 element alors ind=1 sinon zero que l'on ajoute a l'index lors de la retranscription dans w.cells.......
                ind = IIf(UBound(Valeur) > 5, 1, 0)
                'pour le premier si ind=1 alors lacelluelem,2 aura valeur1 et 2
                'pour les autres si ind = 1 alors on ajoute a l'index (=valeur(X +ind))
     
                W.Cells(m, 2).Value = Replace(Valeur(1) & IIf(UBound(Valeur) > 5, Valeur(2), ""), Chr(34), "")
                W.Cells(m, 4).Value = Replace(Valeur(2 + ind), Chr(34), "")
                W.Cells(m, 5).Value = Valeur(3 + ind)
                W.Cells(m, 9).Value = Valeur(4 + ind)
                W.Cells(m, 13).Value = Valeur(5 + ind)  'pb sur cette valeur, affiche le rendement et le deuxieme nom du code mnémo
            End If
        Next i
        W.Cells.Columns.AutoFit
    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

Discussions similaires

  1. Récup cours de bourses en auto VBA
    Par Labaioune dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 09/11/2013, 15h47
  2. VBA Cours de Bourse
    Par Eliott44 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/04/2013, 12h29
  3. [XL-2010] VBA supprimer cours de bourse
    Par charly120 dans le forum Excel
    Réponses: 0
    Dernier message: 26/03/2013, 11h04
  4. [XL-2003] Récup cours de bourses en auto VBA
    Par Maxgad dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 29/12/2012, 18h54
  5. [XL-2010] VBA - Télécharger deux fichier excel depuis yahoo finance
    Par larson101 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 02/05/2011, 14h43

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