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

VBA Clear dans Excel — ClearContents contre Clear contre Delete, et le piège de la chaîne vide

|

VBA Clear dans Excel — ClearContents contre Clear contre Delete, et le piège de la chaîne vide

TL;DR — Il n'existe pas de « effacer une cellule » unique. .ClearContents efface la valeur et la formule mais garde la mise en forme — celle que vous voulez quatre-vingt-dix pour cent du temps. .Clear efface tout, formats et bordures compris, réservez-le donc à la remise d'une cellule à l'état vierge d'usine. .ClearFormats efface la mise en forme et garde les valeurs. Affecter cell.Value = "" n'est pas vide — cela laisse une chaîne de longueur nulle que ISBLANK lit comme non vide. Et .Clear n'est pas .Delete : Clear vide la cellule sur place, Delete la retire et décale ses voisines.

Range("A2:Z1000").ClearContents   ' donnees effacees, modele (bordures/couleurs/formats) garde
Range("A2:Z1000").Clear           ' TOUT efface - vous devez maintenant refaire la mise en forme
Range("A2:Z1000").ClearFormats    ' mise en forme effacee, valeurs gardees

Range("A2").Value = ""            ' PAS vide - une chaine vide ; ISBLANK vaut False
Range("A2").ClearContents         ' vraiment vide

Tout le monde apprend d'abord .ClearContents, puis se demande pourquoi .Clear « a supprimé mes bordures », pourquoi une cellule « vide » fait quand même trébucher un COUNTA, ou pourquoi effacer une plage a cassé des formules trois colonnes plus loin. Tout cela vient d'une seule idée à retenir : une cellule est un empilement de couches indépendantes, et effacer, c'est choisir quelles couches supprimer. Choisissez la gomme qui correspond à la couche que vous visez, et les surprises disparaissent.

Ce que vous allez apprendre

  • Le modèle mental — une cellule est faite de couches, et effacer choisit quelles couches supprimer
  • .ClearContents contre .Clear contre .ClearFormats
  • Pourquoi cell.Value = "" est un faux vide, et ce qui vide vraiment une cellule
  • Pourquoi .Clear et .Delete sont des opérations différentes, pas des synonymes
  • Effacer toute une feuille ou une used range en un seul appel rapide

Le modèle mental : une cellule est faite de couches, effacer choisit lesquelles supprimer

Une cellule n'est pas une chose unique. Elle contient une valeur ou formule, un format de nombre, une police et un remplissage, des bordures, une mise en forme conditionnelle, une validation de données et des commentaires — des couches indépendantes empilées dans la même cellule. Il n'existe aucune méthode nommée « clear » ; il existe une famille de méthodes, chacune retirant un sous-ensemble choisi :

Range("A1").ClearContents   ' retire : valeur/formule        garde : tout le reste
Range("A1").ClearFormats    ' retire : format de nombre, police, remplissage, bordures   garde : valeur
Range("A1").Clear           ' retire : TOUT ce qui precede

Une fois que vous voyez les couches, les noms de méthode disent exactement ce qu'ils font. La question n'est jamais « comment effacer cette cellule » — c'est « quelles couches je veux voir disparaître », et la réponse choisit la méthode.

ClearContents contre Clear contre ClearFormats

.ClearContents est le cheval de trait : effacer les données, garder le modèle. Elle retire les valeurs et les formules et laisse intacts les bordures, les couleurs, les formats de nombre et la validation — c'est exactement ce que signifie « effacer les chiffres du mois dernier pour saisir ceux de ce mois-ci » :

Range("B2:B50").ClearContents   ' chiffres effaces, le tableau mis en forme ressemble toujours a un tableau

.Clear est la masse : elle retire le contenu et toutes les couches de mise en forme — bordures, remplissages, mise en forme conditionnelle, validation de données, commentaires. C'est le dégât accidentel numéro un en VBA : recourir à .Clear pour « vider » une plage mise en forme et découvrir que les bordures et les couleurs que vous aviez bâties ont disparu elles aussi.

