Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Travail avec les Plages | Travail Avec Les Données Excel
VBA Excel Pour l'Automatisation des Entreprises

Travail avec les Plages

Glissez pour afficher le menu

Sélection de plages

À utiliser lors de l'exploration ; dans le code de production, il est préférable d'éviter .Select et de référencer directement les plages :

ws.Range("A1:I1").Select        ' fine for exploring
ws.Range("A1:I1").Font.Bold = True    ' better — skips Select entirely

Décalage (Offset)

Déplace une référence par rapport à elle-même — à lire comme (lignes vers le bas, colonnes vers la droite), les nombres négatifs déplaçant vers le haut ou la gauche :

Dim orderCell As Range
Set orderCell = ws.Range("A2")             ' ORD1001
Debug.Print orderCell.Offset(1, 0).Value    ' one row down → ORD1002
Debug.Print orderCell.Offset(0, 2).Value    ' two columns right → Acme Corp
Debug.Print orderCell.Offset(-1, 0).Value   ' one row up → the header, "Order ID"
Figure 3.3

Redimensionner

Modifie le nombre de lignes ou de colonnes couvertes par une plage, en gardant son coin supérieur gauche fixe :

Dim headerRow As Range
Set headerRow = ws.Range("A1")
Set headerRow = headerRow.Resize(1, 9)    ' now covers A1:I1, the full header

Combinez Offset et Resize pour récupérer « tout ce qui se trouve sous l’en-tête » sans connaître à l’avance le nombre de lignes :

Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
' dataRange now covers A2:I6 — every order, no header

Plages nommées

Attribuez à une plage un nom explicite que vous pouvez utiliser à la place d’une adresse :

ThisWorkbook.Names.Add Name:="OrdersTable", RefersTo:=ws.Range("A1:I6")
Debug.Print ws.Range("OrdersTable").Rows.Count

Exercice

  1. En partant de Range("A2") (ORD1001), utilisez Offset pour afficher le Produit et le Total de la commande située deux lignes en dessous (ORD1003) — sans jamais saisir "A4", "D4" ou "H4".
  2. Utilisez ensemble CurrentRegion, Offset et Resize pour sélectionner uniquement les lignes de données (sans l’en-tête) et afficher le nombre de lignes de cette plage.
  3. Créez une plage nommée appelée OrdersData couvrant la même plage de données uniquement et vérifiez que vous pouvez la référencer par son nom dans la fenêtre Exécution immédiate.
Astuce
expand arrow

1. Utilisation de Offset depuis A2 pour atteindre ORD1003

  • Définir une variable Range sur A2 — c'est la cellule d'ancrage, exactement comme dans l'exemple traité du chapitre.
  • "Deux lignes en dessous" et "même colonne" signifie que le premier argument de Offset (lignes) est 2 et le second (colonnes) est 0 — pour la colonne Product.
  • Total est une colonne différente mais la même ligne — donc seul le numéro de décalage de colonne change entre vos deux appels à Offset, pas celui de la ligne.
  • Compter les colonnes à partir de la position de A2 : Product est à 3 colonnes à droite de Order ID ; Total est à 7 colonnes à droite.

2. Combinaison de CurrentRegion, Offset et Resize

  • CurrentRegion sur A1 fournit l'ensemble du tableau, en incluant l'en-tête.
  • Offset(1, 0) décale tout ce bloc d'une ligne vers le bas — ce qui permet de supprimer l'en-tête en haut.
  • Resize doit réduire le nombre de lignes exactement du même montant que le décalage, sinon la bordure inférieure dépassera d'une ligne les vraies données.

3. Création et test d'une plage nommée

  • Les plages nommées sont ajoutées via ThisWorkbook.Names.Add, en lui donnant un Name:= et un RefersTo:= — vous pouvez réutiliser l'expression de plage exacte de l'astuce 2 au lieu de la reconstruire depuis le début.
  • Pour la référencer ensuite, utilisez Range("OrdersData") — le nom devient une simple chaîne de caractères, pas une variable.
Solution
expand arrow
Sub NavigateWithoutHardcoding()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Orders")

    ' --- 1. Offset from A2 to reach ORD1003 ---
    Dim orderCell As Range
    Set orderCell = ws.Range("A2")

    Debug.Print orderCell.Offset(2, 3).Value   ' Product
    Debug.Print orderCell.Offset(2, 7).Value   ' Total

    ' --- 2. CurrentRegion + Offset + Resize ---
    Dim dataRange As Range
    Set dataRange = ws.Range("A1").CurrentRegion
    Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)

    Debug.Print "Data rows: " & dataRange.Rows.Count

    ' --- 3. Named range ---
    ThisWorkbook.Names.Add Name:="OrdersData", RefersTo:=dataRange
End Sub

Exécuter la Sub (F5), puis dans la fenêtre Exécution immédiate (Ctrl+G) taper :

?Range("OrdersData").Rows.Count
Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 3. Chapitre 3

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Travail avec les Plages

