Macro excel de tri alphabétique des lignes d'une série de fichiers csv

Signaler
Messages postés
3
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
22 avril 2008
-
Messages postés
3
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
22 avril 2008
-
Bonjour et merci d'avoir créé ce forum, j’ai trouvé  des éléments utiles grâce à vous, mais je n’ai pas réussi à faire la macro souhaitée.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>








Bonjour je veux faire une macro sous Excel 2007 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

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)










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








 





 

6 réponses

Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
11
Salut,

tu peux te faire un batch qui utilise la commande msdos SORT. Puis tu lances ce batch a partir du VBA.

A+
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Ceci ne fonctionnerait pas ?

Cells.Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
29
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
22 avril 2008

Oui. Je pense que la solution de MPi est la meilleure.

Par contre, même si je n'ai jamais cherché a ouvrir un fichier csv sous Excel, je ne pense pas que tu pourras l'empécher d'interpréter la date comme il le fait.
Si tu veux conserver ton format, il faut que tu appliques ton format yyyy/mm/dd a toute la colonne "A" avant de faire le tri.
Columns("A").NumberFormat = "yyyy/mm/dd"
Messages postés
3
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
22 avril 2008

Bo
njour et merci d'avoir créé ce forum, j'ai trouvé  des éléments utiles grâce à vous, mais je n'ai pas réussi à faire la macro souhaitée.





Merci 


Acta_6 et MPi  votre code 




effectivement  a bien fonctionner mais j’ai un problème des
guillemets qui s’ajoutent pour toutes les lignes si je ferme avec  Workbooks(Namecsv).Close True par contre ça marche trés bien quand je ferme


manuellement

 

ce qui n'ai pas le but.

<col style=\"width: 48pt;\" span=\"5\" width=\"64\" />----
"Date,Open,High,Low,Close,Volume,Adj Close", ----
"2003-08-12,17.77,18.30,17.60,18.30,391400,12.91", ----
"2003-08-13,18.15,18.16,17.80,18.00,434400,12.69", ----
"2003-08-14,18.05,18.14,17.60,17.60,534300,12.41", ----
"2003-08-15,17.64,17.99,17.60,17.90,119700,12.62"
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Est-ce que tes données sont toutes dans la même colonne quand tu importes et que tu fermes ?

Si oui, il faudrait que tu changes le séparateur , par ; avant de l'importer.
Et au lieu d'utiliser Workbooks.Open, il faudrait que tu utilises les méthodes traditionnelles de lecture de fichier
Open fichier For Input As ...

Sinon, il te faudrait convertir tes données.
Tu peux utiliser l'enregistreur de macro pour te générer un code.
Menu Données / Convertir
bouton Suivant
et tu coches la virgule comme séparateur

Autre solution, ce serait de configurer ton système en anglais... ce que je n'aime pas, mais que mes collègues font, faute d'astuces...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
3
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
22 avril 2008

Merci beaucoup grâce à ce que vous m’avez expliqué
j’ai
réussi à fonctionner mon programme en changeant l
e séparateur ;  par , dans mes  options régionales

 
 







Voici le programme complet






 







Sub FileOpen()     ‘
une procédure pour parcourir tous les fichiers csv dans mon répertoire







Dim
Fichier, Chemin As String







Dim Wb As Workbook

 Chemin =
"D:\data"             '<--
adapter le chemin du répertoire

Fichier = Dir(Chemin & "*.csv")

MsgBox Fichier

Do
While Fichier <> ""

Set
Wb = Workbooks.Open(Chemin & Fichier)

Wb.Activate

inv

MsgBox "voulez-vous poursuivre"

Wb.Close
True

Set
Wb = Nothing

Fichier = Dir

Loop







Sub inv()          
‘procedure de tri par lignes

Columns("A").NumberFormat
= "yyyy-mm-dd"

Cells.Select

Selection.Sort
Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes






End Sub



Merci beaucoup