Trier par macro 3 plages dans chaque zone de lignes/colonnes d'un tableau fixe

Webperegrino

XLDnaute Impliqué
Bonjour,

Je vous propose de vous pencher sur mon problème de macro qui réalise trois tris distincts sur les parties colorées de mon tableau à nombre de lignes fixe (voir le fichier ci-joint).

Je n’arrive pas à créer une macro plus généralisée que celle qui y est intégrée.

Objectif :
En effet, dans chaque zone colorée, les trois tris doivent pouvoir se réaliser en ordre décroissant quel que soit l’ordonnancement - en nombre - des lignes vides, des lignes avec points en dernière colonne de la zone, des lignes avec valeur mais sans points, le tri se faisant donc en ordre décroissant dans chaque partie de chaque zone colorée.

Explications sur le fonctionnement de la macro améliorée souhaitée :
Le fichier dispose de deux tableaux (le troisième sur la droite n’est là que pour vous montrer ce qui est souhaité) :

- le premier tableau « SOURCE » est fixe en nombre de lignes.
Cette zone (C49 :R80) est en réalité chargée de formules.
On ne la transforme donc pas mais on en fait un Copié-collé dans le tableau supérieur sur la feuille, en « valeurs uniquement »
- ce deuxième tableau final (C10 :R41) est coloré en ‘familles’ à trier.
Dans chaque ‘famille colorée’, trois parties pouvant varier en nombre de lignes et après le tri par macro :
- la partie vide devra figurer en bas du tableau,
- la partie avec des points en colonnes 3 viendra en milieu de tableau, triée en ordre décroissant en fonction des valeurs de colonnes 2,
- la partie avec valeurs en colonnes 2 et sans point en colonnes 3 se placera en partie supérieure de tableau, triée aussi en ordre décroissant,

Un tableau (T10:AI41) vous montre ce qui est désiré, une fois les tris réalisés dans la partie (C10 :R41).

De façon manuelle j’arrive très bien à faire les différents tris, par exemple pour la zone D10 :F41, et j'ai aussi ajouté un bouton qui active la macro actuellement en place.

En exemple seulement, le résultat souhaité apparaît dans le tableau de droite T10 :AI41

Peut-on obtenir tout ce travail par automatisation sous forme de macro meilleure que la mienne ? ... sachant que :
- le tableau ne varie pas en nombre de lignes
- les lignes où il n’y a rien peuvent varier en nombre en bas de tableau trié
- les lignes avec des points peuvent aussi varier pour le tri placé en centre de tableau
- les lignes à notes et sans points peuvent aussi être supérieures ou inférieures à l’exemple ci-annexé.
En effet, ma macro ne prend pas en compte cette possibilité de variation du nombre de lignes de ces trois parties.

Merci à l'avance de vous pencher sur cette particularité, et de la pédagogie que vous m'indiquerez pet-être pour me permettre de mieux comprendre ce principe de tri qui m'échappe.
Bonne soirée.
Webperegrino
 

Fichiers joints

JNP

XLDnaute Barbatruc
Re : Trier par macro 3 plages dans chaque zone de lignes/colonnes d'un tableau fixe

Bonsoir Webperegrino :),
Pour trier la première
Code:
With Range("D10:F33")
    .Sort Key1:=Range("F10"), Order1:=xlAscending, Key2:=Range("E10"), _
        Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
End With
suffit, à adapter sur tes autres matières.
Je regarderai pour passer par une boucle demain.
Bonne soirée :cool:
 

Webperegrino

XLDnaute Impliqué
Re : Trier par macro 3 plages dans chaque zone de lignes/colonnes d'un tableau fixe

Bonsoir Le Forum,
Bonsoir JNP et merci,
J'étudie ton code qui semble bien raccoursi en effet, à côté de ma macro 'usine à gaz'...
Bonne soirée
 

Webperegrino

XLDnaute Impliqué
Re : Trier par macro 3 plages dans chaque zone de lignes/colonnes d'un tableau fixe

Bonjour Le Forum, Bonjour JNP,
Ton code fonctionne bien,
Toutefois il ne plus en compte l'éventualité d'avoir plus de personnes dans le tableau fixe.
La macro trie bien les ligne 10 à 33.... mais oubliera les éventuelles personnes : P25 à P32 jusqu'à la ligne 41 : le tri -pas si inutile que ça- sur les lignes vidées doit aussi se faire de telle sorte que ces lignes vides resteront en bas de tableau trié.
 

Webperegrino

XLDnaute Impliqué
Re : Trier par macro 3 plages dans chaque zone de lignes/colonnes d'un tableau fixe

Le Forum, JNP,
J'ai oublié de joindre le fichier... désolé.
Bonne journée
 

Fichiers joints

JNP

XLDnaute Barbatruc
Re : Trier par macro 3 plages dans chaque zone de lignes/colonnes d'un tableau fixe

