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
 

dysorthographie

XLDnaute Accro
Bonjour,
VB:
Sub test()
Const repertoire As String = "C:\Myrep", Table As String = "exemple_tableau.csv"
ChargerCsv repertoire, Table, [A1]
End Sub
Sub ChargerCsv(repertoire As String, Table As String, ByRef Cible As Range, Optional AvecTitre As Boolean = False)
With CreateObject("AdoDb.Connection")
   .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & repertoire & ";Extended Properties=""Text;HDR=" & Array("No", "YES")(Abs(AvecTitre)) & ";FMT=Delimited;"""
   Cible.CopyFromRecordset .Execute("Select * from [" & Replace(Table, ".", "#") & "]")
   .Close
End With
ou alors Power Query ! moi je n'y ai pas accès
 
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Bonsoir,
Intéressant , dommage que cette formule soit réservée à Office365 ou excel 2021 ... 😢
Il me semble que cette discussion est préfixée Microsoft 365 et pas excel 97 ou 2013
Sinon, ta formule PowerQuery ne semble pas faire le tri demandé ...🤔
Oui parce que vous, vous savez interpréter correctement la demande du post 1 et que l'idiot que je suis ne sais pas c'est vrai ! Je ne sais comment interpréter cette demande de tri :
ordre alphabétique en prenant en compte seulement le deuxième caractère.
Par exemple pour moi le deuxième caractère dans :
,,,Ali,1185671459,,False,False,False,True
Ben c'est encore une virgule.
C'est une demande trop ambivalente pour moi.

Alors en attendant les éclaircissements du sieur (si sieur il y a) j'ai interprété comme j'ai pu
Mais c'était oublié que sur ce forum il y avait de prestigieux savants comme vous, donc comme votre prestigieux collègue, je vais vous mettre dans ma liste d'ignorés dès ce soir.
 

fanch55

XLDnaute Barbatruc
Mais c'était oublié que sur ce forum il y avait de prestigieux savants comme vous, donc comme votre prestigieux collègue, je vais vous mettre dans ma liste d'ignorés dès ce soir.
Bonsoir @Hasco.
désolé si mes remarques ont pu vous heurter, ce n'en était pas le but.
Je sais que cette discussion tourne autour de 365, et je suis frustré de ne pas pouvoir tester votre fonction qui me semble très intéressante et pertinente .
Pour le power query, je signalais juste que je ne comprenais pas le résultat et je voulais savoir si c'était normal car je ne maitrise absolument pas PQ.
Je le redis, mes remarques ne sont pas pour fustiger quoi que ce soit, je m'intéresse respectueusement à toutes les réponses et n'hésite pas à remettre en cause mes connaissance en essayant d'extraire le meilleur de ces réponses. ..
 

job75

XLDnaute Barbatruc
Bonjour le forum,

Plutôt que de restituer dans le fichier de la macro il semble préférable de créer un fichier CSV trié :
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
s = ThisWorkbook.Saved 'mémorise l'état
With [A2]
    .Cells(0) = titres
    .Resize(n, 2) = c
    .Resize(n, 2).Sort .Cells(1, 2), xlAscending, Header:=xlNo 'tri
    c = .Cells(0).Resize(n + 1) 'mémorise
    .Cells(0).Resize(n + 1, 2).ClearContents 'efface le tableau
End With
If s Then ThisWorkbook.Saved = True 'évite l'invite à la fermeture
'---création du fichier CSV trié---
fichier = Left(fichier, Len(fichier) - 4) & " trié.csv"
x = FreeFile
Open fichier For Output As #x 'ouverture en lecture séquentielle
For i = 1 To n + 1
    Print #x, c(i, 1)
Next i
Close #x
MsgBox "Le fichier CSV trié a été créé"
End Sub
Sur 70 000 lignes c'est à peine plus long : 0,65 seconde.

A+
 

Pièces jointes

  • Dossier.zip
    17 KB · Affichages: 2

job75

XLDnaute Barbatruc
Une autre solution avec le fichier (4) qui utilise la macro Quick sort :
VB:
Option Compare Text 'la casse est ignorée lors du tri

Sub Trier_CSV()
Dim maxi$, fichier$, x%, titres$, texte$, z, a(), b(), n&
maxi = Chr(142) 'Chr(142) est plus grand que tout autre texte
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
    z = Split(texte & ",", ",")(1) 'au moins 1 virgule
    ReDim Preserve a(n): a(n) = IIf(z = "", maxi, z)
    ReDim Preserve b(n): b(n) = texte
    n = n + 1
Wend
Close #x
tri a, b, 0, n - 1
'---création du fichier CSV trié---
fichier = Left(fichier, Len(fichier) - 4) & " trié.csv"
x = FreeFile
Open fichier For Output As #x 'ouverture en lecture séquentielle
Print #x, titres
For n = 0 To UBound(b)
    Print #x, b(n)
Next n
Close #x
MsgBox "Le fichier CSV trié a été créé"
End Sub

Sub tri(a, b, 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
      temp = b(g): b(g) = b(d): b(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, b, g, droi)
If gauc < d Then Call tri(a, b, gauc, d)
End Sub
Sur 70 000 lignes la macro est un peu moins rapide que celle du fichier (3) : 0,9 seconde.

Vous pourrez vérifier que le caractère de code 142 Ž est le plus grand des caractères ASCII.

A+
 

Pièces jointes

  • Dossier.zip
    17.8 KB · Affichages: 3

job75

XLDnaute Barbatruc
Bonjour le forum,

Par rapport au fichier (3) du post #20 le fichier (4) du post #23 ne va pas bien.

En effet les doublons (textes vides ou non) ne sont pas classés dans l'ordre de leur survenance.

Pour y parvenir il faut numéroter grâce au Dictionary, voyez le fichier (5) :
VB:
Option Compare Text 'la casse est ignorée lors du tri

Sub Trier_CSV()
Dim d As Object, maxi$, fichier$, x%, titres$, texte$, z, a(), n&, i&, b()
Set d = CreateObject("Scripting.Dictionary")
d.Comparemode = vbTextCompare 'la casse est ignorée
maxi = Chr(142) 'Chr(142) est plus grand que tout autre texte
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
    z = Split(texte & ",", ",")(1) 'au moins 1 virgule
    ReDim Preserve a(n)
    If z = "" Then z = maxi
    d(z) = d(z) + 1 'comptage
    a(n) = z & Format(d(z), "00000") 'numérotation, maximum 99999 textes
    ReDim Preserve b(n): b(n) = texte
    n = n + 1
Wend
Close #x
tri a, b, 0, n - 1
'---création du fichier CSV trié---
fichier = Left(fichier, Len(fichier) - 4) & " trié.csv"
x = FreeFile
Open fichier For Output As #x 'ouverture en lecture séquentielle
Print #x, titres
For n = 0 To UBound(b)
    Print #x, b(n)
Next n
Close #x
MsgBox "Le fichier CSV trié a été créé"
End Sub

Sub tri(a, b, 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
      temp = b(g): b(g) = b(d): b(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, b, g, droi)
If gauc < d Then Call tri(a, b, gauc, d)
End Sub
Dans le fichier CSV j'ai mis 2 doublons "bbb".

Sur 70 000 lignes la macro s'exécute en 1 seconde.

A+
 

Pièces jointes

  • Dossier.zip
    18.4 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
311 735
Messages
2 082 023
Membres
101 873
dernier inscrit
excellllll