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 :

fonction sous excel 2007 de tri alphabétique des lignes d'une série de fichiers csv


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut fonction sous excel 2007 de tri alphabétique des lignes d'une série de fichiers csv
    Bonjour et merci j’ai beaucoup appris grâce à votre forum, mais je n’ai pas réussi à faire la macro souhaitée.

    Je veux faire une macro sous Excel 2007 (pas sur Excel 2003) qui permet:
    - de chercher l'ensemble des fichier csv du répertoire
    - d'ouvrir le 1er fichier csv
    - de trier les lignes par ordre alphabétique (actuellement les fichiers sont triés par contrordre alphabétique)
    - de le fermer en enregistrant
    - puis de passer au fichier csv suivant, et ainsi de suite.

    J'ai beaucoup essayé mais le problème que Excel ouvre le fichier csv il divise une ligne csv en plusieurs colonnes et quand il ferme il n'arrive pas à remettre le fichier csv dans le bon ordre (plus précisément, excel change le format de la date de la version date "alphabétique" "yyyy-mm-dd" à la version date système (?) : m/d/yyyy

    De plus je n’ai pas pu trier toute la ligne, car cela ne trie que la date (1ère colonne) et non toutes les données de la ligne.

    Par ailleurs, la première ligne définissant des champs des csv (cf exemple plus bas) ne doit pas être « triée » et doit rester en 1ère ligne pour être comprise par un autre logiciel.

    voici le code actuel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub appellea()
    Dim Namecsv As String
    Dim NamePath As String
    Namecsv = "CAC40  2007-2008"
    NamePath = "D:\" & Namecsv
    Workbooks.Open "D:\CAC40 2007-2008"   ‘NamePath
    inva
    Workbooks("CAC40 2007-2008").Close True    ‘Namecsv
    End Sub
    ‘voici la fonction de tri (inv en fait il inverse seulement puisque mes fichiers csv sont déjà trier mais dans le mauvais ordre, ie par dates décroissantes et non par dates croissantes)

    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
    Sub inv()
    Dim  I  As Integer
    Dim  NbreLigne , nb_2  As Integer
    Dim  aide  As  String
    Dim  Cel  As  Range
    'On affecte la cellule "A1" à la variable Cel
    Set  Cel = Range("A1")
    NbreLigne = Cel.End(xlDown).Row - 1
    nb_2 = Int(NbreLigne / 2)
    'If Range("A1").Offset(1) > Range("A1").Offset(2) Then
       For i = 1 To nb_2
              aide = Str(Cel.Offset(i))
              Cel.Offset(i) = Str(Cel.Offset(NbreLigne + 1 - i))
               Cel.Offset(NbreLigne + 1 - i) = aide
               Next i
    'End If
    End Sub

    voici un fichier csv exemple: "CAC40.csv"
    Date,Open,High,Low,Close,Volume,Adj Close
    2008-04-18,4882.29,4976.37,4878.40,4961.69,192982500,4961.69
    2008-04-17,4877.07,4900.66,4834.22,4862.14,165843700,4862.14
    2008-04-16,4820.27,4863.06,4789.28,4855.10,181523100,4855.10
    2008-04-15,4801.00,4820.75,4741.06,4780.68,118835800,4780.68
    2008-04-14,4755.07,4793.63,4750.28,4766.49,119717800,4766.49
    2008-04-11,4891.84,4917.89,4775.16,4797.93,153178100,4797.93
    2008-04-10,4875.48,4880.59,4789.63,4859.42,161154900,4859.42
    2008-04-09,4888.92,4924.57,4868.19,4874.97,127023000,4874.97
    2008-04-08,4908.16,4914.43,4878.73,4912.69,113384100,4912.69
    2008-04-07,4936.25,4959.97,4926.67,4944.60,128312000,4944.60


    Idéalement, le fichier csv modifié doit donc devenir comme cela :

    Date,Open,High,Low,Close,Volume,Adj Close
    2008-04-07,4936.25,4959.97,4926.67,4944.60,128312000,4944.60
    2008-04-08,4908.16,4914.43,4878.73,4912.69,113384100,4912.69
    2008-04-09,4888.92,4924.57,4868.19,4874.97,127023000,4874.97
    2008-04-10,4875.48,4880.59,4789.63,4859.42,161154900,4859.42
    2008-04-11,4891.84,4917.89,4775.16,4797.93,153178100,4797.93
    2008-04-14,4755.07,4793.63,4750.28,4766.49,119717800,4766.49
    2008-04-15,4801.00,4820.75,4741.06,4780.68,118835800,4780.68
    2008-04-16,4820.27,4863.06,4789.28,4855.10,181523100,4855.10
    2008-04-17,4877.07,4900.66,4834.22,4862.14,165843700,4862.14
    2008-04-18,4882.29,4976.37,4878.40,4961.69,192982500,4961.69


    Merci et à bientôt

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Salut,
    déjà ton fichier n'est pas précisément du CSV, puisque les champs de ce format sont délimités par des points-virgule et non des virgules comme dans ton cas.
    Ce n'est pas forcément gênant pour l'ouverture du fichier, ça l'est un peu plus pour la fermeture où, quand tu vas lui demander de sauvegarder au format .csv, il va mettre des ";"

    Le petit code ci-dessous (à adapter) ne semble pas poser de problème à ce niveau ni au niveau des dates, en revanche il encadre chaque ligne avec des guillemets... je n'ai pas trouvé comment faire sans.
    Si les guillemets gênent, il existe des solutions en écrivant directement dans le fichier, sans l'ouvrir dans excel.

    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
     
        Workbooks.Add
        Cells.Select
        Selection.NumberFormat = "@"
        Range("A1").Select
        With ActiveSheet.QueryTables.Add(Connection:="TEXT;D:\files\cac40.csv", _
            Destination:=Range("A1"))
            .TextFilePlatform = 850
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierNone
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(2)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
        DoEvents
        Range("A:A").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
            xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
     
        Application.DisplayAlerts = False
        ActiveWorkbook.SaveAs Filename:="D:\files\cac40.csv", FileFormat:=xlTextWindows
        DoEvents
        ActiveWorkbook.Close
        DoEvents
        Application.DisplayAlerts = True

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut problème de guillemets à la fermeture d'un fichier csv
    Merci beaucoup, en effet j’ai réussi à trouvé le bon code mais effectivement j’ai le même problème des guillemets.
    Pourriez-vous m'en dire davantage sur le moyen d'écrire directement dans le fichier sans l'ouvrir ?

    Merci encore pour votre aide

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    On peut utiliser le fait que le fichier, à l'exception de la première ligne, est déjà classé à l'envers. Ainsi on peut charger chaque ligne dans un tableau de variables puis lire ce tableau à l'envers pour réécrire le fichier.

    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
     
    Sub copie()
    Dim varTableau(1 To 10000) As String ' <- ajuster la borne supérieure du tableau en fonction du besoin éventuellement, tout en gardant une marge
    Dim monFichier As String
     
    monFichier = "D:\files\CAC40.csv"
     
    'Etape 1 : lecture du fichier et stockage dans tableau de variables
    i = 1
    Open monFichier For Input As #1
    Do While Not EOF(1)
        Line Input #1, varTableau(i)
        i = i + 1
    Loop
    Close #1
    i = i - 1
     
    'Etape 2 : écriture dans le fichier
    Open monFichier For Output As #1
    Print #1, varTableau(1) 'd'abord on écrit la 1ère ligne d'en-tête
    'puis on boucle à l'envers sur le tableau de variables :
    For j = i To 2 Step -1
       Print #1, varTableau(j)
    Next j
    Close #1
    End Sub
    Il serait peut-être sage de sauvegarder les fichiers csv en question avant de les traiter, ceci dit

  5. #5
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par neupont Voir le message
    déjà ton fichier n'est pas précisément du CSV, puisque les champs de ce format sont délimités par des points-virgule et non des virgules comme dans ton cas.
    Je me permets de relever une inexactitude ou, plutôt, un manque de précision dans cette affirmation.

    CSV signifie Comma Separated Values.
    Autrement dit, Valeurs Séparées par des Virgules.

    C'est en français que, pour éviter des problèmes avec le séparateur décimal, il est communément admis de remplacer la virgule par un point-virgule.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 288
    Points : 364
    Points
    364
    Par défaut
    Citation Envoyé par AlainTech Voir le message
    CSV signifie Comma Separated Values.
    Autrement dit, Valeurs Séparées par des Virgules.

    Je dois dire que ça m'avait toujours étonné qu'on appelle ça Comma Separated Values sans que ce soit précisément séparé par une virgule !
    Dont acte, merci.

Discussions similaires

  1. [XL-2007] tri sous excel 2007 via macro
    Par tanger dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/10/2010, 01h21
  2. Déclaration des variables sous Excel 2007
    Par AH... dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/09/2008, 11h50
  3. Enregistrer des fichier en DBF sous Excel 2007
    Par filigane dans le forum Excel
    Réponses: 1
    Dernier message: 20/09/2007, 10h56
  4. Une fonction sous Excel 2007 ne fonctionne pas sous Excel 2003
    Par Dryss51 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 27/07/2007, 08h09

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