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

VBA Range dans Excel — référencer, lire et écrire des cellules (8 exemples)

|

VBA Range dans Excel — référencer, lire et écrire des cellules (8 exemples)

Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 05/06/2026

En brefRange 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

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.