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

Si tu nous donnais un bout de fichier pour tester en montrant un exemple significatif des difficultés qui peuvent se rencontrer, ce serait beaucoup plus constructif pour tout le monde. Je ne viens que maintenant de comprendre vraiment (enfin je crois !) ce que tu veux.

je te joins un classeur exemple pour illustrer comment par formule générer une liste d'éléments uniques triés par ordre alpha et l'utiliser dans une liste de validation.

Sans fichier exemple de ta part, en ce qui me concerne je m'arrête là.
 

Pièces jointes

Dernière édition:
Re : Tri de plage

Bonjour le fil, le forum,

J'ai bien compris que vous voulez faire un tri uniquement pour obtenir la liste de validation.

Alors pourquoi ne pas utiliser une colonne A masquée qui ne servira qu'à ça ?

Code:
Sub tri()
Dim n As Long, pl As Range
n = 4 'à adapter, doit être > 0
With Sheets("Feuil1")
  Set pl = .Range("A1").Resize(n)
  .Columns(1).ClearContents 'RAZ
  .Range("B1").Resize(n).Copy pl 'copier-coller
  pl.Sort pl, xlAscending, Header:=xlNo 'tri
  pl.Name = "thePlage"
  .Cells(1, 3).Validation.Delete
  .Cells(1, 3).Validation.Add xlValidateList, Formula1:="=thePlage"
End With
End Sub
Ensuite on ne touche plus à la colonne A.

Fichier joint.

A+
 

Pièces jointes

Re : Tri de plage

Re,

Dans la liste que construit la macro de pierrejean, la virgule est indispensable comme séparateur.

Comme il y en a dans vos noms, ça met le pataquès bien sûr.

Mais il suffit de les remplacer par de "fausses" virgules, de code 130 :

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 & Replace(pl(n, 1), ",", Chr(130)) & ","
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
A+
 
Re : Tri de plage

Re,

Il faut savoir encore une chose, classique avec les listes de validation.

La liste construite par la macro de pierrejean est limitée à un certain nombre de caractères (environ 200).

Essayez avec une liste un peu longue...

A+
 
Re : Tri de plage

Re
le probleme est du au fait que la liste est delimitée par des , (virgules) et s'il y en a dans les termes qui la composent elles s'ajoutent
une solution consiste a les eliminer au préalable ce qui donnerait

Code:
[FONT=monospace]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 & replace(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[/FONT]

A l'utilisation il conviendra de la restituer par un replace(valeur," ", ",") si necessaire
Si la valeur comporte deja des espaces revient avec des exemples et on regardera ce qu'il convient de faire
La solutionde David est effectivement meilleure (elimination des doublons et rapidité d'execution) mais elle pose le même probleme

Edit: Salut ami Job
 
Dernière édition:
Re : Tri de plage

Bonjour,
pour gérer cette histoire de noms et prénoms séparés par une virgule, remplacer simplement
MonDico(c.Value) = ""
par
MonDico(Replace(c.Value, ",", "")) = ""
@M@tix : avec plus de 100 message à ton actif, je trouve dommage que tu ne sois pas capable de comprendre par toi-même de la nécessité pour toi et les bénévoles qui tentent de t'aider de placer un fichier exemple explicite.
A+
 
Re : Tri de plage

Re, salut à vous pierrejean et David 🙂

Pour compléter la solution de mon post #18...

Si l'on ne veut pas de colonne auxiliaire en Feuil1, mettons-la en Feuil2 :

Code:
Sub tri()
Dim n As Long, pl As Range
n = 4 'à adapter, doit être > 0
Set pl = Sheets("Feuil2").Range("A1").Resize(n)
pl.EntireRow.ClearContents 'RAZ
With Sheets("Feuil1")
  .Range("A1").Resize(n).Copy pl 'copier-coller
  pl.Sort pl, xlAscending, Header:=xlNo 'tri
  pl.Name = "thePlage"
  .Cells(1, 2).Validation.Delete
  .Cells(1, 2).Validation.Add xlValidateList, Formula1:="=thePlage"
End With
End Sub
Fichier (2).

A+
 

Pièces jointes

Re : Tri de plage

Re,

Noter qu'à la place du Copier-Coller on peut entrer une formule de liaison :

Code:
Sub tri()
Dim n As Long, pl As Range
n = 4 'à adapter, doit être > 0
Set pl = Sheets("Feuil2").Range("A1").Resize(n)
pl.EntireRow.ClearContents 'RAZ
With Sheets("Feuil1")
  pl.FormulaR1C1 = "='" & .Name & "'!RC" 'formule de liaison
  pl.Sort pl, xlAscending, Header:=xlNo 'tri
  pl.Name = "thePlage"
  .Cells(1, 2).Validation.Delete
  .Cells(1, 2).Validation.Add xlValidateList, Formula1:="=thePlage"
End With
End Sub
Edit : guillemets anglais dans la formule au cas où il y a des espaces dans le nom de la feuille.

Fichier (3).

Avec toutes ces solutions on devrait avoir fait le tour de la question, non ?

A+
 

Pièces jointes

Dernière édition:
Re : Tri de plage

Et non ce n'est pas fini 🙂

Sans passer par une autre colonne, cette méthode qui utilise les collections
-récupère les éléments de la plage de départ, qui peut contenir des doublons
- élimine les doublons
- trie la liste par ordre alphabétique
- injecte les éléments de la liste triée dans une listbox
Y'a pu qu'à appuyer sur le bouton pour choisir un élément dans la liste triée et sans doublon et le réinjecter dans la feuille à l'endroit de son choix.
 

Pièces jointes

Re : Tri de plage

Re
@Misange : par formule, proposition pour un tri multicolonne trié sans doublon :
Code:
=INDEX(produit;EQUIV(PETITE.VALEUR(SI(EQUIV(produit&Qté;produit&Qté;0)=LIGNE(INDIRECT("1:"&LIGNES(Qté)));NB.SI(produit;"<"&produit)+NB.SI(Qté;"<"&Qté)*10^2);LIGNE(1:1));NB.SI(produit;"<"&produit)+NB.SI(Qté;"<"&Qté)*10^2;0))
Code:
=INDEX(Qté;EQUIV(PETITE.VALEUR(SI(EQUIV(produit&Qté;produit&Qté;0)=LIGNE(INDIRECT("1:"&LIGNES(Qté)));NB.SI(produit;"<"&produit)+NB.SI(Qté;"<"&Qté)*10^2);LIGNE(1:1));NB.SI(produit;"<"&produit)+NB.SI(Qté;"<"&Qté)*10^2;0))
A+
 
Re : Tri de plage

Re David
OK !
en fait c'est la notion de "doublon" qui m'avait échappé 🙂
en effet ta formule renvoie plusiers produits identiques, plusieurs quantités identiques mais un seul type de couple (produit,quantité)
Je peux ajouter au classeur (avec auteur cité bien sur) avant de mettre en ligne sur excelabo ?
 
- 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…