Re :),
Toutefois il ne plus en compte l'éventualité d'avoir plus de personnes dans le tableau fixe.
Ton postulat de départ était un tri avec uniquement des lignes fixes...
De plus, histoire de faire des farces, tu as des espaces dans tes cellules, donc en théorie, tu n'as aucune ligne vide...
Bon, une macro propre, mais ralongée par les subtilités de tes résultats
Code:
Sub TriJNP()
Dim Cellule As Range, I As Integer
Application.ScreenUpdating = False
ActiveSheet.Unprotect
Range("C49:R80").Copy
Range("C10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Application.CutCopyMode = False
For I = 3 To 15 Step 3
For Each Cellule In Range(Chr(65 + I) & "10:" & Chr(65 + I) & "41")
Cellule = Trim(Cellule)
Next
For Each Cellule In Range(Chr(67 + I) & "10:" & Chr(67 + I) & "41")
If Cellule <> "." And Cellule.Offset(0, -2) <> "" Then
Cellule = " "
ElseIf Cellule <> "." And Cellule.Offset(0, -2) = "" Then
Cellule = "/"
End If
Next
With Range(Chr(65 + I) & "10:" & Chr(67 + I) & "41")
    .Sort Key1:=Range(Chr(67 + I) & "10"), Order1:=xlAscending, Key2:=Range(Chr(66 + I) & "10"), _
        Order2:=xlDescending, Header:=xlGuess, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
End With
For Each Cellule In Range(Chr(67 + I) & "10:" & Chr(67 + I) & "41")
Cellule = Replace(Cellule, "/", "")
Next
Next I
Range("C9").Select
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Application.ScreenUpdating = True
End Sub
C'est quand même moins long que ton code de départ...
Bonne journée :cool:
 

ROGER2327

XLDnaute Barbatruc
Re : Trier par macro 3 plages dans chaque zone de lignes/colonnes d'un tableau fixe

Bonjour à tous
Deux autres propositions :
  1. Si les cinq plages à traiter sont contigües et de mêmes dimensions :
    VB:
    Sub TRI_1()
    Dim i&, j&, k, u, nT, tmp, oDat(), oRf As Range
        ActiveSheet.Unprotect
        Set oRf = Range("D49:F80")
        For nT = 0 To 12 Step 3
          oDat = oRf.Offset(0, nT).Value
          ReDim Preserve oDat(1 To UBound(oDat, 1), 1 To 1 + UBound(oDat, 2))
          u = UBound(oDat, 2)
          For i = 1 To UBound(oDat, 1)
            If IsNumeric(Trim(oDat(i, u - 2))) Then oDat(i, u) = 1000 * (1 + (Trim(oDat(i, u - 1)) = ".")) + oDat(i, u - 2) Else oDat(i, u) = -1
          Next i
          For i = 1 To UBound(oDat, 1) - 1
            For j = i To UBound(oDat, 1)
              If oDat(i, u) < oDat(j, u) Then
                For k = 1 To u
                  tmp = oDat(i, k): oDat(i, k) = oDat(j, k): oDat(j, k) = tmp
                Next k
              End If
            Next j
          Next i
          Range("D10:F41").Offset(0, nT).Value = oDat
        Next nT
        Erase oDat
        Set oRf = Nothing
        Range("C9").Select 'Facultatif
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    End Sub
  2. Pour des plages éventuellement disjointes :
    VB:
    Sub TRI_2()
    Dim i&, j&, k&, u&, nT&, tmp, oDat(), oRf()
        ActiveSheet.Unprotect
        oRf = Array(Array("D49:F80", "D10:F41"), Array("G49:I80", "G10:I41"), Array("J49:L80", "J10:L41"), Array("M49:O80", "M10:O41"), Array("P49:R80", "P10:R41"))
        For nT = 0 To UBound(oRf)
          oDat = Range(oRf(nT)(0)).Value
          ReDim Preserve oDat(1 To UBound(oDat, 1), 1 To 1 + UBound(oDat, 2))
          u = UBound(oDat, 2)
          For i = 1 To UBound(oDat, 1)
            If IsNumeric(Trim(oDat(i, u - 2))) Then oDat(i, u) = 1000 * (1 + (Trim(oDat(i, u - 1)) = ".")) + oDat(i, u - 2) Else oDat(i, u) = -1
          Next i
          For i = 1 To UBound(oDat, 1) - 1
            For j = i To UBound(oDat, 1)
              If oDat(i, u) < oDat(j, u) Then
                For k = 1 To u
                  tmp = oDat(i, k): oDat(i, k) = oDat(j, k): oDat(j, k) = tmp
                Next k
              End If
            Next j
          Next i
          Range(oRf(nT)(1)).Value = oDat
        Next nT
        Erase oDat
        Erase oRf
        Range("C9").Select 'Facultatif
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    End Sub
ROGER2327
#4783


Vendredi 20 Sable 138 (Saint Sabre, allopathe, SQ)
30 Frimaire An CCXIX
2010-W51-1T13:48:46Z
 

Fichiers joints

Webperegrino

XLDnaute Impliqué
Re : Trier par macro 3 plages dans chaque zone de lignes/colonnes d'un tableau fixe

Bonsoir Le Forum,
Bonsoir JNP, PierreJean et Roger2327,
Ça y est ! Mes étrennes 2010 sont arrivées : des heures de travail pour étudier et appliquer vos contributions pour ainsi avoir mes macros aussi courtes que les vôtres ! Là, vous me comblez, merci encore ! Joyeux Noël à vous tous (Avec une photo de rouge et de barbe plus blanche ajoutés, Roger2327 serait parfait pour entrer dans les cheminées de la Maison Excel-Downloads... si c'est bien lui)
 

Discussions similaires


Haut Bas