Trier une sélection dynamique, macro VBA
Résolu/Fermé
damiens1026
Messages postés
563
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
-
19 avril 2012 à 11:58
damiens1026 Messages postés 563 Date d'inscription jeudi 5 novembre 2009 Statut Membre Dernière intervention 10 avril 2013 - 10 avril 2013 à 16:04
damiens1026 Messages postés 563 Date d'inscription jeudi 5 novembre 2009 Statut Membre Dernière intervention 10 avril 2013 - 10 avril 2013 à 16:04
A voir également:
- Vba sort key1 key2
- Aucun son ne sort de mon pc - Guide
- Tirage au sort excel aléatoire sans doublon ✓ - Forum Excel
- Vba attendre 1 seconde ✓ - Forum VB / VBA
- Excel compter cellule couleur sans vba - Guide
- Mkdir vba ✓ - Forum VB / VBA
7 réponses
damiens1026
Messages postés
563
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
19 avril 2012 à 14:45
19 avril 2012 à 14:45
Milles mercis michel_m, mais étant un peu débutant en VBA, pourrais-tu m'expliquer chaque ligne? :)
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 311
Modifié par michel_m le 19/04/2012 à 14:10
Modifié par michel_m le 19/04/2012 à 14:10
Bonjour
essaies ceci (nota: en VBA, on évite au maximum les select-sélection)
Michel
essaies ceci (nota: en VBA, on évite au maximum les select-sélection)
Sub xxx() Dim col As Integer, lig As Long col = Cells(3, 2).End(xlToRight).Column lig = Cells(3, 2).End(xlDown).Row Range(Cells(3, 2), Cells(lig, col)).Sort Key1:=Range("B3"), Key2:=Range("C3") End Sub
Michel
damiens1026
Messages postés
563
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
2 mai 2012 à 22:30
2 mai 2012 à 22:30
Salut,
Je reviens sur ce post mais il me reste néanmoins une question, lorsque je dois trier une plage de cellules de plusieurs colonnes, est-ce faisable avec cela?
Je reviens sur ce post mais il me reste néanmoins une question, lorsque je dois trier une plage de cellules de plusieurs colonnes, est-ce faisable avec cela?
PHILOU10120
Messages postés
6400
Date d'inscription
lundi 16 avril 2012
Statut
Contributeur
Dernière intervention
17 janvier 2025
812
19 avril 2012 à 13:05
19 avril 2012 à 13:05
Sub trier3()
'
' trier3 Macro
'
'
Range("B3").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("C4:C162") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("B4:B162") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SetRange Range("B3:G162")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B3").Select
End Sub
Il y a quand même un problème le champ sélectioné quand on met le filtre est défini exemple C4:G162 donc à la prochaine éxécution c'est ce champ qui sera traité.
Pour ma part j'ai pris l'habitude de définir un champ nommé exemple "base" avec la ligne de libellé et de longueur supérieur aux informations à traités et comme ça je n'ai pas de problème (je mets 50 ou 100 lignes de plus que mes données
Exemple avec des nom de champ
Sub trier_base2()
'
' trier_base2 Macro
'
'
Range("base").Select
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("clé1") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("clé2") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SetRange Range("base")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("ancre1").Select
End Sub
Donc j'ai défini un champ "base" qui va de B3 à G250
un champ clé1 qui va de B4:B250
un champ cle2 qui va de C4:C250
un champ ancre1 qui est la cellule B3
'
' trier3 Macro
'
'
Range("B3").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("C4:C162") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("B4:B162") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SetRange Range("B3:G162")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B3").Select
End Sub
Il y a quand même un problème le champ sélectioné quand on met le filtre est défini exemple C4:G162 donc à la prochaine éxécution c'est ce champ qui sera traité.
Pour ma part j'ai pris l'habitude de définir un champ nommé exemple "base" avec la ligne de libellé et de longueur supérieur aux informations à traités et comme ça je n'ai pas de problème (je mets 50 ou 100 lignes de plus que mes données
Exemple avec des nom de champ
Sub trier_base2()
'
' trier_base2 Macro
'
'
Range("base").Select
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("clé1") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("clé2") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SetRange Range("base")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("ancre1").Select
End Sub
Donc j'ai défini un champ "base" qui va de B3 à G250
un champ clé1 qui va de B4:B250
un champ cle2 qui va de C4:C250
un champ ancre1 qui est la cellule B3
damiens1026
Messages postés
563
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
Modifié par damiens1026 le 19/04/2012 à 13:07
Modifié par damiens1026 le 19/04/2012 à 13:07
Salut,
Merci pour ton aide et réponse, donc si j'ai bien compris, il n'existe pas de moyen de trier une plage de cellules via une sélection?
Meilleures salutations
damiens1026
Merci pour ton aide et réponse, donc si j'ai bien compris, il n'existe pas de moyen de trier une plage de cellules via une sélection?
Meilleures salutations
damiens1026
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
PHILOU10120
Messages postés
6400
Date d'inscription
lundi 16 avril 2012
Statut
Contributeur
Dernière intervention
17 janvier 2025
812
19 avril 2012 à 14:35
19 avril 2012 à 14:35
Merci Michel
damiens1026
Messages postés
563
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
19 avril 2012 à 15:39
19 avril 2012 à 15:39
Merci à vous 2 de m'avoir éclairé, aidé et fait progresser dans le domaine. Bonne suite à vous :)
damiens1026
Messages postés
563
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
Modifié par damiens1026 le 10/04/2013 à 14:21
Modifié par damiens1026 le 10/04/2013 à 14:21
Et comme définit-on ces champs?
J'ai essayé avec
J'ai essayé avec
base = Range([B4], [E4].End(xlDown))ou
base = Range("B4:E4") Range("base").Selectmais sans succès non plus...
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 311
10 avril 2013 à 14:55
10 avril 2013 à 14:55
bonjour
[B4] est l'écriture fainéante de range("B4").value (je l'utilise souvent)
donc range([B4],.... te renvoie la valeur dans B4 d'où protestation de tonton VBA....
pour définir une zone
dernière ligne utilisée
derlig=columns("B").find("*",,,,,xlprevious).row
ou si tu préfères
derlig=range("B4").End(xlDown).Row ' attention : s'arrête à la première cellule vide dans la col B
Base=Range("B4:E" & derlig)
[B4] est l'écriture fainéante de range("B4").value (je l'utilise souvent)
donc range([B4],.... te renvoie la valeur dans B4 d'où protestation de tonton VBA....
pour définir une zone
dernière ligne utilisée
derlig=columns("B").find("*",,,,,xlprevious).row
ou si tu préfères
derlig=range("B4").End(xlDown).Row ' attention : s'arrête à la première cellule vide dans la col B
Base=Range("B4:E" & derlig)
damiens1026
Messages postés
563
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
Modifié par damiens1026 le 10/04/2013 à 15:18
Modifié par damiens1026 le 10/04/2013 à 15:18
Salut,
Merci pour ta réponse. Cependant, j'ai trouvé une solution "alternative" mais boiteuse puisqu'elle ne fonctionne qu'à moitié et me semble également un peu "grailleuse":
En résumé, ce code sert à définir une liste d'une plage à 2 dimensions dont une des dimensions est changeante (en taille). Il se met râler dès que je lui demande d'effectuer une sélection d'une plage définie tel que
Merci pour le coup de pouce... ;)
Merci pour ta réponse. Cependant, j'ai trouvé une solution "alternative" mais boiteuse puisqu'elle ne fonctionne qu'à moitié et me semble également un peu "grailleuse":
Dim plage As Range Set plage = Range("A1:C1") plage.Select Dim plage2 As Range Set plage2 = Range(Selection, Selection.End(xlDown)) plage2.Select ActiveCell.Range("plage2").Select ActiveWorkbook.Worksheets("Feuil2").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Feuil2").Sort.SortFields.Add Key:=ActiveCell.Range _ ("A1:A3"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("Feuil2").Sort .SetRange ActiveCell.Range("plage2") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
En résumé, ce code sert à définir une liste d'une plage à 2 dimensions dont une des dimensions est changeante (en taille). Il se met râler dès que je lui demande d'effectuer une sélection d'une plage définie tel que
ActiveCell.Range("plage2").Select
Merci pour le coup de pouce... ;)
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 311
10 avril 2013 à 15:20
10 avril 2013 à 15:20
Il y a quelque temps je 't'avais dit d'éviter les "select" ,"selection"; voir lien #6 et t'avais proposé un tri simple sans lignes parasites liées à l'enregistreur de macros
Tu fais comme tu veux...
Tu fais comme tu veux...
damiens1026
Messages postés
563
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
10 avril 2013 à 15:29
10 avril 2013 à 15:29
Oui, c'est juste. Je vais essayer avec ta méthode et chercher un peu comme un grand. Merci ;)
damiens1026
Messages postés
563
Date d'inscription
jeudi 5 novembre 2009
Statut
Membre
Dernière intervention
10 avril 2013
32
10 avril 2013 à 16:04
10 avril 2013 à 16:04
Merci beaucoup, tout fonctionne à merveille!! :D
Modifié par michel_m le 19/04/2012 à 15:19
Quant à select-selection, cela encombre la mémoire et ralentit grandement la sélection; de plus dans les boucles cela fait clignoter l'écran...
si tu veux apprendre vBa
https://bidou.developpez.com/article/VBA/
ca se lit pas comme un roman policier mais c'est assez complet pour 50 à 60 % des ap^llis en VBA
Modifié par damiens1026 le 19/04/2012 à 15:32
19 avril 2012 à 15:37
19 avril 2012 à 15:38