I. Objectifs▲
Suite à une question sur le forum Excel VBA, j’explique ici les différences entre deux syntaxes VBA qui, bien que similaires tant sur la forme que sur les objectifs, amènent à des résultats parfois surprenants.
I-A. Prérequis▲
Il n’y a pas vraiment de prérequis, à part avoir déjà pianoté du VBA pour Excel
II. A quoi ça sert ?▲
Il faut noter que, quelle que soit la méthode utilisée, la plage d’arrivée doit être valide, c’est-à-dire qu’elle doit être contenue dans les limites de la feuille. Un décalage vers le haut lorsque vous êtes sur la première ligne produira évidemment une erreur à l’exécution.
III. Offset▲
III-A. Syntaxe▲
Plage.Offset([lignes],[colonnes]) => renvoie un objet Range
On remarque que les indices de décalage sont optionnels :
- Plage.Offset ou Plage.Offset() renvoient Plage ;
- Plage.Offset(x) opère un décalage vertical ;
- Plage.Offset(,y) opère un décalage horizontal (ne pas oublier la virgule !) ;
- Plage.Offset(x,y) opère un décalage vertical ET horizontal.
Les indices positifs décalent vers le bas et la droite, les indices négatifs vers le haut et la gauche.
III-B. Utilisation▲
Plage.Offset s’appuie sur une plage de départ pour définir une plage d’arrivée. Offset renvoie donc une plage. Cette plage est toujours de forme identique à la plage de départ.
Offset est assez facile à manipuler car très prévisible dans ses effets. Offset(traduction de Décalage) permet, au départ d’une plage, d’opérer un décalage de x lignes et y colonnes sur la feuille. Cela permet d’obtenir une plage de forme identique à la plage de départ, ailleurs sur la feuille.
Range("B3 :D6").Offset(7,5) => Range("$G$10:$I$13")
Range("$C$20:$D$22,$D$23:$D$27,$E$26:$F$27,$G$24:$G$26").Offset(-3,7) => Range("$J$17:$K$19,$K$20:$K$24,$L$23:$M$24,$N$21:$N$23")
Bien entendu, un Offset qui décalerait hors des limites de la feuille produirait une erreur d’exécution.
On observe donc que Offset permet, au départ d’une plage, de trouver une plage d’arrivée de mêmes formes et dimensions grâce à un décalage dans les 4 directions.
Notez bien qu’il ne s’agit ni d’une copie de la plage de départ, ni d’un déplacement de celle-ci. Il s’agit simplement de récupérer un objet Range de mêmes formes et dimensions que la plage de départ, ailleurs sur la feuille.
Il n’y a rien d’autre à dire sur Offset.
IV. Plage indicée▲
IV-A. Syntaxe▲
Plage([x],[y]) renvoie un objet Range monocellule.
Les indices de décalage sont optionnels, mais il en faut au moins 1. Autrement dit, Plage() n’est pas valide.
Malgré l’infobulle qui renseigne un décalage (x,y) pour décaler de x lignes (RowIndex) et de y colonnes (ColumnIndex),