Microsoft 365 Filtrer ligne a partir du 2éme caractère

jim9595

XLDnaute Nouveau
Bonjour,

J'ai un ficher excel avec plus de 70 000 lignes contenant du texte et des virgule, qui sont sur la colonne A.
Je voudrais classer mes lignes par ordre alphabétique en prenant en compte seulement le deuxième caractère.
J'ai essayer de faire => convertir => délimité par des ",' => puis trier => le problème est que cela va étaler la ligne sur plusieurs colonne.
Il faut que les lignes tiennes que sur la colonne A.
Il s'agit d'un fichier .CSV => mais le forum n'autorise pas cette extension (comment faire ?)
le trie dois commencer a partir de la ligne A2 pour au total 70 000 lignes.

EXEMPLE de lignes :


,,,Am7,2017149054,,False,False,False,True
,,A,Y,2032753427,,False,False,False,True
,,Yh,Ahmed,1757903046,,False,False,False,True
,,Atlas,Lion,561526980,,False,False,False,True
,,,Ali,1185671459,,False,False,False,True
,,,Amine,1995858381,,False,False,False,True
,ahmedbinks,,MamsðŸ,1691950597,,False,False,False,True
,Attarinno,,Attinno,1193673349,,False,False,False,True
,OldLaady,Mu,A,1674270663,,False,False,False,True
,,,Ab,1949747894,,False,False,False,True
,,SCHMITT,Alexandre,1574317942,,False,False,False,True
,,God can,Adex,1596961643,,False,False,False,True
,,,Aghiles,1906753778,,False,False,False,True
merci pour votre aide
 

vgendron

XLDnaute Barbatruc
Bonjour
Ce que je ferais...
1) convertir (séparateur virgule) sur une nouvelle feuille (tu obiens donc effectivement plusieurs colonnes)
2) tri sur la colonne que tu veux (la seconde si j'ai bien compris)
3) tu reconstruis la colonne A en faisant "Join" avec une virgule
4) tu colles le résultat sur ta colonne A
5) tu supprimes la feuille inutile (ou pas..)
 

jim9595

XLDnaute Nouveau
Je suis pas trés bon sur excel, mais le problème avec convertir (séparateur virgule) , c'est que cela supprime toutes mes virgules et que aprés avoir trier les lignes, les virgules ne doivent pas être supprimer des lignes. Il n'y a pas une formule qui permet tout simplement de trier a partir de deuxième caractère d'une ligne?
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Collez en B2 vos données (telles que vous nous les avez données )
En A2 la formule à tirer vers le bas:
=STXT(B2;INDEX(TRIER(TROUVE(CAR(SEQUENCE(26;1;65;1));MAJUSCULE(B2)));1);2)
Trier sur la colonne A
La formule extrait les 2 premiers caractères entre A et Z après la,les virgule(s) pour trier sur plus de caractères, remplacer le 2 final par le nombre voulu.

Vous trouverez en feuille PQ la requête power query suivant qui fait à peu près la même chose en allant chercher votre fichier et ne vous laisse qu'une colonne
VB:
let
    Source = Lines.FromBinary(File.Contents(Table.FirstValue(Excel.CurrentWorkbook(){[Name="Dossier"]}[Content]) & "exemple_tableau.csv")),
    #"Converti en table" = Table.FromList(Source, Splitter.SplitByNothing(), {"Lignes"}, null, ExtraValues.Error),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Converti en table", "Trier", each Text.Range([Lignes], Text.PositionOfAny(Text.Lower([Lignes]),{"a".."z"}))),
    #"Lignes triées" = Table.Sort(#"Personnalisée ajoutée",{{"Trier", Order.Ascending}}),
    #"Autres colonnes supprimées" = Table.SelectColumns(#"Lignes triées",{"Lignes"})
in
    #"Autres colonnes supprimées"
 

Pièces jointes

  • formule tri.xlsm
    20.9 KB · Affichages: 5

job75

XLDnaute Barbatruc
Vous parlez de trier sur le 2ème caractère, n'est ce pas sur les textes situés entre la 1ère et la 2ème virgule ?
En l'absence de réponse voyez les fichiers zippés joints et cette macro :
VB:
Sub Trier_CSV()
Dim fichier$, x%, texte$, s, a(), b(), n&, c(), i&
fichier = ThisWorkbook.Path & "\Fichier CSV.csv"
x = FreeFile
Open fichier For Input As #x 'ouverture en lecture séquentielle
While Not EOF(x)
    Line Input #x, texte
    s = Split(texte & ",", ",") 'au moins 1 virgule
    ReDim Preserve a(n): a(n) = s(1)
    ReDim Preserve b(n): b(n) = texte
    n = n + 1
