Trier une plage de donnée variable

piegre

XLDnaute Junior
Bonjour à tous,

Je souhaite faire un tri avec une plage de donnée, pour l'instant il n'y a aucun problème avec une petite macro, cependant c'est une plage de donnée variable et je n'arrive pas à gérer l'augmentation ou la diminution de la plage de donnée.

Je vous ai joint un fichier montrant le tri à effectuer.
 

Fichiers joints

pat01200

XLDnaute Occasionnel
Re : Trier une plage de donnée variable

Bonjour,

Je te propose de passer par un filtre automatique, personnalisé, cellules non vides (à intégrer à ta macro avant le tri)...

Bonne journée !
 

vgendron

XLDnaute Barbatruc
Re : Trier une plage de donnée variable

Hello

avec ce code
Code:
Sub macrotrier()
'
' macrotrier Macro
'

'
    nblignes = Range("A65536").End(xlUp).Row
    'Range("A1:B22").Select
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("B1:B" & nblignes) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("A1:B" & nblignes)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    'Range("A12:B22").Select
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A12:A" & nblignes) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("A12:B" & nblignes)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub
PS: ton second tri me semble étrange...
comme tu parles d'étendre ou raccourcir la range de tri.. comment vas tu faire pour adapter le A12 du second tri?
 

vgendron

XLDnaute Barbatruc
Re : Trier une plage de donnée variable

proposition pour cette fameuse ligne 12..

Code:
Sub macrotrier()
'
' macrotrier Macro
'

'
    'récupère le nombre de lignes
    nblignes = Range("A65536").End(xlUp).Row
    
    'suppression des tris de la feuille
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    
    'tri croissant sur la colonne B
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("B1:B" & nblignes) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("A1:B" & nblignes)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    'suppression des tris de la feuille
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    
    'Détection de la ligne pour laquelle il y a changement de valeur en B...
    For i = 2 To nblignes
        If Cells(i, 2) <> Cells(i - 1, 2) Then DebutTri = i: Exit For
    Next i
       
    'tri décroissant sur la colonne B
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A" & DebutTri & ":A" & nblignes) _
    , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("A" & DebutTri & ":B" & nblignes)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub
 

piegre

XLDnaute Junior
Re : Trier une plage de donnée variable

Merci vous êtes géniaux, cela fonctionne à merveille sur mon programme source :)
 

piegre

XLDnaute Junior
Re : Trier une plage de donnée variable

Cependant ><, j'ai pris un tableau en ayant que 2 valeurs dans la 2ème colonne, avec plusieurs valeurs différentes,le code de vgenderon ne fonctionne pas :(. J'essaie de le modifier mais en vain.

Je vous remet le tableau avec les valeurs avant et après le tri désiré.

Evidemment les deux boutons ne fonctionne plus.
 

Fichiers joints

chris

XLDnaute Barbatruc
Re : Trier une plage de donnée variable

Bonjour

Pour a part j'utilise les colonnes entières à précisant .Header =xlyes et n'ai pas à calculer la taille du tableau
 

vgendron

XLDnaute Barbatruc
Re : Trier une plage de donnée variable

j'ai pris un tableau en ayant que 2 valeurs dans la 2ème colonne, avec plusieurs valeurs différentes,le code de vgenderon ne fonctionne pas
sais pas pourquoi. mais je m'y attendais ;-)

essaie ce code

Code:
Sub macrotrier()
'
' macrotrier Macro

    
    'récupère le nombre de lignes
    nblignes = Range("A65536").End(xlUp).Row
    
    'Range("A2:B25").Select
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("B2:B" & nblignes) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A2:A" & nblignes) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("A1:B" & nblignes)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
End Sub
Sub remisenplace()
'
' remisenplace Macro
'

'
    'récupère le nombre de lignes
    nblignes = Range("A65536").End(xlUp).Row
    
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A2"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("A2:B" & nblignes)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub
 

piegre

XLDnaute Junior
Re : Trier une plage de donnée variable

J'arrive pas à transformer le tableau 1 en tableau 2, même si j'utilises ce que tu viens de me dire.

EDIT: Merci vgenderon mais cela ne fonctionne pas.
 
Dernière édition par un modérateur:

vgendron

