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

VBA CurrentRegion dans Excel — saisir tout le bloc de données en une ligne (et ce qu'une ligne vide lui fait)

|

VBA CurrentRegion dans Excel — saisir tout le bloc de données en une ligne (et ce qu'une ligne vide lui fait)

TL;DRCurrentRegion est 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électionne Ctrl+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 avec Offset et Resize.

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 CurrentRegion inclut l'en-tête, et comment le retirer
  • En quoi il diffère d'UsedRange et de End(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) ; employez CurrentRegion quand 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