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"
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
- En partant de Range("A2") (ORD1001), utilisez
Offsetpour afficher le Produit et le Total de la commande située deux lignes en dessous (ORD1003) — sans jamais saisir "A4", "D4" ou "H4". - Utilisez ensemble
CurrentRegion,OffsetetResizepour sélectionner uniquement les lignes de données (sans l’en-tête) et afficher le nombre de lignes de cette plage. - Créez une plage nommée appelée
OrdersDatacouvrant 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.
1. Utilisation de Offset depuis A2 pour atteindre ORD1003
- Définir une variable
RangesurA2— 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
CurrentRegionsurA1fournit 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.Resizedoit 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 unName:=et unRefersTo:=— 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.
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
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
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"
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
- En partant de Range("A2") (ORD1001), utilisez
Offsetpour afficher le Produit et le Total de la commande située deux lignes en dessous (ORD1003) — sans jamais saisir "A4", "D4" ou "H4". - Utilisez ensemble
CurrentRegion,OffsetetResizepour sélectionner uniquement les lignes de données (sans l’en-tête) et afficher le nombre de lignes de cette plage. - Créez une plage nommée appelée
OrdersDatacouvrant 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.
1. Utilisation de Offset depuis A2 pour atteindre ORD1003
- Définir une variable
RangesurA2— 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
CurrentRegionsurA1fournit 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.Resizedoit 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 unName:=et unRefersTo:=— 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.
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
Merci pour vos commentaires !