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 :

Gestion de message d'erreur lors d'une importation de données de Yahoo Finance


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2017
    Messages : 7
    Par défaut Gestion de message d'erreur lors d'une importation de données de Yahoo Finance
    Bonjour,

    Dans le cadre de mon mémoire de fin d'études, un de mes objectifs est de constituer une matrice des prix d'un certain nombre d'actions financières entre 2 dates prédéfinies, en récupérant les données sur Yahoo Finance. J'ai donc sur une feuille Excel la liste en colonnes de tous les noms des actions que je souhaite observer (et plus précisément les diminutifs de ces noms -"tickers"-, ces diminutifs entrant chacune des url récupérées), et je cherche à faire une boucle sur toute cette liste, récupérer les données et les ajouter à ma matrice petit à petit (qui est sur une autre feuille).

    J'ai récupéré un code sur internet qui le fait pour une action, il prend le ticker dans "Tickers", les dates de début et de fin dans "Sheet1" et sort les données complètes dans "Data". Je ne souhaite que recopier la 6° colonne qui sort dans "Data" dans "Results", en les faisant démarrer à la bonne date.

    Cependant il est plus compliqué de le faire pour une liste : en effet, si le ticker n'est pas reconnu par Yahoo ou que les données de Yahoo ne rentrent pas dans les bornes de dates données pour une action, je me retrouve avec un message d'erreur et le code s'arrête. Je souhaiterais à la place que le ticker soit sauté et que la boucle passe au suivant directement.
    N'y connaissant pas grand chose en gestion d'erreurs sous VBA, j'ai fait un peu de recherches et j'ai essayé comme solution "On Error GoTo" qui, dans l'idée dès qu'il obtient un message d'erreur incrémente la variable de ligne de ticker directement et retourne au début de la boucle. Ce que je ne comprends pas, c'est que cette solution n'a l'air de marcher qu'une fois. J'ai fait un essai avec 1 action dont le ticker n'existe pas, une deuxième qui marche et une troisième qui n'existe pas, et je me prends le message d'erreur de la 3° (avec arrêt du code) après que le 1° ait été correctement sauté.

    De ce fait, est-ce que quelqu'un aurait une idée pour m'aider à corriger ce souci ?
    Merci beaucoup.

    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    Sub Thesis()
     
    Dim DataSheet As Worksheet
    Dim EndDate As Date
    Dim StartDate As Date
    Dim Symbol As String
    Dim qurl As String
    Dim nQuery As Name
    Dim LastRow As Integer
    Dim ChoixIndice As Integer
    Dim Ltickers As Integer
    Dim Ltable As Integer
    Dim Lmatrix As Integer
    Dim Cmatrix As Integer
     
    Sheets("Sheet1").Activate
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    Sheets("Results").Cells.Clear
     
    'Ajout d'une colonne de dates entre les limites données dans la feuille "Results" (sans les weekends - cette partie n'est pas finie mais importe peu ici)
    'Pour pouvoir coller les données de chaque action au bon endroit
    '(Pas très important pour mon problème)
        Set DataSheet = ActiveSheet
        StartDate = Sheets("Sheet1").Cells(6, 2)
        EndDate = Sheets("Sheet1").Cells(7, 2)
     
        Lmatrix = 2
        Cmatrix = 2
        Sheets("Results").Cells(1, 1) = "Date"
        While StartDate <= EndDate
            If Weekday(StartDate) <> 1 And Weekday(StartDate) <> 7 Then
                Sheets("Results").Cells(Lmatrix, 1) = StartDate
                Lmatrix = Lmatrix + 1
           End If
            StartDate = StartDate + 1
        Wend
     
    '------------------------------
     
    'Import des données
     
    ChoixIndice = 1 '1 pour SP500, 2 pour Industrial DJ, 3 pour CAC40
     
        'Parcourt la liste des tickers
    Ltickers = 2
     
    'Début de la boucle sur la liste des tickers
     
    LoopLine:
        While Sheets("Tickers").Cells(Ltickers, ChoixIndice) <> ""
     
            Sheets("Data").Cells.Clear
            Set DataSheet = ActiveSheet
     
            StartDate = Sheets("Sheet1").Cells(6, 2)
            EndDate = Sheets("Sheet1").Cells(7, 2)
            Symbol = Sheets("Tickers").Cells(Ltickers, 1)
            Sheets("Data").Range("a1").CurrentRegion.ClearContents
     
                qurl = "http://ichart.finance.yahoo.com/table.csv?s=" & Symbol
                qurl = qurl & "&a=" & Month(StartDate) - 1 & "&b=" & Day(StartDate) & _
                    "&c=" & Year(StartDate) & "&d=" & Month(EndDate) - 1 & "&e=" & _
                    Day(EndDate) & "&f=" & Year(EndDate) & "&g=" & Sheets("Data").Range("a1") & "&q=q&y=0&z=" & _
                    Symbol & "&x=.csv"
     
    QueryQuote:
        On Error GoTo ErrorImport 'J'ai donc ajouté le On Error GoTo ici qui renvoie en bas du programme
                         With Sheets("Data").QueryTables.Add(Connection:="URL;" & qurl, Destination:=Sheets("Data").Range("a1"))
                            .BackgroundQuery = True
                            .TablesOnlyFromHTML = False
                            .Refresh BackgroundQuery:=False 'C'est à cette ligne que le message d'erreur apparaît
                            .SaveData = True
                        End With
     
                        Sheets("Data").Range("a1").CurrentRegion.TextToColumns Destination:=Sheets("Data").Range("a1"), DataType:=xlDelimited, _
                            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
                            Semicolon:=False, Comma:=True, Space:=False, other:=False
     
                     Sheets("Data").Columns("A:G").ColumnWidth = 12
     
                LastRow = Sheets("Data").UsedRange.Row - 2 + Sheets("Data").UsedRange.Rows.Count
     
                Sheets("Data").Sort.SortFields.Add Key:=Range("A2"), _
                    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                With Sheets("Data").Sort
                    .SetRange Range("A1:G" & LastRow)
                    .Header = xlYes
                    .MatchCase = False
                    .Orientation = xlTopToBottom
                    .SortMethod = xlPinYin
                    .Apply
                    .SortFields.Clear
                End With
     
    'Report des données de Yahoo dans la matrice Results
        Lmatrix = 2
        Ltable = 2
     
        'Recherche de la date de début dans Results
        While Sheets("Results").Cells(Lmatrix, 1) <> Sheets("Data").Cells(Ltable, 1)
            Lmatrix = Lmatrix + 1
        Wend
     
        'Report des valeurs de la colonne 6 de "Data" à la bonne date de début dans "Results"
        Sheets("Results").Cells(1, Cmatrix) = Symbol
        While Sheets("Data").Cells(Ltable, 7) <> ""
            Sheets("Results").Cells(Lmatrix, Cmatrix) = Sheets("Data").Cells(Ltable, 7)
            Lmatrix = Lmatrix + 1
            Ltable = Ltable + 1
        Wend
     
    Ltickers = Ltickers + 1
    Cmatrix = Cmatrix + 1
    Wend
     
    ErrorImport: 'Si erreur, incrémentation au ticker suivant et retour au début de la boucle
        Ltickers = Ltickers + 1
        GoTo LoopLine
    End Sub

  2. #2
    Membre expérimenté Avatar de EBRAG
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Avril 2013
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 125
    Par défaut
    Bonjour,

    Quelques remarques pour te sortir de cette situation (sans modifier ton code)

    il manque un "Exit Sub" avant l'étiquette "ErrorImport:"
    l'étiqueet "LoopLine:" devrait être après le "While"

    pour ma part, je remplacerais le 'While Sheets("Tickers").Cells(Ltickers, ChoixIndice) <> ""' par un "Do"
    et le dernier Wend par : Loop While Sheets("Tickers").Cells(Ltickers, ChoixIndice) <> ""'

    Teste cela et dis-nous ce que cela donne...

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2017
    Messages : 7
    Par défaut
    J'ai réessayé en effectuant vos modifications, le même problème persiste : Le premier ticker engendrant un message d'erreur est correctement sauté, mais pas le deuxième. Je n'arrive pas à comprendre pourquoi il ne repartirait pas vers ErrorImport à chaque fois...

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Je n'aime à divers titres pas du tout
    ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    StartDate = Sheets("Sheet1").Cells(6, 2)
    EndDate = Sheets("Sheet1").Cells(7, 2)
    puis cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     While StartDate <= EndDate
            If Weekday(StartDate) <> 1 And Weekday(StartDate) <> 7 Then
    Quelques raisons de ma remarque ? --->> au moins deux :
    - si erreur de saisie de Stardate ou Endate ?
    - ton expression conditionnelle dans la boucle While subordonne l'exécution à DEUX conditions à la fois. Qu'une seule des 2 dates n'y satisfasse pas et ... (devine) ...

    Mais on aborde là des aspects de conception et pas vraiment de code, même si ce dernier peut souffrir de la conception arrêtée.

    EDIT : tu devrais par ailleurs en profiter pour t'intéresser de plus près à la fonction WeekDay et à l'argument facultatif qu'elle utilise (bien que cet aspect n'ait rien à voir avec la difficulté rencontrée)

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2017
    Messages : 7
    Par défaut
    Merci pour le conseil unparia, c'est vrai que je ne me suis pas encore trop penché plus que ça sur ce genre de question des dates étant donné que mon problème majeur pour l'instant est celui de l'importation des données, mais c'est effectivement un problème à corriger.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    pas encore trop penché plus que ça sur ce genre de question des dates étant donné que mon problème majeur pour l'instant est celui de l'importation des données
    Mais ... Peut également être la cause d'une erreur rédhibitoire et est donc à traiter d'abord.

Discussions similaires

  1. Message d'erreurs lors d'une inclusion
    Par kaskette21 dans le forum Langage
    Réponses: 1
    Dernier message: 12/02/2008, 11h34
  2. Message d'erreur lors d'une grosse requete
    Par tony8716 dans le forum Développement
    Réponses: 9
    Dernier message: 03/01/2008, 10h34
  3. Récupération message d'erreur lors d'une insertion dans une BDD
    Par LoDev dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 22/12/2007, 19h11
  4. afficher un message d'erreur lors d'une saisie
    Par ludovicparis dans le forum IHM
    Réponses: 4
    Dernier message: 20/03/2007, 11h37
  5. Attraper message d'erreur lors d'une requête d'ajout
    Par steps5ive dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/12/2006, 16h53

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