1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
| Option Explicit
Sub TriAnneeDec()
Application.Calculation = xlCalculationManual
Dim Debut As Range
Dim Lig As Long
Dim DerLig As Long
Dim NbLiGroup As Long
Dim NbLiDerCelGroup As Long
Dim Groupe As Long
Dim T() As Variant
Dim I As Long
Dim NbLigTabFeuil As Long
Dim NbColTabFeuil As Long
Dim Nom As Variant
Dim Decal As Long
Application.CutCopyMode = False
Dim j As Integer
Dim NbCol As Integer
Dim NbRow As Integer
Dim CopyRange As Range
Dim PasteRange As Range
Const LigTablT = 2 ' Nb lignes du tableau T()
Application.ScreenUpdating = False
Set Debut = [DebTab].Offset(0, 2 - 1)
NbLiGroup = 1 ' Init. Nb lignes par groupe
NbLiDerCelGroup = Cells(65536, Debut.Column).End(xlUp).MergeArea.Rows.Count ' Nb lignes du dernier groupe
DerLig = Cells(65536, Debut.Column).End(xlUp).Row + NbLiDerCelGroup - 1
NbLigTabFeuil = DerLig - Debut.Row
NbColTabFeuil = 14
' --------------- Met en mémoire les caractéristiques du tableau de la feuille dans le tableau T()
I = 0
ReDim T(1 To LigTablT, 1 To 1) ' Tableau "en long" (a cause du Redim sur dernière dimension)
For Lig = Debut.Row + 1 To DerLig
If Debut.Offset(Lig - Debut.Row, 0).Value = "" Or Debut.Offset(Lig - Debut.Row, 0).Value = "Année" Then ' Si la ligne est vide ; la cellule est fusionnée avec
NbLiGroup = NbLiGroup + 1 ' précédente, donc : une ligne de plus
Else ' Sinon
NbLiGroup = 1 ' début de nouveau groupe
I = I + 1 ' Ajoute une
ReDim Preserve T(1 To LigTablT, 1 To I) ' colonne au tableau
T(1, I) = Lig ' Mémorise le N° de la ligne de début de groupe
T(2, I) = Debut.Offset(Lig - Debut.Row, 0).Value ' Mémorise le Nb de ligne fusionnées pour ce groupe (sauf 1er passage)
End If
Next Lig
' --------------- Trie le tableau T()
Call TriVariants(T, 1, UBound(T, 2), 1, UBound(T, 1), 2)
' --------------- En fonction du tableau T() trié, copie chaque groupe de la feuille de départ dans la feuille "Tri" Pour garder les formats
Decal = 1
For Groupe = 1 To UBound(T, 2)
Worksheets("Analyses").Range(Cells(T(1, Groupe) - 1, [DebTab].Column), (Cells(T(1, Groupe) + 1, [DebTab].Column + NbColTabFeuil - 1))).Copy _
Worksheets("AuxiliaireDeTri").Range("A1").Offset(Decal, 0)
Decal = Decal + 3
Next Groupe
' --------------- Copie le tableau complet de la feuille "Tri" dans la feuille de départ pour garder les formats
With Worksheets("Analyses")
.Range(.[DebTab].Offset(1, 0), .[DebTab].Offset(NbLigTabFeuil, _
NbColTabFeuil - 1)).MergeCells = False ' Défusionne la plage initiale
.Range(.[DebTab].Offset(1, 0), .[DebTab].Offset(NbLigTabFeuil, _
NbColTabFeuil - 1)).Interior.ColorIndex = xlNone ' Supprime la couleur du fond
End With
Worksheets("AuxiliaireDeTri").Range(Worksheets("AuxiliaireDeTri").[A2], Worksheets("AuxiliaireDeTri").[A2].Offset(NbLigTabFeuil - 1, NbColTabFeuil - 1)).Copy _
Destination:=Worksheets("Analyses").Range(Worksheets("Analyses").[DebTab].Offset(1, 0), Worksheets("Analyses").[DebTab].Offset(NbLigTabFeuil, NbColTabFeuil - 1))
' --------------- Efface la feuille temporaire
Application.DisplayAlerts = False
On Error Resume Next
Worksheets("AuxiliaireDeTri").Cells.ClearContents
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
' ================= Procédure de tri QuickSort adaptée ici à un tableau horizontal multilignes =========================
Sub TriVariants(Tabl As Variant, IndBasCol As Long, IndHautCol As Long, IndBasLig As Long, IndHautLig As Long, IndLignTriee As Long)
' Paramètres :
' Tabl = tableau de Variants à trier
' IndBasLig = indice bas des lignes du tableau (= Lbound(Tabl,1))
' IndHautLig = indice haut des lignes du tableau (= Ubound(Tabl,1))
' IndBasCol = indice bas des colonnes du tableau (= Lbound(Tabl,2))
' IndHautCol = indice haut des colonnes du tableau (= Ubound(Tabl,2))
' IndLignTriee = indice de la ligne sur laquelle s'effectue le tri
Application.Calculation = xlCalculationManual
Application.CutCopyMode = False
Dim j As Long
Dim I As Long
Dim Pivot As Variant
Dim TmpSwap As Variant
Dim TmpBas As Long
Dim TmpHaut As Long
Dim Ligne As Long
TmpBas = IndBasCol
TmpHaut = IndHautCol
Pivot = Tabl(IndLignTriee, (IndBasCol + IndHautCol) \ 2)
While (TmpBas <= TmpHaut)
While (Tabl(IndLignTriee, TmpBas) < Pivot And TmpBas < IndHautCol)
TmpBas = TmpBas + 1
Wend
While (Pivot < Tabl(IndLignTriee, TmpHaut) And TmpHaut > IndBasCol)
TmpHaut = TmpHaut - 1
Wend
If (TmpBas <= TmpHaut) Then
For Ligne = IndBasLig To IndHautLig
TmpSwap = Tabl(Ligne, TmpBas)
Tabl(Ligne, TmpBas) = Tabl(Ligne, TmpHaut)
Tabl(Ligne, TmpHaut) = TmpSwap
Next Ligne
TmpBas = TmpBas + 1
TmpHaut = TmpHaut - 1
End If
Wend
' --------------- Appel récursif
If (IndBasCol < TmpHaut) Then Call TriVariants(Tabl, IndBasCol, TmpHaut, IndBasLig, IndHautLig, IndLignTriee)
If (TmpBas < IndHautCol) Then Call TriVariants(Tabl, TmpBas, IndHautCol, IndBasLig, IndHautLig, IndLignTriee)
Application.Calculation = xlCalculationAutomatic
End Sub |