Sélection de plages

À utiliser lors de l'exploration ; dans le code de production, il est préférable d'éviter .Select et de référencer directement les plages :

ws.Range("A1:I1").Select        ' fine for exploring
ws.Range("A1:I1").Font.Bold = True    ' better — skips Select entirely

Décalage (Offset)

Déplace une référence par rapport à elle-même — à lire comme (lignes vers le bas, colonnes vers la droite), les nombres négatifs déplaçant vers le haut ou la gauche :

Dim orderCell As Range
Set orderCell = ws.Range("A2")             ' ORD1001
Debug.Print orderCell.Offset(1, 0).Value    ' one row down → ORD1002
Debug.Print orderCell.Offset(0, 2).Value    ' two columns right → Acme Corp
Debug.Print orderCell.Offset(-1, 0).Value   ' one row up → the header, "Order ID"
Figure 3.3

Redimensionner

Modifie le nombre de lignes ou de colonnes couvertes par une plage, en gardant son coin supérieur gauche fixe :

Dim headerRow As Range
Set headerRow = ws.Range("A1")
Set headerRow = headerRow.Resize(1, 9)    ' now covers A1:I1, the full header

Combinez Offset et Resize pour récupérer « tout ce qui se trouve sous l’en-tête » sans connaître à l’avance le nombre de lignes :

Dim dataRange As Range
Set dataRange = ws.Range("A1").CurrentRegion
Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)
' dataRange now covers A2:I6 — every order, no header

Plages nommées

Attribuez à une plage un nom explicite que vous pouvez utiliser à la place d’une adresse :

ThisWorkbook.Names.Add Name:="OrdersTable", RefersTo:=ws.Range("A1:I6")
Debug.Print ws.Range("OrdersTable").Rows.Count

Exercice

  1. En partant de Range("A2") (ORD1001), utilisez Offset pour afficher le Produit et le Total de la commande située deux lignes en dessous (ORD1003) — sans jamais saisir "A4", "D4" ou "H4".
  2. Utilisez ensemble CurrentRegion, Offset et Resize pour sélectionner uniquement les lignes de données (sans l’en-tête) et afficher le nombre de lignes de cette plage.
  3. Créez une plage nommée appelée OrdersData couvrant la même plage de données uniquement et vérifiez que vous pouvez la référencer par son nom dans la fenêtre Exécution immédiate.
Astuce
expand arrow

1. Utilisation de Offset depuis A2 pour atteindre ORD1003

  • Définir une variable Range sur A2 — c'est la cellule d'ancrage, exactement comme dans l'exemple traité du chapitre.
  • "Deux lignes en dessous" et "même colonne" signifie que le premier argument de Offset (lignes) est 2 et le second (colonnes) est 0 — pour la colonne Product.
  • Total est une colonne différente mais la même ligne — donc seul le numéro de décalage de colonne change entre vos deux appels à Offset, pas celui de la ligne.
  • Compter les colonnes à partir de la position de A2 : Product est à 3 colonnes à droite de Order ID ; Total est à 7 colonnes à droite.

2. Combinaison de CurrentRegion, Offset et Resize

  • CurrentRegion sur A1 fournit l'ensemble du tableau, en incluant l'en-tête.
  • Offset(1, 0) décale tout ce bloc d'une ligne vers le bas — ce qui permet de supprimer l'en-tête en haut.
  • Resize doit réduire le nombre de lignes exactement du même montant que le décalage, sinon la bordure inférieure dépassera d'une ligne les vraies données.

3. Création et test d'une plage nommée

  • Les plages nommées sont ajoutées via ThisWorkbook.Names.Add, en lui donnant un Name:= et un RefersTo:= — vous pouvez réutiliser l'expression de plage exacte de l'astuce 2 au lieu de la reconstruire depuis le début.
  • Pour la référencer ensuite, utilisez Range("OrdersData") — le nom devient une simple chaîne de caractères, pas une variable.
Solution
expand arrow
Sub NavigateWithoutHardcoding()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Orders")

    ' --- 1. Offset from A2 to reach ORD1003 ---
    Dim orderCell As Range
    Set orderCell = ws.Range("A2")

    Debug.Print orderCell.Offset(2, 3).Value   ' Product
    Debug.Print orderCell.Offset(2, 7).Value   ' Total

    ' --- 2. CurrentRegion + Offset + Resize ---
    Dim dataRange As Range
    Set dataRange = ws.Range("A1").CurrentRegion
    Set dataRange = dataRange.Offset(1, 0).Resize(dataRange.Rows.Count - 1)

    Debug.Print "Data rows: " & dataRange.Rows.Count

    ' --- 3. Named range ---
    ThisWorkbook.Names.Add Name:="OrdersData", RefersTo:=dataRange
End Sub

Exécuter la Sub (F5), puis dans la fenêtre Exécution immédiate (Ctrl+G) taper :

?Range("OrdersData").Rows.Count
Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 3. Chapitre 3
some-alt