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 :

Lecture tableau CSV sur VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Actuaire
    Inscrit en
    Juillet 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Actuaire
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 49
    Par défaut Lecture tableau CSV sur VBA
    Bonjour tout le monde,

    Je suis confronté à un code récalcitrant, et je me permet de solliciter votre aide.

    En effet, un logiciel de calcul que j'utilise a changé de version et produit désormails des sorties en fichiers csv.

    J'essaie de paramétrer une macro qui va chercher les résultats dans le CSV sans l'ouvrir.

    Voici un exemple de sortie, au format original:
    time,annee,resultat
    Time1,2017,1000.0
    Time2,2018,1001.0
    Time3,2019,1002.0
    Time4,2020,1003.0
    Time5,2021,1004.0
    Voici mon cahier des charges
    J'aimerais créer une fonction dans Excel , read_result(adresse_fichier as string, annee a integer, variable as string)
    Par exemple j'aimerais interroger via ma fonction la variable résultat (notez qu'il peut y avoir plusieurs variables, j'en ai mis qu'une pour simplifier l'exemple) pour l'année 2018.

    Voici le code que j'ai fait pour l'instant. J'ai piqué des exemples a droite à gauche sur le net, mais je dois avouer que je ne maitrise absolument pas FSO.

    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
    Sub test()
    Dim oFSO As Scripting.FileSystemObject
    Dim oFl As Scripting.file
    Dim oTxt As Scripting.TextStream
     
    workspace = "C:\Users\"
    file = "Projection"
    extension = ".csv"
     
    'Instanciation du FSO
    Set oFSO = New Scripting.FileSystemObject
    Set oFl = oFSO.GetFile(workspace & file & extension)
    Set oTxt = oFl.OpenAsTextStream(ForReading)
     
     
    With oTxt
          Do While Not .AtEndOfStream
                .ReadLine
            If .Line = 4 Then
                 Tableau = Split(.ReadLine, ",")
                result = Tableau(3)
            Else
                If .Line > 3 Then
                    Exit Do
                End If
            End If
     
        Loop
    End With
    MsgBox (result)
    End Sub
    Comme vous pouvez le voir c'est une ébauche. Pour l'instant, tout ce que j'arrive à faire, c'est ouvrir le fichier, le lire jusqu'a la ligne désirée et selectionner la valeur de la troisième colonne

    Je trouve cette solution un peu "bricolée".

    Pourriez vous m'aider à faire les choses suivantes ?
    -Aller pointer directement sur la bonne ligne sans lire tout le fichier à chaque fois?
    -Arriver à localiser automatiquement la colonne correspondant à la variable que je veux interroger
    -Utiliser eventuellement une autre méthode que FSO?

    Je vous remercie par avance pour votre aide!

    Cordialement,

    Guillaume

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Methodrone8 Voir le message
    J'essaie de paramétrer une macro qui va chercher les résultats dans le CSV sans l'ouvrir.
    Sans l'ouvrir, c'est se compliquer la vie.

    Perso, voici comment je procèderai :
    Ouverture du fichier avec un Workbboks.OpenText.
    Recherche de la colonne avec un Find sur le première ligne.
    Recherche de la ligne avec un Find sur le deuxième colonne.
    Récupération de la donnée (avec un petit If pour vérifier que les recherches précédentes ont été fructueuses).
    Fermeture du fichier.

    En 5 ligne de code, c'est plié.
    Et le temps perdu à l'ouverture de fichier sera regagné par les Find évitant des boucles.

  3. #3
    Membre confirmé
    Homme Profil pro
    Actuaire
    Inscrit en
    Juillet 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Actuaire
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 49
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Sans l'ouvrir, c'est se compliquer la vie.

    Perso, voici comment je procèderai :
    Ouverture du fichier avec un Workbboks.OpenText.
    Recherche de la colonne avec un Find sur le première ligne.
    Recherche de la ligne avec un Find sur le deuxième colonne.
    Récupération de la donnée (avec un petit If pour vérifier que les recherches précédentes ont été fructueuses).
    Fermeture du fichier.

    En 5 ligne de code, c'est plié.
    Et le temps perdu à l'ouverture de fichier sera regagné par les Find évitant des boucles.
    Bonjour,

    Merci pour votre réponse,
    Malheureusement le CDC ne permet pas d'ouvrir le fichier pour chaque variable.

    En situation réelle, je dois utiliser cette fonction dans des projections de plus de 40 ans avec une centaine de variables. Je ne peux pas ouvrir le fichier pour chaque fonction, cela serait trop long.

    Grace au lien de dysorthographie, j'ai reussi à faire ce que je voulais :

    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
    Function read_result(workspace As String, file As String, extension As String, variable As String, year As Integer) As Double
    Dim oFSO As Scripting.FileSystemObject
    Dim oFl As Scripting.file
    Dim oTxt As Scripting.TextStream
     
    Dim result As Variant
    Dim tab_results()
    Dim col_variable As Integer
    Dim i, j As Integer
     
     
     
    Set oFSO = New Scripting.FileSystemObject
    Set oFl = oFSO.GetFile(workspace & file & extension)
    Set oTxt = oFl.OpenAsTextStream(ForReading)
     
     
    'Stockage dans un tableau du contenu du CSV
    i = 0
    With oTxt
       Do While Not .AtEndOfStream
           ReDim Preserve tab_results(i)
           tab_results(i) = Split(.ReadLine, ",")
            i = i + 1
     
       Loop
    End With
     
    'Récupération de la colonne de la variable recherchée
      For j = 0 To UBound(tab_results(0), 1)
        If tab_results(0)(j) = variable Then
            col_variable = j
            Exit For
        End If
        Next j
     
     
    'Récupération du résultat selon l'année
    result = tab_results(year + 1)(col_variable)
     
     
     
    read_result = Replace(result, ".", ",")
    End Function
    Voici mon code, ca fonctionne bien et c'est rapide!

    Je suis content d'y être arrivé!

    Merci de m'avoir aiguillé

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Methodrone8 Voir le message
    Malheureusement le CDC ne permet pas d'ouvrir le fichier pour chaque variable.

    En situation réelle, je dois utiliser cette fonction dans des projections de plus de 40 ans avec une centaine de variables. Je ne peux pas ouvrir le fichier pour chaque fonction, cela serait trop long.
    Tes boucles While et For To risquent d'être tout aussi longue.
    Quand tu vas multiplier les fonctions dans ta feuille de calcul, ton fichier va ramer. Excel n'est pas un SGDB même lorsqu'on l'utilise avec des objets de SGDB.
    Sans compter que, même s'il s'agit de FSO, chaque présence de cette fonction ouvre individuellement ce fichier.

    Il aurait mieux valu utiliser ce principe avec un Sub déclenché par un bouton "mise à jour" plutôt que par des fonctions dynamiques.

  5. #5

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

Discussions similaires

  1. 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
  2. [XL-2010] Optimiser le téléchargement de fichiers .csv sur internet via VBA
    Par funtim78 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/01/2013, 09h18
  3. Calcul sur une partie d'un tableau défini sous VBA
    Par VBA_LOVER dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2009, 12h27
  4. Réponses: 7
    Dernier message: 17/07/2007, 15h29
  5. [VBA-O] Lecture infos mails sur réception
    Par helios77 dans le forum VBA Outlook
    Réponses: 4
    Dernier message: 12/02/2007, 14h16

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