🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Sort dans Excel — Range.Sort vs l'objet Sort (et comment retrouver l'ordre d'origine)

|

VBA Sort dans Excel — Range.Sort vs l'objet Sort (et comment retrouver l'ordre d'origine)

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 .Sort dé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 toujours Header:=xlYes, sinon Excel risque de trier votre ligne de titres dans les données. Et triez un enregistrement complet — le tableau entier via CurrentRegion, 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ées
  • Range.Sort (rapide, limité à 3 clés) vs l'objet Sort (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