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 :

Optimiser le téléchargement de fichiers .csv sur internet via VBA [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 50
    Points
    50
    Par défaut Optimiser le téléchargement de fichiers .csv sur internet via VBA
    Bonjour,

    J'utilise actuellement du code VBA pour télécharger automatiquement des données financières sur internet. J'utilise la fonction Application.Workbooks.Open avec l'adresse du fichier comme argument afin d'ouvrir le fichier, récupérer les données et le refermer.
    Cependant cette méthode est très longue car j'ai environ 50 fichiers à télécharger. Y aurait-il un moyen d'optimiser cela?

    Je pense notamment aux thread afin de réaliser les téléchargements en parallèle. Cependant j'ai lu qu'ils étaient assez instable avec VBA et qu'il ne fallait pas utiliser plus de 2 ou 3. Pensez vous que ce pourrait être une bonne solution? Ou existe-t-il d'autres moyens?

    Merci d'avance pour votre aide.
    Mon code en copie de ce message. Pour la faire fonctionner il suffit de créer une worksheet "CBOE" et de faire tourner le code!


    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
    Sub recupereDonneesCBOE()
        Dim oWbk As Excel.Workbook
        Dim v1 As Variant, vT As Variant, donneesFinales As Variant
        Dim monthStudy As Long, yearStudy As Long, i As Long, i1 As Long, iK As Long, lastiK As Long, iT As Long, j As Integer, k As Integer
        Dim oSh As Excel.Worksheet, oRng As Excel.Range
        Const csSheetName As String = "CBOE"
        Dim beginPrint As Boolean
        Dim monthToLetter(): monthToLetter = Array("F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z")
    
        Application.StatusBar = "Begin download..."
        
        'Données VIX Index
        On Error GoTo noMore
            Application.StatusBar = "Downloading VIX Index"
            Set oWbk = Application.Workbooks.Open("http://ichart.finance.yahoo.com/table.csv?s=%5EVIX&a=0&b=1&c=2000&d=0&e=0&f=" & year(Now()) + 1 & "&g=d&ignore=.csv")
            
            v1 = oWbk.Worksheets(1).UsedRange.Value
        oWbk.Close False
        
        ReDim donneesFinales(1 To UBound(v1, 1), 1 To 10)
        
        donneesFinales(1, 1) = "Dates"
        donneesFinales(1, 2) = "Spot"
        For i = 1 To 7
            donneesFinales(1, i + 2) = i
        Next i
        donneesFinales(1, 10) = "Roll"
        
        For i = 2 To UBound(v1, 1)
            donneesFinales(i, 1) = CDate(v1(i, 1))
            donneesFinales(i, 2) = v1(i, 7)
            donneesFinales(i, 10) = False
        Next i
        v1 = Empty
        
        'Données Futures VIX
        On Error GoTo noMore
            For j = 2006 To year(Now()) + 1
                For k = 0 To 11
                    Application.StatusBar = "Downloading VIX Future : " & monthToLetter(k) & Format(DateSerial(j, 1, 1), "yy")
                    beginPrint = False
                    Set oWbk = Application.Workbooks.Open("http://cfe.cboe.com/Publish/ScheduledTask/MktData/datahouse/CFE_" & monthToLetter(k) & Format(DateSerial(j, 1, 1), "yy") & "_VX.csv")
                    
                    v1 = oWbk.Worksheets(1).UsedRange.Value
                    oWbk.Close False
                    
                    i1 = 2
                    iT = UBound(donneesFinales, 1)
                    
                    'On cherche 2 dates égales
                    While (i1 <= UBound(v1, 1)) And (iT > 1)
                        While CDate(v1(i1, 1)) <> donneesFinales(iT, 1)
                            If CDate(v1(i1, 1)) < donneesFinales(iT, 1) Then
                                i1 = i1 + 1
                            Else
                                iT = iT - 1
                                
                                'Si on a déjà commencé à inscrire des données et qu'on itére iT, alors il manque des données
                                If beginPrint = True Then
                                    iK = 3
                                    
                                    While (donneesFinales(iT, iK) <> "" And iK < 10)
                                        iK = iK + 1
                                    Wend
                                    
                                    If iK < 10 Then
                                        donneesFinales(iT, iK) = "#N/A N/A"
                                    End If
                                End If
                            End If
                        Wend
                        
                        'Dernier future à inscrire, limité à 9
                        iK = 3
                        While (donneesFinales(iT, iK) <> "" And iK < 10)
                            iK = iK + 1
                        Wend
                        
                        If iK < 10 Then
                            If v1(i1, 7) <> 0 And v1(i1, 6) <> 0 Then 'Il y a eu trading pendant la journée
                                If beginPrint = False Then
                                    beginPrint = True
                                ElseIf iK < lastiK Then
                                    'Nous sommes ici dans le cas d'un roll de futures
                                    donneesFinales(iT, 10) = True
                                End If
                                
                                If donneesFinales(iT, 1) < CDate("26/03/2007") Then
                                    donneesFinales(iT, iK) = v1(i1, 7) / 10
                                Else
                                    donneesFinales(iT, iK) = v1(i1, 7)
                                End If
                            Else
                                If i1 < UBound(v1, 1) Then 'données manquante, sauf si expiry alors no data printed
                                    donneesFinales(iT, iK) = "#N/A N/A"
                                End If
                            End If
                            
                            lastiK = iK
                        End If
                        
                        i1 = i1 + 1
                        iT = iT - 1
                    Wend
                    
                    v1 = Empty
                Next k
            Next j
    
    noMore:
        'On copie maintenant nos données sur la feuille et on met en forme
        With Worksheets(csSheetName)
            .Activate
            .UsedRange.Clear
            
            .Range(Cells(1, 1), Cells(UBound(donneesFinales, 1), UBound(donneesFinales, 2))).Value = donneesFinales
            
            .Rows("1:1").Font.Bold = True
            .Rows("1:1").HorizontalAlignment = xlCenter
        End With
    End Sub

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Je suis presque certain que votre code peut être optimisé.
    Le ralentissement est dû à la pêche des données sur Internet.
    En employant les APIs de la librairie "wininet.dll", je crois qu'on peut améliorer la vitesse du code de manière conséquente.

    Je regarde cela et vous fais signe si j'obtiens un résultat concluant.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Dans la pièce jointe, un exemple de l'utilisation des APIs de la librairie "wininet.dll". L'opération dure un peu plus de 2 minutes sur ma machine (plus très jeune).
    Je me contente de récupérer les données et de les mettre bout à bout dans une variable String.
    Puis j'écris cette variable dans un fichier .txt dans le chemin suivant : "C:\AllCBOE.txt"
    A partir de ce fichier, les données peuvent être montées d'un bloc dans un Variant et traitées en mémoire. On peut également travailler directement avec la variable String sans créer un fichier .txt (à vous de voir).

    Je ne me suis pas occupé
    1) de la gestion des erreurs (si les données ne sont pas accessibles sur internet, on obtient une belle soupe)
    2) du traitement et de la mise en forme des données

    A vous de tester si cela vous convient et de mettre la suite en œuvre.

  4. #4
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 50
    Points
    50
    Par défaut
    En effet, merci beaucoup, c'est bien plus efficace maintenant!!!
    Bonne journée!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] extraction d'un fichier BO sur excel via vba
    Par baptoo61 dans le forum Excel
    Réponses: 4
    Dernier message: 23/05/2014, 18h12
  2. Ouvrir un fichier texte sur UltraEdit via VBA
    Par mah.ngaz dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/04/2013, 16h49
  3. Importer un fichier .csv sur excel avec VBA
    Par sambrook dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/01/2013, 12h47
  4. Sortir un fichier csv sur base d une requete
    Par Freeman_80 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 12/01/2005, 11h21
  5. Réponses: 2
    Dernier message: 14/05/2004, 12h55

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