XL 2013 VBA fichier CSV

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

lepiouf

XLDnaute Nouveau
Bonjour,
J'ai un fichier CSV aux colonnes remplies de chiffres.
Je voudrais à partir de la colonne BA1 avoir les valeurs de D2 à M x (nb de lignes variable) dans l'ordre inversé (la ligne 8 ici passerait en ligne 1) et les 10 nombres classés chronologiquement sur la ligne. (1 3 4 8 10... et pas 4 1 8 3 10 ..)
Merci de votre aide.
Le piouf !
 

Pièces jointes

Bonjour,

J'ai un fichier CSV aux colonnes remplies de chiffres.
Je voudrais à partir de la colonne BA1 avoir les valeurs de D2 à M x (nb de lignes variable) dans l'ordre inversé (la ligne 8 ici passerait en ligne 1) et les 10 nombres classés chronologiquement sur la ligne. (1 3 4 8 10... et pas 4 1 8 3 10 ..)
J'ajouterais à ce qu'à dit job75 que même si on remet le tableau à la bonne position (donc à partir de D2), il va être difficile de classer chronologiquement les nombres puisqu'il n'y a aucune date dans le tableau. 🙁
 
Excusez moi, le fichier envoyé n'était pas le bon, le voici !
Apparemment ce n'est toujours pas le bon, et le premier correspondait moins mal à la question posée... 😅

En remettant le tableau initial à la place indiquée dans #1 (donc en D2:M8), au moins il y avait bien une ligne 8, alors qu'ici elle n'existe plus.
Tu devrais poster un classeur correspondant réellement aux données que tu indiques en #1, ce serait plus pratique. 😉

Et il n'y a toujours pas de dates ou d'heures, donc il est impossible de faire un classement chronologique.


Sur ce, bonne soirée
🖖
 
Dernière édition:
Apparemment ce n'est toujours pas le bon, et le premier correspondait moins mal à la question posée... 😅
Bonsoir,
Je pense que toutes les données sont bien dans le fichier, peut-être juste une erreur dans un tri...
Bien regarder sur la droite du fichier
Mais comme il est sous 2013, une solution Power Query serait envisageable, selon la volonté du demandeur
Bonne soirée
 
Téléchargez les fichiers zippés joints, ouvrez le fichier .xlsm et cliquez sur le bouton pour exécuter la macro :
VB:
Sub ImportFichierCSV()
Dim fichier As Variant, r As Range
fichier = Application.GetOpenFilename("Fichiers CSV (*.csv),*.csv")
If fichier = False Then Exit Sub
Application.ScreenUpdating = False
Cells.ClearContents 'RAZ
With Workbooks.Open(fichier, Local:=True).Sheets(1) 'ouverture du fichier CSV
    .Range("D2:M" & .Cells(.Rows.Count, 4).End(xlUp).Row).Copy ThisWorkbook.Sheets(1).[BA1] 'copier-coller
    .Parent.Close 'fermeture du fichier CSV
End With
With ActiveSheet.UsedRange
    Set r = .Columns(.Columns.Count + 1).Cells 'colonne auxiliaire
    r(1) = 1
    r.DataSeries 'numérotation des lignes
    Union(.Cells, r).Sort r, xlDescending, Header:=xlNo, Orientation:=1  'tri vertical décroissant
    r.ClearContents
    For Each r In .Rows
        r.Sort r, xlAscending, Orientation:=2 'tri horizontal croissant
    Next
End With
End Sub
Comme vous l'avez demandé, ce sont les colonnes D à M du fichier CSV qui sont copiées (K2:M2 est vide).
 

Pièces jointes

Bonjour le forum,

Il est plus logique que les plages A2:C2 et suivantes soient vides et K2:M2 et suivantes soient remplies.

Dans le dossier joint la plage D2:M8 du fichier CSV a été recopiée sur 7000 lignes.

Chez moi leur traitement s'exécute en 2,15 secondes.

A+
 

Pièces jointes

Avec ce code le fichier CSV est ouvert en lecture séquentielle :
VB:
Sub ImportFichierCSV()
Dim fichier As Variant, t, x%, texte$, a(), i&, ub, b(), s, j%
fichier = Application.GetOpenFilename("Fichiers CSV (*.csv),*.csv")
If fichier = False Then Exit Sub
t = Timer
x = FreeFile
Open fichier For Input As #x 'ouverture en lecture séquentielle
Line Input #x, texte 'on saute 1 ligne
While Not EOF(x)
    ReDim Preserve a(i)
    Line Input #x, a(i)
    i = i + 1
Wend
Close #x 'fermeture du fichier CSV
ub = UBound(a)
ReDim b(ub, 0) 'base 0
For i = 0 To ub
    b(i, 0) = a(ub - i) 'inverse les lignes
    s = Split(b(i, 0), ";") 'éclate le texte
    For j = 1 To UBound(s): s(j) = Format(s(j), "00"): Next j 'formatage avec 2 chiffres pour le tri
    tri s, 0, UBound(s) 'tri croissant
    b(i, 0) = Join(s, ";")
Next i
Application.ScreenUpdating = False
[AX:BJ].ClearContents 'RAZ
With [BA1].Offset(, -3).Resize(ub + 1) 'décalage de 3 colonnes
    .Value = b
    .TextToColumns .Cells, xlDelimited, Semicolon:=True 'commande Convertir
End With
Application.ScreenUpdating = True
MsgBox ub + 1 & " lignes ont été traitées en " & Format(Timer - t, "0.00 \sec")
End Sub

Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
C'est bien plus rapide : 0,22 seconde pour 7000 lignes.
 

Pièces jointes

Bonjour à tous, merci JOB75.
Je ne comprends pas la méthodologie car j'ai 2 fichiers zippés au lieu d'un?
(J'aurai au maximum une centaine de lignes en D:M à inverser (ancien devient récent), mettre en ordre croissant par ligne (et non chronologique !!) et copier ce résultat à partir de BA)
Comment dois je utiliser ces fichiers?
MERCI
 
voici un exemple en XLS, finalement, pour plus de facilité, je copierai le fichier csv en D:M dans ce fichier xls, pouvez vous par formule ou macro obtenir le résultat en BA comme dans ce modèle ?
On oublie le csv qui complique tout !!!
Bon samedi
 

Pièces jointes

Avec un seul fichier .xlsm la macro est bien sûr plus simple :
VB:
Sub Inversion()
Dim r As Range
Application.ScreenUpdating = False
[BA1].CurrentRegion.ClearContents 'RAZ
[D2].CurrentRegion.Copy [BA1]'copier-coller
With [BA1].CurrentRegion
    Set r = .Columns(.Columns.Count + 1).Cells 'colonne auxiliaire
    r(1) = 1
    r.DataSeries 'numérotation des lignes
    Union(.Cells, r).Sort r, xlDescending, Header:=xlNo, Orientation:=1  'tri vertical décroissant
    r.ClearContents
    For Each r In .Rows
        r.Sort r, xlAscending, Orientation:=2 'tri horizontal croissant
    Next
End With
End Sub
100 lignes c'est peu, ce sera donc très rapide.
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
453
Réponses
8
Affichages
656
  • Question Question
Power Query Power Query
Réponses
26
Affichages
680
Réponses
7
Affichages
446
Retour