Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.
  • Initiateur de la discussion Initiateur de la discussion m@tix
  • 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 !

m@tix

XLDnaute Occasionnel
Bonjour,

Dans mon code VBA, je souhaiterais trier une plage par ordre alphabétique, que j'affiche par la suite dans une liste déroulante sur une cellule. Après une recherche sur le forum, je suis tombé sur une réponse de Pierrot93 (ici), qui semblait convenir à mon cas. En essayant de l'adapter à mon coder, j'ai placé le code suivant :

Code:
With Sheets("Feuil1")
        Dim pl As Range, g As Byte
        For g = 9 To 8 + indiceR
            Set pl = .Range("F9:F" & 8 + indiceR)
            pl.Sort key1:=Range("F9"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
        Next g
        pl.Name = "thePlage"
End With

ActiveWorkbook.Sheets("Feuil2").Cells(1, 1).Validation.Delete
ActiveWorkbook.Sheets("Feuil2").Cells(1, 1).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=thePlage"
Sans succès... Les noms s'affichent dans la liste selon l'ordre dans lequel ils apparaissent sur la plage.
Voyez-vous d'où peut venir le problème ?

Merci d'avance.
 
Re : Tri de plage

Bonjour

ton code m'a l'air un petit peu éloigné de celui que tu cites 🙂


dans ceci

Code:
 For g = 9 To 8 + indiceR
            Set pl = .Range("F9:F" & 8 + indiceR)
            pl.Sort key1:=Range("F9"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
        Next g

en fait tu écris pour g=9 puis pour g=8 vu que indiceR n'est pas défini et ne bouge pas

Si toutefois il était défini avant, ta plage bouge à chaque tour de boucle ? Excel trie mais le tour suivant ça change à nouveau.

Mets toi en mode pas à pas et regarde ce qui se passe.
 
Re : Tri de plage

Bonjour Misange 🙂

Déjà, je corrige ce que j'ai mis dans mon premier post, je pensais plutôt mettre

Code:
For g = 9 To 8 + indiceR
            Set pl = .Range("F9:F" & g)
            pl.Sort key1:=Range("F9"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
Next g
Concernant indiceR, c'est une variable (integer) définie plus haut, mais qui reste constante dans cette partie du code. Quoiqu'il arrive, on a indiceressource >0.

Même avec ce code ça ne fonctionne toujours pas.. En faisant du pas à pas, je ne vois pas d'où vient le problème... Au premier tour de boucle, en mettant un espion sur pl, sa valeur correspond au contenu de la cellule F9. Au second tour de boucle, plus rien n'apparaît dans valeur.. En fin d'exécution, j'ai bien la liste dans la cellule concernée, mais non triée.

😕
 
Re : Tri de plage

Mais pourquoi veux tu faire une boucle pour trier ta plage ?
g = 9 To 8 + indiceR
Set pl = .Range("F9:F" & g)
pl.Sort key1:=Range("F9"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom

devrait être bien suffisant !
 
Re : Tri de plage

La ligne
Code:
g = 9 To 8 + indiceR
n'est pas correcte..

En mettant "simplement" :

Code:
Set pl = .Range("F9:F" & 8 + indiceR)
pl.Sort key1:=Range("F9"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom

Je n'obtiens pas de tri.
 
Dernière édition:
Re : Tri de plage

Ben oui bien sur j'ai fais ça trop vite mais tu pouvais corriger toi même 🙂
je ne sais pas quelle plage tu veux trier moi ! c'est toi qui sait.
ta plage va de F9 à Fg, à toi de calculer ce g pour que ça corresponde à ta plage, moi je ne l'ai pas sous les yeux, le fichier attaché à ta demande étant très discret 🙂
 
Re : Tri de plage

Bonjour,

Puisqu'on est dans un bloc With, il ne faut pas oublier le point devant le 2ème Range...

Code:
Set pl = .Range("F9:F" & 8 + indiceR)
pl.Sort .Range("F9"), xlAscending, Header:=xlNo
On peut aussi écrire :

Code:
Set pl = .Range("F9:F" & 8 + indiceR)
pl.Sort pl, xlAscending, Header:=xlNo
A+
 
Re : Tri de plage

Ok 🙂

Faisons plus simple dans ce cas. J'ai joint un fichier. Sur la colonne A se trouve la plage en question, et en B1 je souhaiterais obtenir le contenu de la plage précédente trié sous forme de liste (voir code sur le module1). Cela fonctionne, à un détail près. La liste en B1 apparaît bien triée, mais la plage en A également. Or, je ne veux absolument pas que l'ordre du contenu de la colonne A ne soit modifié ! Ok, ça n'a sûrement aucun sens sur ce fichier exemple, mais dans mon cas ça a son importance.

Vois-tu comment remédier au problème ?
 

Pièces jointes

Re : Tri de plage


Merci pour ta réponse job75 ! 🙂
J'avais en effet omis le "." devant Range.. Seulement, je vais te répondre la même chose qu'à Misange sur mon dernier message. Le problème, c'est qu'à la plage à trier, sont liées les 4/5 colonnes qui suivent. Concrètement, si A1:A5 est la plage à trier, le contenu dans B1, C1 et D1 va correspondre à A1, et si le contenu de la plage est trié, on ne retrouve plus les correspondances sur les autres colonnes du coup.. D'où mes difficultés. Suis-je (à peu près) clair ? 🙂
 
Re : Tri de plage

Comment veux tu que ce soit différent : tu lui demandes de trier avec A1 comme critère.*
Set pl = ActiveSheet.Range("A1:A4")
pl.Sort key1:=Range("A1"), order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
pl.Name = "thePlage"
il trie sur A1...

Il faut que tu commences par copier ta plage A1:A4 en B1:B4 et que tu tries sur B1
l'enregistreur de macro te donne le code (à améliorer comme d'hab)
 
Re : Tri de plage

Bonjour à tous

Une solution peut-etre un peu 'bourrin' mais qui semble fonctionner

Code:
Sub tri1()
pl = ActiveSheet.Range("A1:A4")
For n = LBound(pl) To UBound(pl)
  For m = LBound(pl) To UBound(pl)
     If pl(m, 1) > pl(n, 1) Then
        temp = pl(m, 1)
        pl(m, 1) = pl(n, 1)
        pl(n, 1) = temp
     End If
  Next
Next
For n = LBound(pl) To UBound(pl)
 liste = liste & pl(n, 1) & ","
Next n
Sheets("Feuil1").Cells(1, 2).Validation.Delete
Sheets("Feuil1").Cells(1, 2).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Left(liste, Len(liste) - 1)
End Sub
 

Pièces jointes

Re : Tri de plage


Merci Misange, ça fonctionne en effet. Mais du coup, on est obligé de conserver la liste triée sur une autre colonne..
 
Re : Tri de plage


Bonjour pierrejean 🙂

En effet ça semble fonctionner !! 😉 Je vais regarder le code de plus près pour comprendre l'idée tout de même.
En tout cas, merci beaucoup.
 
Re : Tri de plage

Bonsoir,
tri avec utilisation d'un dictionnaire pour enlever les doublons éventuels dans la plage et d'un quick sort pour le tri,à tester :
Code:
Sub liste_triée()
Set MonDico = CreateObject("Scripting.Dictionary")
  For Each c In Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)
    MonDico(c.Value) = ""
  Next c
  temp = MonDico.keys
Call tri(temp, LBound(temp), UBound(temp))
For n = LBound(temp) To UBound(temp)
 liste = liste & temp(n) & ","
Next n
Sheets("Feuil1").Cells(1, 2).Validation.Delete
Sheets("Feuil1").Cells(1, 2).Validation.Add Type:=xlValidateList, Formula1:=Left(liste, Len(liste) - 1)
End Sub

Sub tri(a, gauc, droi) ' Quick sort
  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
      g = g + 1: d = d - 1
    End If
  Loop While g <= d
  If g < droi Then Call tri(a, g, droi)
  If gauc < d Then Call tri(a, gauc, d)
End Sub
A+
 
Dernière édition:
Re : Tri de plage

@pierrejean : en adaptant ta solution à mon code, je bute sur un curieux problème. Il se trouve que le contenu des cellules de la plage à trier sont parfois (souvent en fait) de la forme nom, prenom. Jusque là, tout va bien. En mettant un espion sur Left(liste, Len(liste) - 1), j'obtiens exactement la liste que je veux, de la forme nom1, prenom1;nom2, prenom2 par exemple. Seulement, quand je vais voir le contenu de la cellule où la liste est censée apparaître, problème, les entrées n'apparaissent pas correctement.

Au lieu d'avoir :

nom1, prenom1
nom2, prenom2

On a :

nom1
prenom1
nom2
prenom2

En allant voir dans Validation des données, je m'aperçois en fait que la liste rentrée s'est transformée en nom1; prenom1;nom2; prenom2. Alors que la liste donnée dans le code en faisant un pas à pas à la bonne forme !

J'ai alors tenté de remplacer la ligne liste = liste & pl(n, 1) & "," par liste = liste & pl(n, 1) & ";", et là j'obtiens :

nom1
prenom1;nom2
prenom2

Comment cela se fait-il ? 😕 😕

@david84 : merci pour cette autre solution ! J'avoue cependant moins la comprendre.. Et j'ai plus de difficultés pour l'appliquer à mon code. Mais l'idée d'enlever les doublons est très intéressante ! 😉 J'attends de régler le problème des . et ; du code de pierrejean avant de m'y pencher.
 
Dernière édition:
- 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

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…