Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Trier en ordre croissant du texte de façon dynamique.

  • Initiateur de la discussion Initiateur de la discussion ambrounet2
  • Date de début Date de début

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 !

A

ambrounet2

Guest
Bonjour à tous,

(Excel 2003 Windows xp)

Je cherche à trier du texte ne contenant pas de nombre avec une formule.
Un bon exemple sera sûrement plus clair :

Je parts d’une colonne de ce style
[GROUPE2]
Membre1
Membre3
Membre2
[GROUPE1]
Membre3
Membre1
Membre4
Membre2


Et j’aimerais arriver à cela :
[GROUPE1]
Membre1
Membre2
Membre3
[GROUPE2]
Membre1
Membre2
Membre3
Membre4


Alors pour réaliser cette tache, je vois cela comme trois actions :
- Déterminer la plage des groupes,
- Trier les membres de la plage
- Trier les groupes.

J’ai trouvé une solution pour la première action, en utilisant les [ comme repère.

Par contre pour le tri du texte, je ne trouve pas.

Merci de votre aide.

Cordialement.

Ambrounet
 
Re : Trier en ordre croissant du texte de façon dynamique.

Bonjour ambrounet2, Softmama
Une autre proposition.
Code:
[COLOR=DarkSlateGray][B]Sub TUTU()
Dim i&, j&, tmp$, aux$, dat, oColl As New Collection
  dat = Range("A1", Cells(Rows.Count, 1).End(xlUp)).Resize(, 2).Value [COLOR=DarkOrange]'plage de données + une colonne[/COLOR]
  For i = 1 To UBound(dat, 1)
    If dat(i, 1) Like "[[]*]" Then
      tmp = dat(i, 1)
      dat(i, 2) = tmp & "#" & Space(9) & dat(i, 1)
    Else
      dat(i, 2) = tmp & "#" & dat(i, 1)
    End If
  Next i
  i = 1
  Do Until dat(i, 1) Like "[[]*]" Or i = UBound(dat, 1)
    If Not IsEmpty(dat(i, 1)) Then oColl.Add dat(i, 1)
    i = i + 1
  Loop
  For i = i To UBound(dat, 1)
    tmp = dat(i, 2)
    For j = i + 1 To UBound(dat, 1)
      If dat(j, 2) < tmp Then
        aux = dat(i, 1): dat(i, 1) = dat(j, 1): dat(j, 1) = aux
        dat(i, 2) = dat(j, 2): dat(j, 2) = tmp: tmp = dat(i, 2)
      End If
    Next j
    If Not IsEmpty(dat(i, 1)) And dat(i, 1) <> "" Then
      On Error Resume Next
      oColl.Add dat(i, 1), dat(i, 2)
      On Error GoTo 0
    End If
  Next i
  If oColl.Count > 0 Then
    ReDim dat(1 To oColl.Count, 1 To 1)
    For i = 1 To oColl.Count
      dat(i, 1) = oColl(i)
    Next i
  End If
  With Range("C1") [COLOR=DarkOrange]'première cellule de destination[/COLOR]
    Range(.Cells, Cells(Rows.Count, .Column).End(xlUp)).ClearContents
    .Cells.Resize(UBound(dat, 1), 1).Value = dat
  End With
End Sub[/B][/COLOR]
ROGER2327
#4560


Jeudi 19 As 138 (Saint Courtial des Péreires, aérostier et inventeur, SQ)
1er Frimaire An CCXIX
2010-W46-7T01:58:37Z
 

Pièces jointes

Re : Trier en ordre croissant du texte de façon dynamique.

Bonjour,

Code:
Sub TriGroupe()
  Columns("B:B").Insert Shift:=xlToRight
  i = 1
  Do While i <= [a65000].End(xlUp).Row
    temp = Cells(i, 1)
    Cells(i, 2) = temp
    i = i + 1
    Do While Not Left(Cells(i, 1), 1) = "[" And i <= [a65000].End(xlUp).Row
       Cells(i, 1).Offset(0, 1) = temp & Cells(i, 1)
       i = i + 1
    Loop
  Loop
  [A1].CurrentRegion.Sort Key1:=[B2], Order1:=xlAscending, Header:=xlNo
  [B:B].Delete Shift:=xlToLeft
End Sub

JB
 

Pièces jointes

Re : Trier en ordre croissant du texte de façon dynamique.

Re le fil,

J'étais en train de me dire qu'il existait une solution bcp plus simple que celle que j'ai faite tout d'abord... Et bien même pas besoin de la poster, c'est la même solution que celle qu'a réalisée Boisgontier.
 
Re : Trier en ordre croissant du texte de façon dynamique.

Bonsoir,

Un grand merci pour vos réponses. (et pour le temps passé).

La solution de BOISGONTIER marche parfaitement une fois les doublons de groupe gérer.

Par contre, j'aurais voulu faire cela avec des formules, sans macro.

J'ai donc récupéré une formule de tri de BOISGONTIER (encore) sur un autre post, mais ca marche pas super.

J'ai une problème pour transformer un texte en un nombre unique avec des formules. et pour faire fonctionner cette formule matricielle :
=INDEX(B:B;EQUIV(PETITE.VALEUR(INDIRECT(G2);LIGNE()-1);H:H;0))

Je mets un fichier en exemple.

Si vous avez des idées, je suis preneur.

Cordialement.

Ambrounet
 

Pièces jointes

Re : Trier en ordre croissant du texte de façon dynamique.

Bonjour à tous
À défaut d'une solution par formule avec les fonctions natives (trop compliquée pour moi…), une solution mixte utilisant une fonction personnalisée annexe :

Code:
[COLOR=DarkSlateGray][B]=INDEX(ordre($F$5:$F$54);LIGNE(1:1))[/B][/COLOR]
(matricielle, à recopier vers le bas) où ordre() est la fonction personnalisée :
Code:
[COLOR=DarkSlateGray][B]Function Ordre(r As Range)
Application.Volatile
Dim i&, j&, tmp$, aux$, dat(), oColl As New Collection
  dat = r.Columns(1).Resize(100 + r.Rows.Count, 1).Value
  ReDim Preserve dat(1 To UBound(dat, 1), 1 To 2)
  For i = 1 To UBound(dat, 1)
    If dat(i, 1) Like "[[]*]" Then
      tmp = dat(i, 1)
      dat(i, 2) = tmp & "#" & Space(9) & dat(i, 1)
    Else
      dat(i, 2) = tmp & "#" & dat(i, 1)
    End If
  Next i
  i = 1
  Do Until dat(i, 1) Like "[[]*]" Or i = UBound(dat, 1)
    If Not IsEmpty(dat(i, 1)) Then oColl.Add dat(i, 1)
    i = i + 1
  Loop
  For i = i To UBound(dat, 1)
    tmp = dat(i, 2)
    For j = i + 1 To UBound(dat, 1)
      If dat(j, 2) < tmp Then
        aux = dat(i, 1): dat(i, 1) = dat(j, 1): dat(j, 1) = aux
        dat(i, 2) = dat(j, 2): dat(j, 2) = tmp: tmp = dat(i, 2)
      End If
    Next j
    If Not IsEmpty(dat(i, 1)) And dat(i, 1) <> "" Then
      On Error Resume Next
      oColl.Add dat(i, 1), dat(i, 2)
      On Error GoTo 0
    End If
  Next i
  ReDim Preserve dat(1 To UBound(dat, 1), 1 To 1)
  For i = 1 To oColl.Count
    dat(i, 1) = oColl(i)
  Next i
  For i = i To UBound(dat, 1)
    dat(i, 1) = ""
  Next i
  Ordre = dat
End Function[/B][/COLOR]

Solution évidemment sans intérêt s'il existe une raison valable de se passer de la souplesse des fonctions personnalisées.
ROGER2327
#4570


Samedi 21 As 138 (Saint Possible, schizophrène, SQ)
3 Frimaire An CCXIX
2010-W47-2T00:42:07Z
 

Pièces jointes

Re : Trier en ordre croissant du texte de façon dynamique.

Bonjour, salut les autres,

j'aurais voulu faire cela avec des formules, sans macro.

Une proposition en pièce jointe, sans formules matricielles, mais bien avec deux colonnes intermédiaires.

Le tri peut se faire par formule (colonne E) ou par le menu Données - Trier sur la colonne B

D'éventuels doublons n'ont pas été gérés, puisqu'il n'y en a pas sous l'exemple proposé, mais ceci ne doit être bien difficile.
 

Pièces jointes

Re : Trier en ordre croissant du texte de façon dynamique.

Bonsoir,

Merci pour vos réponses.

Le fichier de hoerwind fonctionne très bien.
Par contre je comprends pas le fonctionnement des formules utilisées.
En faite surout; celle-la NB.SI(C$2:C$20;"<"&C2)+1. Le "<"&C2 me laisse perplexe.
Je vais me renseigner et je me permettrais surement quelques questions par la suite.

Pour Cisco, dans le vrai fichier ce sont des noms DNS ou des IPs. Ca me permettrais de créer un fichier de génération de configuration iptable,compréhensible par tous.
Et ainsi laisser ce travail au webmaster de l'association, dont la sécurité n'est pas la tasse de thé.
Voila pour l'anecdote.

Cordialement.

Ambrounet
 
Dernière modification par un modérateur:
Re : Trier en ordre croissant du texte de façon dynamique.

Bonsoir,

Toujours à ta disposition si tu désires une petite explication quant à la procédure.
J'apprécie beaucoup que tu vas d'abord essayer de comprendre par tes propres moyens, il est tellement rare de rencontrer quelqu'un qui fasse cet effort.
 
Re : Trier en ordre croissant du texte de façon dynamique.

Bonjour,

Pour david84 :
Il me semble que tu n'as pas tenu compte de la précision sous le message de 21h55 :
dans le vrai fichier ce sont des noms DNS ou des IPs
Sous la formule on ne peut donc se baser sur le dernier caractère du nom des membres.

Pour ambrounet2 :

Pour les valeurs alphabétiques il n'existe pas de fonction similaire à RANG, uniquement valable pour des valeurs numériques.

Par contre Excel autorise les tests comparatifs entre valeurs alphabétiques.
Exemple : B>A renvoie VRAI et ABCD>ABCE renvoie FAUX
Pour ce faire Excel se base sur les valeurs ASCII des caractères.

Partant de ce principe la fonction NB.SI renvoie le nombre de valeurs alphabétiques d'une plage qui sont > ou < que la valeur alphabétique critère.
Le +1 parce que sous la formule le 0 est réservé à l'en-tête du Groupe.
 
Re : Trier en ordre croissant du texte de façon dynamique.

Re Hoerwind
Pour david84 :
Il me semble que tu n'as pas tenu compte de la précision sous le message de 21h55 :
dans le vrai fichier ce sont des noms DNS ou des IPs
Exact, je n'avais pas fait attention à cette information. J'ai simplement regardé le 1er message d'embrounet2 et ton fichier et vu s'il n'y avait pas moyen de te faire gagner une colonne en restant dans une formule non matricielle. De plus, j'ai pour habitude de proposer une solution répondant en l'état par rapport à l'exemple fourni, ce qui suppose que cet exemple soit représentatif du fichier original (ce qui n'est pas toujours le cas, loin s'en faut🙄).
Donc, à moins qu'embrounet2 ne fournisse un fichier avec un exemple explicite, je ne peux voir ce que je pourrais éventuellement proposer (et d'ailleurs, je n'aurai peut-être pas mieux à proposer à moins de passer en matriciel (et encore à voir🙄).
A+
 
Re : Trier en ordre croissant du texte de façon dynamique.

Bonsoir,

Encore merci, pour vos réponses.

Merci hoerwind pour les explications, c'est plus clair que dans les livres. C'est une façon de faire une fonction CODE() sur une chaine de caractère.
C'est vraiment bien pensé.
Bravo

Pour info, j'ai rien trouvé sur internet, mais je pense que la recherche google est faussée par la multitude de possibilité sur la gestion du texte par excel.

J'en ai aussi profité pour découvrir la formule décaler, qui est vraiment pratique, et fait plus propre que mes solutions prétendantes. Merci !

Pour david84, je mets un exemple avec des services plutôt que des ip, sécurité oblige.
J'ai mis tous les cas, doublons de nom de groupe et doublons de membre.
Ça ajoute un peu de piment.

Cordialement

Ambrounet
 

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
Assurez vous de marquer un message comme solution pour une meilleure transparence.
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…