Bonjour,

J'ai crée une macro qui marche très bien, cependant, au bout de plusieurs utilisation elle devient de plus en plus longue et la taille du fichier excel augmente.
J'ai effectué différentes recherches sur internet mais aucune n'a abouti.
Le problème vient peut être de mon code lui-même.
Voici le code en question :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
141
142
143
144
145
146
147
148
149
150
151
152
153
Option Explicit
 
Sub TriAlpha()
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
Dim j As Long
Application.CutCopyMode = False
Dim Cible As DataObject
Const LigTablT = 2     ' Nb lignes du tableau T()
 
Application.ScreenUpdating = False
Set Debut = [DebTab]
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
    Debut.Offset(Lig - Debut.Row, -1).Select
    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
 
 
For i = 1 To UBound(T, 1)
    For j = 1 To UBound(T, 2)
        [Q14].Offset(i, j).Select
        ActiveCell.FormulaR1C1 = T(i, j)
    Next j
Next i
 
' --------------- Ajoute une feuille temporaire et la nomme
Dim Feuil
For Each Feuil In ActiveWorkbook.Worksheets
    If Feuil.Name = "AuxiliaireDeTri" Then                                                                                    ' Si une temporaire est éventuellement restée
        Application.DisplayAlerts = False                                                                                      ' on inhibe les alertes
        Worksheets("AuxiliaireDeTri").Delete                                                                                 ' et l'on efface cette feuille (pour éviter une erreur)
    End If
Next Feuil
Sheets.Add                                                                                                                             ' Ajoute la feuille
With ActiveSheet
    .Name = "AuxiliaireDeTri"                                                                                                     ' et la nomme
End With
' --------------- Trie le tableau T()
Call TriVariants2(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
With Worksheets("Analyses")
    Decal = 1
    For Groupe = 1 To UBound(T, 2)
        .Range(.Cells(T(1, Groupe), .[DebTab].Column), (.Cells(T(1, Groupe) + _
        2, .[DebTab].Column + NbColTabFeuil - 1))).Copy                                           ' copie la plage
        With Worksheets("AuxiliaireDeTri")
 
            .Range("A1").Offset(Decal, 0).Select
            Decal = Decal + 3
 
            ActiveSheet.Paste
        End With
        Set Cible = New DataObject
        Cible.SetText ""
        Cible.PutInClipboard
 
Set Cible = Nothing
    Next Groupe
End With
 
' --------------- 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").Activate
Range([A2], [A2].Offset(NbLigTabFeuil - 1, NbColTabFeuil - 1)).Copy                                             ' Met le tableau de la feuille temporaire dans le tampon
Worksheets("Analyses").Activate
Range([DebTab].Offset(1, 0), [DebTab].Offset(NbLigTabFeuil, NbColTabFeuil - 1)).Select                 ' Met le tampon dans le tableau initial
ActiveSheet.Paste
[A2].Select
Set Cible = New DataObject
Cible.SetText ""
Cible.PutInClipboard
 
Set Cible = Nothing
' --------------- Efface la feuille temporaire
Application.DisplayAlerts = False
On Error Resume Next
Worksheets("AuxiliaireDeTri").Delete
Application.ScreenUpdating = True
 
 
End Sub
 
' ================= Procédure de tri QuickSort adaptée ici à un tableau horizontal multilignes =========================
Sub TriVariants2(T 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.CutCopyMode = False
Dim j As Long
Dim i As Long
 
For j = 1 To UBound(T, 2)
    For i = 1 To UBound(T, 1)
        [Z1].Offset(j - 1, i - 1).Select
        ActiveCell.FormulaR1C1 = T(i, j)
    Next i
Next j
 
ActiveWorkbook.Worksheets("AuxiliaireDeTri").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("AuxiliaireDeTri").Sort.SortFields.Add Key:=Range("AA1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("AuxiliaireDeTri").Sort
    .SetRange Range("AA1:Z500")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
 
For j = 1 To UBound(T, 2)
    For i = 1 To UBound(T, 1)
        T(i, j) = [Z1].Offset(j - 1, i - 1).Value
    Next i
Next j
 
End Sub

Merci et bonne journée !