Wend
Close #x
'---transposition---
ReDim c(1 To n, 1 To 2)
For i = 0 To n - 1
    c(i + 1, 1) = b(i)
    c(i + 1, 2) = a(i)
Next i
'---restitution---
Application.ScreenUpdating = False
With [A1]
    .Resize(n, 2) = c
    .Resize(n, 2).Sort .Cells(1, 2), xlAscending, Header:=xlNo 'tri
    .Cells(1, 2).Resize(n).ClearContents 'efface la colonne auxiliaire B
    .Offset(n).Resize(Rows.Count - n - .Row + 1).ClearContents 'RAZ en dessous
End With
End Sub
Les 2 fichiers doivent être placés dans le même dossier.

Pour tester j'ai copié le tableau du fichier CSV sur 70 000 lignes.

La macro s'exécute chez moi en 0,6 seconde.

A+
 

Pièces jointes

  • Dossier.zip
    16.2 KB · Affichages: 5

fanch55

XLDnaute Barbatruc
Bonjour,

Collez en B2 vos données (telles que vous nous les avez données )
En A2 la formule à tirer vers le bas:

=STXT(B2;INDEX(TRIER(TROUVE(CAR(SEQUENCE(26;1;65;1));MAJUSCULE(B2)));1);2)
Salut @Hasco ,
Intéressant , dommage que cette formule soit réservée à Office365 ou excel 2021 ... 😢

Sinon, ta formule PowerQuery ne semble pas faire le tri demandé ...🤔

Résultat du tri ( en manuel ou via la macro de @job75 )
1671015685873.png
Résultat de la requête PQ
1671016090661.png
 
Dernière édition:

fanch55

XLDnaute Barbatruc
Je voudrais classer mes lignes par ordre alphabétique en prenant en compte seulement le deuxième caractère.
On parle bien du deuxième champ délimité par les virgules ? ( et pas le 2ème caractère )
le trie dois commencer a partir de la ligne A2 pour au total 70 000 lignes.
On ignore vraiment la ligne 1 du fichier Csv ?
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Ce que je ferais...
1) convertir (séparateur virgule) sur une nouvelle feuille (tu obiens donc effectivement plusieurs colonnes)
2) tri sur la colonne que tu veux (la seconde si j'ai bien compris)
3) tu reconstruis la colonne A en faisant "Join" avec une virgule
4) tu colles le résultat sur ta colonne A
5) tu supprimes la feuille inutile (ou pas..)
Moi, ce que je ferais...
1) ajout d'une colonne contenant le texte, moins le premier caractère, de la colonne initiale à trier
2) tri sur cette colonne ajoutée.
 

job75

XLDnaute Barbatruc
Bonjour le fil,
On parle bien du deuxième champ délimité par les virgules ? ( et pas le 2ème caractère )
C'est la question que j'ai posée hier au post #9.
On ignore vraiment la ligne 1 du fichier Csv ?
Oui s'il y a une ligne de titres il ne faut pas la trier, voyez le nouveau fichier CSV et cette nouvelle macro :
VB:
Sub Trier_CSV()
Dim fichier$, x%, titres$, texte$, s, a(), b(), n&, c(), i&
fichier = ThisWorkbook.Path & "\Fichier CSV.csv"
x = FreeFile
Open fichier For Input As #x 'ouverture en lecture séquentielle
Line Input #x, titres '1ère ligne avec titres
While Not EOF(x)
    Line Input #x, texte
    s = Split(texte & ",", ",") 'au moins 1 virgule
    ReDim Preserve a(n): a(n) = s(1)
    ReDim Preserve b(n): b(n) = texte
    n = n + 1
Wend
Close #x
'---transposition---
ReDim c(1 To n, 1 To 2)
For i = 0 To n - 1
    c(i + 1, 1) = b(i)
    c(i + 1, 2) = a(i)
Next i
'---restitution---
Application.ScreenUpdating = False
With [A2]
    .Cells(0) = titres
    .Resize(n, 2) = c
    .Resize(n, 2).Sort .Cells(1, 2), xlAscending, Header:=xlNo 'tri
    .Cells(1, 2).Resize(n).ClearContents 'efface la colonne auxiliaire B
    .Offset(n).Resize(Rows.Count - n - .Row + 1).ClearContents 'RAZ en dessous
End With
End Sub
A+
 

Pièces jointes

  • Dossier.zip
    16.7 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
312 202
Messages
2 086 180
Membres
103 152
dernier inscrit
Karibu