Offset ou pas Offset?

Pierre Fauconnier

Sur les forums, on voit parfois Range("A5")(3), qui correspond plus ou moins à Range("A5").Offset(2)

- Titre : Offset ou pas Offset?

- Auteur : Pierre Fauconnier

- Parution : 31 mai 2019

- Mise à jour : 9 juin 2019

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2019 Pierre Fauconnier. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.

Sommaire

- I. Objectifs

- I-A. Prérequis

- II. A quoi ça sert ?

- III. Offset

- III-A. Syntaxe

- III-B. Utilisation

- IV. Plage indicée

- IV-A. Syntaxe

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),