Fonction de tri d'un range de cellules
mockup
Messages postés
4
Statut
Membre
-
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis novice en VBA et je bute sur un problème basique: Trier une plage de cellules passée en paramètre à une fonction. La liste triée est renvoyée sous forme d'une chaine concaténée.
En l'état, en appliquant cette fonction sur 3 cellules ayant pour valeur 1, 3, 2, j'obtiens la chaine "1 3 2". La fonction de tri est donc ici inopérante. Bien sûr je m'attendais à avoir "1 2 3".
Merci d'avance pour vos conseils et remarques,
Bonne journée,
Mockup
Je suis novice en VBA et je bute sur un problème basique: Trier une plage de cellules passée en paramètre à une fonction. La liste triée est renvoyée sous forme d'une chaine concaténée.
Function TrierPlage(plage As Range) As String
Dim rep As String, c As Range
plage.Sort Key1:=plage, Order1:=xlAscending, Header:=xlNo
' For i = 1 To plage.Count
' MsgBox plage(i)
' Next i
For Each c In plage
rep = rep & " " & c.Value
Next c
TrierPlage = rep
End Function
En l'état, en appliquant cette fonction sur 3 cellules ayant pour valeur 1, 3, 2, j'obtiens la chaine "1 3 2". La fonction de tri est donc ici inopérante. Bien sûr je m'attendais à avoir "1 2 3".
Merci d'avance pour vos conseils et remarques,
Bonne journée,
Mockup
A voir également:
- Fonction de tri d'un range de cellules
- Fonction si et - Guide
- Comment faire un tri personnalisé sur excel - Guide
- Somme de plusieurs cellules excel - Guide
- Logiciel tri photo - Guide
- Verrouiller cellules excel - Guide
7 réponses
Re,
en attendant, vous pouvez utilisez ceci, appelle d'une cellule ou autre
'
' Tri de Shell - Shell Sort adapté pour tri plage de cellules
'
A+
en attendant, vous pouvez utilisez ceci, appelle d'une cellule ou autre
'
' Tri de Shell - Shell Sort adapté pour tri plage de cellules
'
Function TrierPlage(plage As Range, Optional ByVal loBound As Long = -1, Optional ByVal upBound As Long = -1) As String
Dim i As Long, j As Long, h As Long, v As Long, t()
Dim rep As String
'mise en tableau de la plage de cellules
t = Application.Transpose(plage)
'debut de tableau
If loBound = -1 Then
loBound = LBound(t())
End If
'fin de tableau
If upBound = -1 Then
upBound = UBound(t())
End If
h = loBound
Do
h = 3 * h + 1
Loop Until h > upBound
Do
h = h / 3
For i = h + 1 To upBound
v = t(i): j = i
Do While t(j - h) > v
t(j) = t(j - h): j = j - h
If j <= h Then
Exit Do
End If
Loop
t(j) = v
Next i
Loop Until h = loBound
'ecriture de la chaine de valeurs triées
For i = 1 To upBound
rep = rep & " " & t(i)
Next
TrierPlage = rep
End Function
A+
Bonjour ronmubar,
Il n'y a peut-être pas besoin d'une macro pour effectuer cette opération dans le contexte voulu par mockup: oui, il faut passer par du VBA
Il n'y a peut-être pas besoin d'une macro pour effectuer cette opération dans le contexte voulu par mockup: oui, il faut passer par du VBA
Bonjour,
J'ai teste votre code et le tri se fait correctement !!!!!!!
rectification, marche pas a tout coup si appel d'une cellule, si vba pas de probleme??
comment appelez-vous cette fonction ??
J'ai teste votre code et le tri se fait correctement !!!!!!!
rectification, marche pas a tout coup si appel d'une cellule, si vba pas de probleme??
comment appelez-vous cette fonction ??
Bonjour,
J'appelle effectivement cette fonction d'une cellule et je n'ai jamais réussi à voir un résultat correct.
Merci pour votre test.
Cordialement.
J'appelle effectivement cette fonction d'une cellule et je n'ai jamais réussi à voir un résultat correct.
Merci pour votre test.
Cordialement.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
Une fonction personnalisée ne peut pas modifier son environnement sur une feuille, elle retourne une valeur c'est tout.
plage.Sort n'a aucune chance d'être réalisé.
Il faut faire faire le tri par la macro, comme proposé par f894009.
eric
Une fonction personnalisée ne peut pas modifier son environnement sur une feuille, elle retourne une valeur c'est tout.
plage.Sort n'a aucune chance d'être réalisé.
Il faut faire faire le tri par la macro, comme proposé par f894009.
eric
Bonjour et merci à tous pour vos réponses :).
Sur la remarque d'Eric, je voudrais préciser que mon besoin n'est pas de modifier les cellules sources mais de les utiliser pour générer une valeur affichée dans autre cellule (chaine retournée). Dans mon contexte, plage.Sort n'est peut-être pas appropriée mais je suis étonné qu'il n'y ait pas une solution équivalente, quitte à copier les valeurs de la plage source dans un objet temporaire qui supporterait nativement la fonctionnalité de tri.
À défaut, l'algo de tri de f894009 est un pis-aller (qui fonctionne avec des entiers). À terme, il me faudra une solution qui supporte le tri de tout type de donnée (date, texte, décimal...).
Si quelqu'un dispose d'une solution générique, je suis preneur !
Merci d'avance et bonne journée à tous,
Mockup
Sur la remarque d'Eric, je voudrais préciser que mon besoin n'est pas de modifier les cellules sources mais de les utiliser pour générer une valeur affichée dans autre cellule (chaine retournée). Dans mon contexte, plage.Sort n'est peut-être pas appropriée mais je suis étonné qu'il n'y ait pas une solution équivalente, quitte à copier les valeurs de la plage source dans un objet temporaire qui supporterait nativement la fonctionnalité de tri.
À défaut, l'algo de tri de f894009 est un pis-aller (qui fonctionne avec des entiers). À terme, il me faudra une solution qui supporte le tri de tout type de donnée (date, texte, décimal...).
Si quelqu'un dispose d'une solution générique, je suis preneur !
Merci d'avance et bonne journée à tous,
Mockup
Bonjour,
mon besoin n'est pas de modifier les cellules sources mais de les utiliser
Ce qui revient à modifier le contenu de cellules différentes de la cellule d'appel, ce que tu ne peux pas faire avec une fonction personnalisée.
Sur le très bon site de J. Boisgontier tu trouveras des algorithme de tri : http://boisgontierjacques.free.fr/pages_site/Tris.htm
eric
mon besoin n'est pas de modifier les cellules sources mais de les utiliser
Ce qui revient à modifier le contenu de cellules différentes de la cellule d'appel, ce que tu ne peux pas faire avec une fonction personnalisée.
Sur le très bon site de J. Boisgontier tu trouveras des algorithme de tri : http://boisgontierjacques.free.fr/pages_site/Tris.htm
eric
Il n'y a peut-être pas besoin d'une macro pour effectuer cette opération, la fonction tri est capable de trier une plage sur plusieurs champs : onglet Données > Trier. Et dans la fenêtre il faut choisir la liste des champs sur lesquels baser le tri.