Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 05/06/2026
En bref — Range est l'objet qui désigne une ou plusieurs cellules. On le lit avec .Value et on l'écrit de la même façon. Pas besoin de .Select :
Sub BasesRange()
' LIRE une seule cellule
Dim quantite As Long
quantite = Range("B2").Value
' ÉCRIRE une seule cellule
Range("C2").Value = quantite * 1.1
' ÉCRIRE un bloc entier d'un coup (sans boucle)
Range("A1:C1").Value = Array("Produit", "Quantité", "Prix")
End Sub
Tout le reste — Cells, End, CurrentRegion, Resize — n'est qu'une autre manière d'indiquer à Range les cellules visées. Ce guide présente les huit que vous utiliserez vraiment.
Tous les exemples supposent un petit tableau dans Feuil1 : en-têtes Produit / Quantité / Prix en A1:C1, données à partir de la ligne 2.
Ce qu'est réellement l'objet Range
Range est l'objet le plus utilisé d'Excel VBA. Il représente une cellule, un bloc de cellules, une ligne ou une colonne entière, voire plusieurs blocs disjoints. Presque tout ce que vous faites — lire une valeur, écrire une formule, changer une couleur, copier, trier — est une méthode ou une propriété appelée sur un Range.
Range("A2").Value = "Widget" ' propriété d'une cellule
Range("A2:C2").Interior.Color = vbYellow ' propriété de trois cellules
Range("A:A").Columns.AutoFit ' propriété d'une colonne entière
Exemple 1 — Range contre Cells (lequel choisir)
Les deux désignent des cellules. La différence tient à la façon de les adresser.
| Idéal pour | Syntaxe | |
|---|---|---|
Range("A2") |
Une adresse fixe et lisible | adresse texte, comme la zone Nom |
Cells(2, 1) |
Une position calculée à partir de nombres | Cells(ligne, colonne) — ligne d'abord |
' Ces deux lignes visent la MÊME cellule (ligne 2, colonne 1) :
Range("A2").Value = "Widget"
Cells(2, 1).Value = "Widget"
Utilisez Range quand vous connaissez l'adresse. Utilisez Cells dans les boucles, où la ligne ou la colonne est une variable :
Dim l As Long
For l = 2 To 6
Cells(l, 3).Value = Cells(l, 2).Value * 1.1 ' Prix = Quantité * 1.1
Next l
On peut même les combiner : Range(Cells(2, 1), Cells(6, 3)) construit le bloc A2:C6 à partir de deux cellules d'angle — parfait quand les angles sont calculés.
Exemple 2 — .Value contre .Value2 contre .Text contre .Formula
C'est le piège qui surprend tous les débutants. La même cellule renvoie quatre choses différentes :
' La cellule B2 affiche "1 250,00 €" via la formule =A2*5
Debug.Print Range("B2").Value ' 1250 (un Variant sensible au type Monétaire/Date)
Debug.Print Range("B2").Value2 ' 1250 (un Double brut — le plus rapide)
Debug.Print Range("B2").Text ' "1 250,00 €" (ce que l'utilisateur VOIT, en texte)
Debug.Print Range("B2").Formula ' "=A2*5" (le texte de la formule)
Règles pratiques :
.Value2— pour lire de grandes plages ou faire des calculs. Il saute la conversion Monétaire/Date, donc il est plus rapide et ne vous surprend jamais avec une valeur monétaire arrondie..Text— en quasi lecture seule, renvoie la chaîne affichée. Attention : si la colonne est trop étroite, il renvoie"####"..Formula— lit ou écrit la formule, pas le résultat.
Exemple 3 — Arrêtez d'utiliser .Select (l'anti-modèle n°1)
L'enregistreur de macros met des .Select partout. Les vraies macros, non. Sélectionner est lent, fait clignoter l'écran et casse dès que la mauvaise feuille est active.
' ❌ Style enregistreur — fragile et lent
Range("A2").Select
Selection.Value = "Widget"
' ✅ Agir directement sur le Range
Range("A2").Value = "Widget"
Qualifiez la feuille au lieu de la sélectionner, pour que le code fonctionne quoi qu'il y ait à l'écran :
ThisWorkbook.Worksheets("Feuil1").Range("A2").Value = "Widget"
Exemple 4 — Trouver la dernière ligne (la formule canonique)
Coder en dur A2:A100 casse dès que les données grossissent. Cette ligne trouve la vraie dernière ligne utilisée de la colonne A :
Dim derniereLigne As Long
derniereLigne = Cells(Rows.Count, 1).End(xlUp).Row ' remonter depuis tout en bas
MsgBox "Les données s'arrêtent à la ligne " & derniereLigne
End(xlUp) imite l'appui sur Ctrl + ↑. C'est la façon la plus fiable de dimensionner une plage sur vos données.
Exemple 5 — Plages dynamiques avec CurrentRegion
CurrentRegion saisit tout le bloc contigu autour d'une cellule — exactement ce que sélectionne Ctrl + Maj + flèches. Aucun comptage de lignes :
Dim donnees As Range
Set donnees = Range("A1").CurrentRegion ' tout le tableau, en-têtes compris
MsgBox donnees.Rows.Count & " lignes × " & donnees.Columns.Count & " colonnes"
' Sauter l'en-tête — décaler d'une ligne (Offset), raccourcir d'une (Resize) :
Dim corps As Range
Set corps = donnees.Offset(1, 0).Resize(donnees.Rows.Count - 1)
Offset(lignes, colonnes) déplace une plage ; Resize(lignes, colonnes) change sa taille. Ensemble, ils retirent un en-tête, ajoutent une colonne ou agrandissent un bloc — sans la moindre adresse codée en dur.
Exemple 6 — Parcourir une plage de façon lisible
Quand vous voulez chaque cellule, For Each est plus propre que les calculs d'indice :
Dim cellule As Range
For Each cellule In Range("B2:B6")
If cellule.Value > 100 Then cellule.Interior.Color = vbGreen
Next cellule
Exemple 7 — Lire toute une plage dans un tableau (la méthode rapide)
Voici le secret des pros : toucher la feuille des milliers de fois est lent. Lisez la plage entière en mémoire d'un coup, travaillez là, puis réécrivez une seule fois. Sur 10 000 lignes, c'est la différence entre 8 secondes et 0,1 :
Sub PlageRapide()
Dim arr As Variant
arr = Range("A2:C10000").Value2 ' UNE lecture -> tableau 2D (base 1)
Dim i As Long
For i = 1 To UBound(arr, 1)
arr(i, 3) = arr(i, 2) * 1.1 ' calcul en mémoire, aucune cellule touchée
Next i
Range("A2:C10000").Value2 = arr ' UNE écriture
End Sub
L'astuce arr = UnePlage.Value2 est si importante qu'elle a son propre guide.
Exemple 8 — Plages disjointes et plages nommées
Un Range peut contenir plusieurs blocs disjoints (une Union), et vous pouvez adresser une plage nommée par son nom :
' Deux blocs séparés, colorés ensemble :
Range("A2:A6, C2:C6").Interior.Color = vbCyan
' Une plage nommée "TauxTVA" dans la zone Nom :
Range("TauxTVA").Value = 0.2
Erreurs fréquentes avec Range (et la solution)
| Symptôme | Cause | Solution |
|---|---|---|
| La mauvaise feuille est modifiée | Range(...) sans feuille utilise la feuille active |
Préfixer ThisWorkbook.Worksheets("Feuil1").Range(...) |
Cells(1, 2) vise la mauvaise cellule |
Cells est (ligne, colonne), pas (colonne, ligne) |
Le numéro de ligne vient en premier |
| Boucle atrocement lente | Lire/écrire chaque cellule séparément | Charger dans un tableau (Exemple 7) |
.Text renvoie "####" |
Colonne trop étroite pour la valeur | Lire .Value2 au lieu de .Text |
| La plage s'arrête trop tôt après croissance | A2:A100 codé en dur |
Dimensionner avec End(xlUp) ou CurrentRegion |
Arrêtez la plomberie de Range — décrivez le résultat
Range, Cells, End, Resize — beaucoup de plomberie pour déplacer une colonne de nombres. ExcelMaster Agent vous laisse l'exprimer en français courant — « dans Feuil1, multiplie chaque Quantité de la colonne B par 1,1 et mets le résultat en colonne C, pour autant de lignes qu'il y en a » — et écrit du code sûr qui gère déjà la dernière ligne, l'en-tête et le piège de la feuille active. Essayer gratuitement →
Guides associés
- VBA Array dans Excel — lire une plage 100× plus vite
- VBA Dictionary dans Excel — recherches, dédoublonnage et regroupement
- VBA For dans Excel — 8 exemples concrets
FAQ
Quelle est la différence entre Range et Cells en VBA ?
Les deux désignent des cellules. Range("A2") utilise une adresse texte ; Cells(2, 1) utilise des coordonnées numériques (ligne, colonne) — idéal dans les boucles où la position est variable. Range(Cells(2,1), Cells(6,3)) combine les deux pour bâtir un bloc à partir d'angles calculés.
Faut-il utiliser .Value ou .Value2 en VBA ?
Utilisez .Value2 pour lire de grandes plages et calculer — il renvoie un Double brut, saute la conversion Monétaire/Date et va plus vite. .Value ne sert que si vous voulez explicitement un type Monétaire ou Date.
Comment référencer une plage avec ligne et colonne variables ?
Avec Cells(ligne, colonne) et des variables, ou Range(Cells(l1, c1), Cells(l2, c2)) pour un bloc. Pour la dernière ligne : Cells(Rows.Count, 1).End(xlUp).Row.
Comment référencer un tableau entier sans connaître sa taille ?
Range("A1").CurrentRegion renvoie tout le bloc contigu. Pour retirer l'en-tête : .Offset(1, 0).Resize(.Rows.Count - 1).
Pourquoi éviter .Select en VBA ?
.Select est lent, fait clignoter l'écran et dépend de la bonne feuille active. Agissez directement sur la plage — Range("A2").Value = "x" — et qualifiez-la avec la feuille.