Range("B2:B50").Clear           ' maintenant B2:B50 est vide ET sans mise en forme - tout a refaire

N'utilisez .Clear que lorsque vous voulez vraiment dire « remettre ces cellules à un état neuf, sans mise en forme ». .ClearFormats est l'outil chirurgical inverse — retirer la mise en forme, garder les valeurs — et il a des cousins ciblés pour une seule couche : .ClearComments, .ClearHyperlinks, .ClearNotes, .ClearOutline. Choisissez la couche, choisissez la méthode.

Le piège de la chaîne vide : elle n'est pas vide

C'est le piège silencieux. Affecter une chaîne vide ne vide pas une cellule — cela stocke une chaîne de longueur nulle, qui est une valeur, pas une absence de valeur :

Range("A1").Value = ""          ' A1 contient maintenant une CHAINE de longueur nulle
' ISBLANK(A1) vaut False ; COUNTA compte A1 ; IsEmpty(Range("A1")) vaut False
Range("A1").ClearContents       ' A1 est maintenant reellement vide
' ISBLANK(A1) vaut True ; COUNTA ignore A1 ; IsEmpty(Range("A1")) vaut True

Une cellule mise à "" paraît vide à l'écran mais se comporte comme remplie : COUNTA la compte, ISBLANK et IsEmpty la signalent comme non vide, Range.End(xlUp) s'arrête dessus, et les graphiques comme les tableaux croisés dynamiques la traitent comme une donnée. Cela produit ces bugs exaspérants du genre « la cellule est vide mais Excel n'est pas d'accord ». Pour vider une cellule, utilisez .ClearContents (ou affectez Empty : Range("A1").Value = Empty), jamais = "". La distinction entre une cellule réellement vide et une chaîne vide est l'une des choses les plus utiles à intégrer ; voir VBA Cell Value pour la façon dont les valeurs se relisent.

Clear n'est pas Delete : le décalage qui casse les adresses

.Clear et .Delete sonnent comme des synonymes, et n'en sont pas. .Clear vide la cellule mais la laisse là où elle est. .Delete retire entièrement la cellule et décale ses voisines vers le haut ou vers la gauche pour combler le trou — si bien que chaque adresse en dessous ou à droite de la suppression change, et les formules pointant vers les cellules déplacées peuvent se casser ou renvoyer #REF!.

Range("A5").ClearContents   ' A5 est vide ; A6, A7, ... restent en place
Range("A5").Delete Shift:=xlUp   ' A5 a DISPARU ; A6 devient A5, A7 devient A6, les adresses se decalent

Si votre but est « rendre cette cellule vide », c'est toujours .ClearContents — jamais .Delete. Ne recourez à .Delete que lorsque vous voulez réellement faire disparaître la cellule, la ligne ou la colonne et que le décalage est le but recherché, comme supprimer des lignes vides. Faire une suppression de lignes en toute sécurité (boucler de bas en haut, utiliser EntireRow) est un sujet à part entière ; voir VBA Delete Rows. Confondre les deux, c'est ainsi qu'une macro de « nettoyage » brouille une feuille en silence.

Effacer toute une feuille ou une used range en un seul appel

