En bref — Trier dans le code est une réorganisation permanente : il n'y a pas de Ctrl+Z après l'exécution d'une macro, donc une fois
.Sortdéclenché, l'ordre des lignes d'origine a disparu, sauf si vous l'avez sauvegardé. Si vous risquez d'en avoir besoin, ajoutez une colonne d'index (1, 2, 3…) avant de trier pour pouvoir retrier en sens inverse plus tard. Passez toujoursHeader:=xlYes, sinon Excel risque de trier votre ligne de titres dans les données. Et triez un enregistrement complet — le tableau entier viaCurrentRegion, jamais une seule colonne, sinon vous réorganisez une colonne et mélangez le reste.
' Trier un tableau par la colonne C (3e col de la plage) en decroissant - tout l'enregistrement se deplace ensemble.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
With ws.Range("A1").CurrentRegion ' tout le tableau, pour que chaque colonne reste alignee
.Sort Key1:=.Columns(3), Order1:=xlDescending, Header:=xlYes
End With
Trier a l'air de l'opération la plus sûre d'Excel — vous le faites à la main cent fois par jour et l'annulez d'une touche. Dans le code, ce filet de sécurité disparaît. La chose la plus importante à comprendre sur le tri en VBA n'est pas la syntaxe ; c'est qu'un tri dans une macro est une mutation que vous ne pouvez pas annuler à la légère. Tout ce qui suit s'organise autour de la protection de vos données face à ce fait, puis de la mécanique.
Ce que vous allez apprendre
- Le modèle mental — un tri est une mutation permanente, et comment le rendre réversible
- La règle unique qui sauve vos données — triez un enregistrement complet, jamais une colonne isolée
Header:=xlYes— pourquoi l'omettre fait tomber vos titres dans les donnéesRange.Sort(rapide, limité à 3 clés) vs l'objetSort(verbeux, illimité, persistant)- Le piège
SortFields.Clear— hériter des clés de tri d'une exécution précédente - Pourquoi des nombres stockés en texte se trient en 1, 10, 2 — et comment y remédier
Le modèle mental : un tri est une mutation, pas une vue
Le guide précédent présentait AutoFilter comme une vue —
réversible, ne masquant rien de façon permanente. Sort est l'inverse : une mutation. Il
réécrit physiquement l'ordre des lignes. Il n'y a pas d'« original » caché en dessous à restaurer.
Et surtout, Application.Undo ne fonctionne pas après un tri par macro — exécuter du VBA vide
la pile d'annulation d'Excel, si bien que l'utilisateur ne peut pas non plus appuyer sur Ctrl+Z.
Cela change la façon de penser avant chaque tri : si cet ordre compte, je dois le préserver moi-même. La méthode économique et infaillible, c'est une colonne d'index — estampillez les lignes 1, 2, 3… avant de trier, de sorte que « retrier vers l'origine » ne soit qu'un tri sur cette colonne :
' Ajouter une colonne de restauration d'ordre AVANT de trier.
Dim i As Long, lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
ws.Cells(i, "Z").Value = i - 1 ' 1, 2, 3... dans une colonne libre
Next i
' ...triez ensuite comme bon vous semble ; pour restaurer, triez par la colonne Z en croissant.
Adoptez cette habitude pour tout tri dont vous pourriez avoir besoin de l'ordre d'origine, et le problème du « pas d'annulation » disparaît.
La règle la plus importante : triez l'enregistrement entier, pas une seule colonne
C'est l'erreur qui détruit les données en silence. Si vous sélectionnez une seule colonne et la triez, Excel réorganise cette seule colonne et laisse toutes les autres là où elles étaient. Les noms s'alignent désormais avec les mauvais numéros de téléphone ; les ID de facture pointent vers les mauvais montants. Rien ne déclenche d'erreur — la feuille devient simplement, silencieusement et définitivement, fausse.
' FAUX - trie la colonne B seule, en l'arrachant au reste de chaque ligne.
ws.Range("B2:B100").Sort Key1:=ws.Range("B2"), Order1:=xlAscending
' CORRECT - trier tout le tableau ; chaque colonne voyage avec sa ligne.
ws.Range("A1").CurrentRegion.Sort Key1:=ws.Range("B2"), Order1:=xlAscending, Header:=xlYes
La règle : triez la plus petite plage qui reste un enregistrement complet. En pratique, cela
veut dire le tableau entier — Range("A1").CurrentRegion saisit le bloc contigu pour vous. La
clé de tri peut être une seule colonne ; la plage de tri doit couvrir toutes les colonnes de
l'enregistrement. C'est exactement la même leçon d'alignement que supprimer une seule cellule au
lieu d'une ligne entière — réorganisez une partie d'un enregistrement et vous le corrompez tout
entier.
Header:=xlYes, sinon vos titres se font trier dans les données
Range.Sort a un argument Header, et sa valeur par défaut est xlGuess — Excel tente de
détecter si la première ligne est un en-tête. Quand il se trompe, vos titres de colonnes se font
trier vers le bas dans les données comme n'importe quelle autre ligne, atterrissant quelque part
au milieu. Ne le laissez jamais deviner :
.Sort Key1:=.Columns(1), Order1:=xlAscending, Header:=xlYes ' la premiere ligne, ce sont les titres - laissez-la en place
Passez Header:=xlYes quand votre plage inclut la ligne d'en-tête (le cas habituel), xlNo quand
ce sont des données pures. Ce seul argument évite le grand classique du bug « mes en-têtes se sont
retrouvés à la ligne 43 ».
Deux façons de trier : Range.Sort vs l'objet Sort
VBA vous offre deux API, qui troquent la concision contre la puissance.
Range.Sort est la rapide — une seule instruction avec jusqu'à trois clés de tri
(Key1/Key2/Key3). Parfaite pour le cas courant :
' Trier par Region (croissant), puis par Amount (decroissant) dans chaque region.
ws.Range("A1").CurrentRegion.Sort _
Key1:=ws.Range("B1"), Order1:=xlAscending, _
Key2:=ws.Range("C1"), Order2:=xlDescending, _
Header:=xlYes
L'objet Worksheet.Sort est le verbeux — vous ajoutez les SortFields un à un — mais il lève
le plafond des trois clés et prend en charge le tri par couleur de cellule, couleur de police et
icône, ce que Range.Sort ne peut pas. Il persiste aussi : les réglages de tri restent collés
à la feuille, et c'est précisément ce qui lui donne un tranchant dangereux.
With ws.Sort
.SortFields.Clear ' <-- CRITIQUE : eliminer d'abord les cles residuelles
.SortFields.Add Key:=ws.Range("B2:B100"), Order:=xlAscending
.SortFields.Add Key:=ws.Range("C2:C100"), Order:=xlDescending
.SetRange ws.Range("A1").CurrentRegion
.Header = xlYes
.Apply
End With
Le piège qui définit l'objet Sort : SortFields.Clear doit venir en premier. Comme les champs
de tri persistent sur la feuille, toutes les clés qu'une exécution de macro précédente — ou un
utilisateur triant à la main — a laissées derrière elle sont toujours là. Sautez .Clear et
vous triez selon les anciennes clés plus les nouvelles, dans un mélange que vous n'avez jamais
demandé. Ma règle : recourez à Range.Sort pour tout ce qui va jusqu'à trois clés, et ne passez à
l'objet Sort que lorsqu'il vous faut réellement plus de clés ou un tri par couleur/icône — et dans
ce cas, SortFields.Clear est la première ligne à l'intérieur du With.
Le piège du type de données : des nombres stockés en texte
Un tri qui « ressort dans le mauvais ordre » est presque toujours un problème de type de données. Si une colonne de nombres est en réalité stockée comme du texte — fréquent après un import depuis un CSV ou le web — Excel la trie lexicalement, caractère par caractère : « 1 », « 10 », « 2 », « 21 », « 3 ». Les valeurs ressemblent à des nombres et se trient comme des mots.
Le correctif est en amont : convertissez la colonne en vrais nombres avant de trier, pour que 2
se trie avant 10. C'est un travail de conversion — voir CStr, CDate et
Val pour transformer du texte importé en véritables types numériques. Une
fois que la colonne contient de vrais nombres, le tri est correct ; aucun ajustement d'argument de
tri ne corrige du texte qui se fait passer pour des nombres.
Comment ExcelMaster aide
Le tri cache ses dangers derrière une opération familière et rassurante : le Header:=xlYes
manquant qui enterre vos titres, le tri sur une seule colonne qui mélange les enregistrements, le
SortFields.Clear absent qui hérite de clés périmées, l'ordre texte-au-lieu-de-nombres, et
surtout le fait qu'il n'y a pas d'annulation une fois la macro exécutée. Aucun de ces problèmes ne
déclenche d'erreur — ils laissent simplement vos données mal réorganisées et irrécupérables.
ExcelMaster vous laisse décrire le
tri que vous voulez. Dites « trie par région, puis par montant du plus élevé au plus faible » et
il trie l'enregistrement entier (pas une seule colonne), définit Header explicitement, efface
les champs de tri périmés, et — parce qu'il sauvegarde d'abord la feuille — vous laisse un chemin
de retour même si l'annulation propre d'Excel a disparu. Vous gardez le classeur et le code ; vous
vous épargnez le moment où un tri sur une colonne détache discrètement chaque nom de son numéro.
Questions fréquentes
Puis-je annuler un tri effectué par une macro VBA ?
Non. Exécuter une macro vide la pile d'annulation d'Excel, de sorte que ni votre code ni l'utilisateur ne peuvent annuler par Ctrl+Z un tri effectué par une macro. Protégez vous-même l'ordre d'origine avant de trier — le plus simple est d'estampiller une colonne d'index (1, 2, 3…) pour pouvoir y retrier plus tard, ou de sauvegarder la feuille d'abord.
Pourquoi mon tri VBA a-t-il mélangé les données ?
Presque toujours parce que vous avez trié une seule colonne au lieu de l'enregistrement entier.
Trier une colonne ne réorganise que celle-ci et laisse les autres en place, si bien que les
valeurs de chaque ligne ne vont plus ensemble. Triez le tableau entier —
Range("A1").CurrentRegion — avec la clé de tri pointant sur la colonne à ordonner.
Comment empêcher VBA de trier ma ligne d'en-tête dans les données ?
Passez Header:=xlYes à .Sort (ou définissez .Header = xlYes sur l'objet Sort). La valeur par
défaut est xlGuess, qui laisse Excel tenter de détecter l'en-tête et trie parfois vos titres
vers le bas dans les lignes. Définir xlYes explicitement maintient la première ligne fixée comme
en-tête.
Quelle est la différence entre Range.Sort et l'objet Sort en VBA ?
Range.Sort est une seule instruction limitée à trois clés de tri — rapide et adaptée à la
plupart des tâches. L'objet Worksheet.Sort ajoute les clés une à une avec SortFields.Add,
prend en charge un nombre illimité de clés et le tri par couleur ou icône, et conserve ses
réglages sur la feuille — vous devez donc appeler SortFields.Clear d'abord pour éviter d'hériter
d'anciennes clés.
Pourquoi mon tri VBA place-t-il 10 avant 2 ?
Parce que ces nombres sont stockés comme du texte, et le texte se trie lexicalement (« 1 », « 10 »,
« 2 ») plutôt que numériquement. Convertissez la colonne en vrais nombres avant de trier — voir le
guide de conversion CStr/Val — et les valeurs se trieront dans le véritable ordre numérique.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 08/08/2026.
Guides associés : VBA Find · VBA AutoFilter · VBA CStr, CDate and Val · VBA Delete Rows · VBA Range
