Tri par longueur du plus petit au plus long

Bonjour à tous,

J’espère que vous allez bien,

Dans mon premier fichier en pièce jointe nommée "Tri", j'ai une feuille nommée "INDEX" qui possède un bouton nommé "TRI". Ce bouton est relié à une macro qui permet de trier les « mots ou groupe de mot » par longueur du plus petit au plus long. Ces « mots ou groupe de mot » sont stockées sur la feuille TRI, en colonne A, "à partir de la ligne 2".

Le code ne passe pas et je ne comprends pas pourquoi :

J’ai tout tenté depuis ce matin et je n’ai toujours pas trouvé de solution. Pourriez-vous me dire ce qui ne va pas s’il vous plait ?

En vous remerciant de votre aide.

Dans l’attente vos retour,

Cordialement

11tri.xlsm (17.91 Ko)

Bonsoir,

A tester si j'ai bien compris

Sub TrierGroupesDeMots()
    Dim ws As Worksheet
    Dim lastRow As Long
    Set ws = ThisWorkbook.Sheets("TRI")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    ' Mettre la longueur en colonne B temporairement
    ws.Range("B2:B" & lastRow).FormulaR1C1 = "=LEN(RC[-1])"
    ' Trier les colonnes A et B par la longueur (colonne B)
    ws.Range("A1:B" & lastRow).Sort Key1:=ws.Range("B2"), _
        Order1:=xlAscending, Header:=xlYes
    ' Supprimer la colonne B
    ws.Columns("B").Delete
    MsgBox "Tri terminé!"
End Sub

Slts

Bonjour boss_68,

Bonjour à tous.

Ok, je teste et te reviens très vite

boss_68, votre code passe super bien et je vous en remercie.
Cependant, je ne comprend pas (dans votre code) les éléments suivant:

1- A quelle moment la macro sélectionne la colonne A à partir de la ligne 2 ?

2- Pourquoi avoir mis le code suivant, sachant que le tri se passe à la ligne 2 de la colonne A ?

ws.Range("A1:B" & lastRow).Sort

Désolé pour toutes ses questions.
Je veux comprendre pour ne plus avoir à revenir ici pour les mêmes questions/

En vous remerciant de votre aide.

Dans l’attente vos retour,

Cordialement

Hello,

c'est normal que le code du premier message ne fonctionne pas : le tri se fait par comparaison de texte et pas par longueur de texte. Par exemple pour la comparaison mettre :

If Len(plage.Cells(i, 1).Value) > Len(plage.Cells(j, 1).Value) Then

et attention dans le classeur de test la plage A1:A10 comprend des lignes vides qui seront mises en début de colonne trié.

Ami calmant, J.P

Merci Jurassic Pork,

Mais j'attend toujours une explication sur mon message précédent.

En vous remerciant de votre aide.

Dans l’attente vos retour,

Cordialement

bonjour,

1. À quel moment la macro sélectionne la colonne A à partir de la ligne 2 ?
Dans cette ligne :
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
👉 Cette instruction cherche la dernière ligne non vide dans la colonne A.
Cela permet de connaître jusqu'où va la liste (ex. si la dernière entrée est en A17, lastRow vaudra 17).

2. Pourquoi le tri se fait avec Range("A1:B" & lastRow) au lieu de Range("A2:B" & lastRow) ?
👉 En fait, cette ligne :
ws.Range("A1:B" & lastRow).Sort Key1:=ws.Range("B2"), _
Order1:=xlAscending, Header:=xlYes
inclut la ligne 1 exprès, car on précise dans le tri que la plage contient une en-tête (Header:=xlYes).
Si on triait à partir de A2:B..., Excel croirait qu’il n’y a pas d’en-tête, et il trierait la ligne 2 comme s’il n’y avait pas de titres.
Donc on inclut A1:B..., et on dit à Excel que la première ligne est un en-tête, pour ne pas qu’elle soit triée.

En espérant t'avoir aidé

Slts

Merci boss_68,

Tout est claire désormais.

J'ai une autre préoccupation :

- J'aimerai tester dans une macro si un "formulaire" quelconque est MASQUER.

Le code ci-dessous, ne passe pas, pourtant c'est logique :

Sub ToutCacher()
UserForm1.hide 'on masque le formulaire 
If UserForm1.Visible = True Then 'si le le formulaire est masqué alors ...
   UserForm1.show 'on l'affiche 
Else
    ' ... Ne rien faire ...
End If
End Sub

En vous remerciant de votre aide.

Dans l’attente vos retour,

Cordialement

Bonsoir,

Ton raisonnement est logique peut-être, mais en VBA, la propriété .Visible d’un UserForm ne fonctionne correctement que si le formulaire est déjà chargé en mémoire.
Or dans ton code, tu fais UserForm1.Hide, ce qui masque le formulaire, mais il reste chargé. Ça fonctionne donc seulement si le formulaire a été chargé avant l'exécution du test.

Slts

Oui oui boss_68, je viens de m'en rendre comme.
Merci encore,

Merci à tous

Rechercher des sujets similaires à "tri longueur petit long"