Effacer est une opération de plage, alors faites-le en un seul appel, pas dans une boucle cellule par cellule. Une boucle franchit la frontière de VBA vers Excel à chaque cellule et rame sur les grandes plages ; un seul appel sur toute la plage est une opération unique (le même principe d'aller-retour que pour la lecture des valeurs — voir VBA Cell Value) :

ws.UsedRange.ClearContents               ' efface toutes les donnees de la feuille, garde les formats
ws.Cells.Clear                           ' efface toute la feuille, contenu et formats
Range("A2", Range("A2").End(xlDown)).ClearContents  ' efface une colonne de donnees sous un en-tete

UsedRange et CurrentRegion visent « tout ce qui contient des données » sans coder en dur une hauteur de plage ; voir VBA UsedRange. Ma règle empirique : prenez .ClearContents par défaut. .Clear est une remise à l'état d'usine, pas une gomme ; .Delete est de la chirurgie structurelle, pas une gomme ; = "" est un bug de faux vide. Neuf fois sur dix, le verbe que vous voulez est .ClearContents, et la dixième, c'est .ClearFormats.

Comment ExcelMaster aide

Les erreurs d'effacement qui coûtent vraiment du temps sont discrètes : le .Clear qui a emporté les bordures du modèle avec lui, le « vide » de = "" qu'un COUNTA en aval a continué de compter, le .Delete qui a décalé une colonne et cassé des formules deux feuilles plus loin. Chacune fait quelque chose — juste pas ce que vous vouliez.

ExcelMaster saisit la gomme qui correspond à votre intention. Demandez-lui d'« effacer les données mais garder la disposition » et il utilise .ClearContents sur la used range ; demandez-lui de « réinitialiser complètement cette feuille » et il utilise .Clear. Il vide les cellules avec .ClearContents plutôt qu'avec = "", pour que vos vides soient réellement vides, et il réserve .Delete aux moments où vous voulez vraiment retirer des lignes — de bas en haut pour que rien ne se décale en dessous. Vous dites ce qui doit disparaître ; il choisit la méthode qui laisse le reste de la cellule intact.

Questions fréquentes

Quelle est la différence entre Clear et ClearContents en VBA ?

.ClearContents ne retire que les valeurs et les formules, en gardant la mise en forme, les bordures, les formats de nombre et la validation. .Clear retire tout — le contenu et toutes les couches de mise en forme. Utilisez .ClearContents pour effacer les données tout en gardant un modèle intact, et .Clear uniquement quand vous voulez remettre les cellules à un état complètement vide et sans mise en forme.

Comment effacer le contenu d'une cellule mais garder la mise en forme en VBA ?

Utilisez .ClearContents : Range("B2:B50").ClearContents retire les valeurs et les formules tout en laissant en place les bordures, les couleurs, les formats de nombre et la validation de données. Évitez .Clear, qui retire aussi toute cette mise en forme, et évitez = "", qui laisse une chaîne de longueur nulle plutôt qu'une cellule réellement vide.

Affecter une chaîne vide à une cellule revient-il à l'effacer en VBA ?

Non. Range("A1").Value = "" stocke une chaîne de longueur nulle, qui est une valeur : ISBLANK renvoie False, COUNTA compte la cellule, et IsEmpty la signale comme non vide. Pour rendre une cellule réellement vide, utilisez Range("A1").ClearContents ou Range("A1").Value = Empty. La cellule à chaîne vide paraît vide mais se comporte comme remplie.

Quelle est la différence entre Clear et Delete en VBA ?

.Clear (et .ClearContents) vide une cellule mais la laisse en place, si bien que les adresses environnantes ne changent pas. .Delete retire entièrement la cellule et décale les cellules voisines vers le haut ou vers la gauche pour combler le vide, ce qui change chaque adresse en dessous ou à droite et peut casser des formules avec #REF!. Utilisez .ClearContents pour vider une cellule et .Delete uniquement quand vous voulez la faire disparaître.

Comment effacer une feuille entière ou une used range en VBA ?

Pour effacer toutes les données mais garder la mise en forme, utilisez ws.UsedRange.ClearContents. Pour effacer toute la feuille, formats compris, utilisez ws.Cells.Clear. Les deux agissent en un seul appel, ce qui est bien plus rapide qu'une boucle cellule par cellule, et UsedRange vise exactement la région qui contient des données sans coder en dur une taille de plage.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 01/09/2026.

Guides connexes : VBA Cell Value · VBA Delete Rows · VBA Copy Paste · VBA UsedRange · VBA Number Format