XLDnaute Barbatruc
Re : Trier une plage de donnée variable

question
c'est quoi tes tris exactement?

si on reprend ton fichier initial avec juste des 1 et des 2 en colonne B
d'après ta macro tu commences par trier sur la colonne B en ordre croissant...
mais après.. ?? tu commences un nouveau tri sur la colonne A en décroissant à partir de la ligne 12.. pourquoi 12 ??

(j'ai interprété. peut etre à tord que 12, c'était la ligne où la colonne B passe de la valeur 1 à 2..)

mais la. dans ton nouveau fichier. je ne vois pas la logique des tris..
 

piegre

XLDnaute Junior
Re : Trier une plage de donnée variable

Pour être un peu plus claire, ce sont des coordonnées d'une fraiseuse.Je veux les trier pour que la tête de la fraiseuse parcourt le moins de trajet possible ( le programme lit de bas en haut )

Logique du tris de mon 2ème fichier :

- axe x : je souhaite que cela fasse 1 2 3 4 5 5 4 3 2 1 vu que toutes les valeurs sont en doubles ( trajet aller-retour)

- axe y : trier de la plus grande valeurs à la plus petite ( vu que c'est négatif )

Mais que les cases restent liées entre elles comme le premier fichier en faite
 
Dernière édition par un modérateur:

vgendron

XLDnaute Barbatruc
Re : Trier une plage de donnée variable

plus compliqué que ca en a l'air en fait...

c'est pas juste un tri. il faut ventiler les données un coup en haut, un coup en bas..
regarde la PJ:
La macro ne fait QUE le tri sur la colonne A pour regrouper les points de mesure selon l'axe x (tu as donc le point aller. et juste en dessous le point retour)

PUIS la formule en I et J, récupère les data dans l'ordre souhaité..enfin.. je pense
la première valeur d'absisse x est considérée comme le point aller
la seconde valeur de meme abcisse x est le point retour


je te laisse les calculs intermédiaires pour que tu comprennes l'histoire des lignes() lignes()+1 ...
pour rappel:
un nombre impair est de forme: 2*n +1
et un nombre pair de forme 2*n
 

Fichiers joints

piegre

XLDnaute Junior
Re : Trier une plage de donnée variable

Merci vgendron, mais du coup j'ai réussi à le faire , et peu importe le nombre de donnée :

Code:
Sub Trigodet()
Dim NbLig As Integer
Dim NbLig2 As Integer
Dim NbLig3 As Integer

    NbLig = Application.WorksheetFunction.Count(Range("A3:A50")) + 2 'Si nblig=24
    NbLig2 = (NbLig + 2) / 2                           ' = 12
    NbLig3 = NbLig2 + 1                                ' = 13

    Range(Cells(3, 1), Cells(NbLig, 2)).Select
    ActiveWorkbook.Worksheets("PLAN donnée").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("PLAN donnée").Sort.SortFields.Add Key:=Range(Cells(3, 2), Cells(NbLig, 2)) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("PLAN donnée").Sort
        .SetRange Range(Cells(3, 1), Cells(NbLig, 2))
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range(Cells(3, 1), Cells(NbLig2, 1)).Select
    ActiveWorkbook.Worksheets("PLAN donnée").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("PLAN donnée").Sort.SortFields.Add Key:=Range(Cells(3, 1), Cells(NbLig2, 1)) _
        , SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("PLAN donnée").Sort
        .SetRange Range(Cells(3, 1), Cells(NbLig2, 1))
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range(Cells(NbLig3, 1), Cells(NbLig, 1)).Select
    ActiveWorkbook.Worksheets("PLAN donnée").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("PLAN donnée").Sort.SortFields.Add Key:=Range(Cells(NbLig3, 1), Cells(NbLig, 1)) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("PLAN donnée").Sort
        .SetRange Range(Cells(NbLig3, 1), Cells(NbLig, 1))
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range(Cells(3, 2), Cells(NbLig2, 2)).Select
    ActiveWorkbook.Worksheets("PLAN donnée").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("PLAN donnée").Sort.SortFields.Add Key:=Range(Cells(3, 2), Cells(NbLig2, 2)) _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("PLAN donnée").Sort
        .SetRange Range(Cells(3, 2), Cells(NbLig2, 2))
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas