TL;DR —
CurrentRegionest le bloc contigu de cellules autour d'une cellule. Excel part de votre cellule et s'étend vers l'extérieur jusqu'à rencontrer une ligne entièrement vide et une colonne entièrement vide, renvoyant le plus petit rectangle qui enferme cet îlot ininterrompu — la même chose que sélectionneCtrl+Maj+*. Vous ne calculez pas les bords ; Excel les trouve. Le piège : une seule ligne ou colonne entièrement vide forme un mur qui scinde le bloc en silence, si bien que vous pouvez obtenir la moitié de vos données sans aucune erreur. Il inclut aussi la ligne d'en-tête — retirez-la avecOffsetetResize.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Data")
Dim block As Range
Set block = ws.Range("A1").CurrentRegion ' tout le tableau autour de A1, en-tete compris
' Donnees seules - passer sous l'en-tete, reduire la hauteur d'une unite :
Dim body As Range
Set body = block.Offset(1, 0).Resize(block.Rows.Count - 1, block.Columns.Count)
CurrentRegion est l'antidote au codage en dur de "A1:D100". Au lieu de calculer où s'arrêtent les
données, vous demandez à Excel de vous remettre le bloc qu'il voit déjà. Ce guide s'articule autour de
la seule idée qui le rend fiable : CurrentRegion se définit par des bords vides, il n'est donc
fiable que dans la mesure où vos données sont propres. Une fois cette idée acquise, sa force (une
ligne saisit le tableau) comme son mode d'échec (une ligne vide le coupe en deux) découlent de la
même règle.
Ce que vous allez apprendre
- Le modèle mental — Excel s'étend de votre cellule jusqu'aux bords vides
- La règle la plus importante — une ligne ou une colonne entièrement vide forme un mur
- Pourquoi
CurrentRegioninclut l'en-tête, et comment le retirer - En quoi il diffère d'
UsedRangeet deEnd(xlUp) - Saisir le bloc une seule fois, depuis n'importe quelle cellule qu'il contient
- Quand faire confiance à
CurrentRegion— et quand utiliser plutôt un vrai tableau
Le modèle mental : Excel s'étend jusqu'aux bords vides
CurrentRegion répond à la question « quel est le bloc de données autour de cette cellule ? ». Excel
commence à la cellule que vous nommez et fait grandir le rectangle vers l'extérieur dans toutes les
directions, s'arrêtant seulement quand une ligne entière et une colonne entière de cellules vides le
referment :
' Si A1:D101 est un tableau plein entoure de cellules vides, ceci vaut A1:D101 :
Set block = ws.Range("A1").CurrentRegion
C'est la version en code du clic à l'intérieur d'un tableau suivi de l'appui sur Ctrl+Maj+* (ou
Ctrl+A une fois) — Excel sélectionne l'îlot sur lequel vous vous tenez. La conséquence majeure,
c'est que les limites sont découvertes, non déclarées : vous n'écrivez jamais la dernière ligne ni
la dernière colonne, si bien que la référence s'ajuste automatiquement à des données qui ont grandi ou
rétréci depuis votre dernier regard. C'est tout l'attrait, et la règle suivante en est le prix.
La règle la plus importante : une ligne ou une colonne vide forme un mur
Parce que le bloc est délimité par le vide, une seule ligne ou colonne entièrement vide l'arrête
net. Une ligne vide au milieu de vos données et CurrentRegion ne renvoie que la partie
au-dessus — en silence, sans aucune erreur :
' Lignes 1-50 remplies, ligne 51 entierement vide, lignes 52-100 remplies :
Set block = ws.Range("A1").CurrentRegion ' ne renvoie que A1:D50 - la moitie du bas est perdue
L'inverse mord aussi : une valeur égarée à un intervalle de distance se fait aspirer, gonflant la
région au-delà de vos vraies données. Ce qui ne le casse pas, c'est une seule cellule vide à
l'intérieur du bloc — une valeur manquante dans une ligne ne pose pas de problème ; seule une ligne ou
une colonne entièrement vide fait office de mur. Ainsi CurrentRegion convient parfaitement aux
tableaux propres et pleins, et pas du tout aux feuilles présentant des trous de sous-totaux, des
lignes d'espacement ou des colonnes de séparation vides. Quand le bloc revient de la mauvaise taille,
cherchez des cellules vides intérieures avant de soupçonner quoi que ce soit d'autre.
CurrentRegion inclut l'en-tête — le retirer
CurrentRegion renvoie la ligne d'en-tête en même temps que les données, ce qui est la première
raison pour laquelle une boucle « a traité le titre comme un enregistrement ». Pour obtenir le corps
des données, passez au-delà de la première ligne et raccourcissez la hauteur d'une unité — exactement
la paire Offset + Resize du reste de ce groupe :
Dim block As Range: Set block = ws.Range("A1").CurrentRegion
Dim body As Range
Set body = block.Offset(1, 0).Resize(block.Rows.Count - 1, block.Columns.Count)
' body exclut desormais l'en-tete ; parcourez-le ou lisez-le comme un tableau.
Offset(1, 0) fait glisser toute la référence d'une ligne vers le bas ;
Resize rogne ensuite la hauteur d'une unité pour qu'elle ne déborde pas sous
le bas. C'est là le gain de ce groupe : CurrentRegion détecte le bloc, Offset et Resize en
découpent la partie que vous voulez vraiment.
CurrentRegion contre UsedRange contre End(xlUp)
Trois outils prétendent « trouver les données », et se tromper de choix est une cause fréquente de plages trop grandes ou trop petites :
CurrentRegion— le bloc contigu autour d'une cellule. C'est généralement ce que vous voulez : il suit l'îlot réel de données et ignore les valeurs égarées lointaines (tant qu'il y a un espace vide entre elles).UsedRange— tout ce qu'Excel croit avoir été touché, y compris les cellules mises en forme mais vides et celles dont vous avez effacé les valeurs sans réinitialiser. Il surestime régulièrement, renvoyant une plage bien plus grande que vos données (voir VBA UsedRange).End(xlUp)/ dernière ligne — trouve un seul bord, le bas d'une colonne. Employez-le quand tout ce qu'il vous faut est le nombre de lignes (voir VBA Last Row) ; employezCurrentRegionquand vous voulez tout le rectangle en un seul appel.
Règle empirique : recourez à CurrentRegion pour saisir le bloc, à End(xlUp) pour mesurer une
dimension, et évitez de vous appuyer sur UsedRange pour l'étendue des données, car il ment après des
modifications.
Saisissez-le une fois, depuis n'importe quelle cellule du bloc
CurrentRegion fonctionne depuis n'importe quelle cellule à l'intérieur de l'îlot, pas seulement
celle en haut à gauche — c'est pourquoi ActiveCell.CurrentRegion saisit le tableau dans lequel se
trouve l'utilisateur :
Set block = ActiveCell.CurrentRegion ' le tableau autour de l'endroit ou est le curseur
Il est aussi réévalué à chaque appel, alors stockez-le une fois et réutilisez la variable plutôt
que d'appeler .CurrentRegion de façon répétée :
Dim block As Range: Set block = ws.Range("A1").CurrentRegion
Debug.Print block.Rows.Count, block.Columns.Count ' reutiliser block, ne pas redetecter
Si la feuille change après que vous l'avez capturé, relisez-le — la variable est un instantané du bloc tel qu'il était au moment de l'appel, pas une référence vivante qui grandit d'elle-même.
Quand lui faire confiance — et quand utiliser un tableau
CurrentRegion est le bon choix par défaut pour « agir sur le tableau qui est ici », mais seulement
quand vos données ont des bords propres : aucune ligne ni colonne vide à l'intérieur, aucune
valeur égarée à un intervalle de distance. Sur les feuilles conçues pour des humains — trous de
sous-totaux, lignes d'espacement entre les sections, colonnes vides pour l'esthétique — il renverra en
silence le mauvais rectangle. Quand votre disposition en comporte, ne colmatez pas avec de la
détection de cellules vides ; donnez aux données une vraie forme. Convertissez le bloc en un
tableau Excel (ListObject), dont le .DataBodyRange se définit par la structure, et non par
l'endroit où tombent les cellules vides, et qui grandit automatiquement à mesure que des lignes sont
ajoutées. Comme pour VBA Range, la forme doit vivre dans les données —
CurrentRegion lit une forme que des données propres possèdent déjà ; un tableau la garantit.
Comment ExcelMaster aide
CurrentRegion concentre plusieurs échecs silencieux dans un seul appel commode : une ligne vide qui
coupe le bloc en deux, une ligne d'en-tête emportée dans les données, une valeur égarée qui gonfle la
plage, et le choix entre lui, UsedRange et End(xlUp) qui décide si vous obtenez trop ou trop peu.
Aucun d'eux ne déclenche d'erreur — vous traitez simplement les mauvaises cellules.
ExcelMaster vous laisse
plutôt décrire le résultat. Dites « lis le tableau de données de cette feuille, sans l'en-tête », et
il saisit le bloc, vérifie l'absence de cellules vides intérieures qui le tronqueraient, retire
l'en-tête avec Offset et Resize, et vous rend le corps — ou propose un vrai tableau quand la
disposition présente des trous auxquels CurrentRegion ne survit pas. Vous gardez le classeur et le
code ; vous vous épargnez l'exécution où la moitié des lignes a discrètement disparu.
Questions fréquentes
Qu'est-ce que CurrentRegion en VBA Excel ?
CurrentRegion est le bloc contigu de cellules autour d'une cellule donnée — le rectangle jusqu'auquel
Excel s'étend jusqu'à rencontrer une ligne entièrement vide et une colonne entièrement vide.
Range("A1").CurrentRegion renvoie ce bloc entier, en-tête compris. C'est l'équivalent en code de
l'appui sur Ctrl+Maj+* à l'intérieur d'un tableau, et cela vous permet de référencer des données
sans calculer la dernière ligne ou colonne.
Pourquoi CurrentRegion s'arrête-t-il à une ligne vide ?
Parce que le bloc est délimité par le vide. Une ligne ou une colonne entièrement vide fait office
de mur, si bien qu'Excel cesse de s'étendre là et ne renvoie que la partie de votre côté de l'espace
vide — en silence, sans aucune erreur. Une seule cellule vide dans une ligne ne le casse pas ;
seule une ligne ou une colonne entièrement vide le fait. Supprimez les lignes et colonnes vides
intérieures si vous voulez que CurrentRegion capture tout le tableau.
Quelle est la différence entre CurrentRegion et UsedRange ?
CurrentRegion est le bloc contigu autour d'une cellule précise et suit vos données réelles.
UsedRange est tout ce qu'Excel croit avoir été utilisé sur la feuille, y compris les cellules mises
en forme mais vides et celles effacées sans réinitialisation — il surestime souvent et renvoie une
plage plus grande que les données. Employez CurrentRegion (ou un tableau) pour obtenir le vrai bloc
de données ; traitez UsedRange comme une borne supérieure, pas comme une étendue exacte.
Comment exclure la ligne d'en-tête de CurrentRegion ?
Décalez le bloc d'une ligne vers le bas et réduisez sa hauteur d'une unité :
block.Offset(1, 0).Resize(block.Rows.Count - 1, block.Columns.Count). Offset(1, 0) déplace la
référence au-delà de l'en-tête, et Resize rogne la dernière ligne pour que le résultat ne déborde
pas sous les données. Protégez le cas où le bloc se réduit à une ligne d'en-tête, qui donnerait un
redimensionnement à zéro ligne.
Puis-je utiliser CurrentRegion depuis n'importe quelle cellule du tableau ?
Oui. CurrentRegion fonctionne depuis n'importe quelle cellule à l'intérieur du bloc contigu, pas
seulement celle en haut à gauche, si bien que ActiveCell.CurrentRegion renvoie le tableau dans
lequel se trouve le curseur. Il est réévalué à chaque appel, alors stockez le résultat dans une
variable et réutilisez-le plutôt que d'appeler .CurrentRegion de façon répétée, et relisez-le si la
feuille change.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 15/08/2026.
Guides associés : VBA Resize · VBA Offset · VBA Cells · VBA Used Range · VBA Last Row
