Voir le flux RSS

Pierre Fauconnier

EXcel VBA: Range(x), Range(x,y) et Range.Offset(x,y)

Noter ce billet
par , 22/08/2018 à 22h57 (1041 Affichages)
Salut.

Suite à un code que je donnais en réponse à une question, on m'a écrit ceci:
J'ai du mal à comprendre la gymnastique de Range(1)
Et c'était la deuxième fois en une semaine que cette syntaxe posait question. Il m'a semblé utile de bien préciser les différences entre Range(x), Range(x,y) et Range.Offset(x,y).

Range(x)
Lorsque l'on utilise un seul argument, on parle en fait de la position d'une cellule par rapport à la cellule supérieure gauche de la plage considérée dans les limites des colonnes de la plage. Un indice positif positionne en zigzag de gauche à droite et de haut en bas, en débordant éventuellement de la plage mais en restant dans les colonnes délimitées par la plage. Un indice négatif positionne de droite à gauche et de bas en haut dans une plage miroir de la plage d'origine, la cellule supérieure gauche étant l'axe de rotation, là aussi, dans la limite des colonnes de la plage qui a pivoté.

Une image vaut parfois mieux qu'un long discours . En considérant la plage G13:I14, on pourrait avoir le schéma suivant pour Range("G13:I14")(x), qui matérialise le déplacement de gauche à droite puis de haut en bas dans la plage jaune (G13:I14) pour les indices négatifs, et de droite à gauche puis de bas en haut pour la plage miroir bleue (E12:G13), qui a effectué une rotation autour de G13 pour les indices négatifs. On voit que les positions sont calculées dans ou hors de la plage, mais dans les limites des colonnes définies par les plages. Par exemple, Range("G13:I14")(7).Address pointera vers G15 et Range("G13:I14")(-5).Address pointera vers G11.

Nom : 2018-08-22_214117.png
Affichages : 437
Taille : 6,1 Ko


Ce fait de voyager dans les limites des colonnes de la plage doit être bien compris car il peut être problématique puisque deux cellules peuvent ne pas se trouver à la même position l'une de l'autre, en fonction de la largeur des plages envisagées. On remarquera à l'occasion que la hauteur de la plage d'origine n'a ici aucune importance, seule la largeur de la plage d'origine est importante pour le positionnement. Dans l'illustration suivante, on voit que Range("G13:K13")(11).Address pointera vers G15 et que Range("G13:K13")(-9).Address pointera vers G11.

Nom : 2018-08-22_214025.png
Affichages : 427
Taille : 8,7 Ko

On constate donc qu'ici, G15 et G11 sont respectivement à 11 et -9 cellules de G13 alors que tout à l'heure, elles étaient respectivement à 7 et -5 cellules de G13. C'est normal puisque les chemins en zigzag sont plus longs de quatre cellules.

Bien entendu, si on part sur un vecteur colonne, par exemple G13:G15, le déplacement en zigzag est en fait un déplacement vertical. Range("G13:G15")(3).Address pointera vers G15 et que Range("G13:G15")(-1).Address pointera vers G11. On constate donc qu'ici, G15 et G11 sont encore à des distances de G13 différentes que dans les deux cas précédents. On remarquera également qu'avec cette syntaxe, on récupère toujours une seule cellule.


Range(x,y)
Voyons maintenant ce qui passe lorsque l'on utilise la syntaxe Range(x,y). Dans ce cas, on va considérer que la cellule supérieure gauche de la plage renseignée est la cellule A1 de la plage. D'ailleurs, dans ce cas, la dimension de la plage renseignée n'a aucune importance car tout va se jouer par rapport à "sa" cellule A1. Sa cellule A1 sera la cellule qui sera sur la première ligne et dans la première colonne (Range("G13:I14")(1,1) => G13). Par rapport à "cette cellule A1", on se positionnera donc à x lignes et y colonnes. On remarque ici que les limites ne jouent pas, et vous pouvez utiliser n'importe quelle plage dont G13 est la cellule supérieure gauche, vous obtiendrez le même résultat car seule cette cellule compte pour la syntaxe Range(x,y).

Nom : 2018-08-22_221614.png
Affichages : 428
Taille : 9,6 Ko

Au passage, vous remarquerez que quelle que soit la taille de la plage utilisée, c'est toujours une et une seule cellule qui est renvoyée.

Notez que, malgré l'infobulle qui nous renseigne que chaque argument est optionnel, seul l'argument x est optionnel et vaut alors 1, de sorte que Range("G13:I14")(,6) =>L13. L'argument y ne peut être optionnel car cela nous ramènerait à la première syntaxe qui, comme je l'ai mis en évidence, ne permet pas de pointer vers la même cellule. Range("G13:I14")(1,4).Address pointera versJ13 tout comme Range("G13:I14")(,4).Address (argument x optionnel), mais Range("G13:I14")(5,1).Address pointera vers G17 alors que Range("G13:I14")(5).Address pointera vers H14 (Argument y pas optionnel car pas le même résultat)...


Range.Offset(x,y)
Avec la syntaxe Range.Offset(x,y), on effectue un décalage de la plage d'origine de x lignes et y colonnes. Ici, on constate que la plage renvoyée par le décalage possède les mêmes dimensions que la plage d'origine. Puisqu'il s'agit d'une décalage, Range.Offset(0,0) renvoie la plage d'origine puisque l'on décale de 0 lignes et de 0 colonnes.

Nom : 2018-08-22_224035.png
Affichages : 437
Taille : 12,6 Ko

Ici, les deux arguments sont optionnels. Range("G13:I14").Offset(0,0) = Range("G13:I14").Offset() = Range("G13:I14").

Attention donc aux différences entre Range("G13:I14")(4,3) qui pointe vers I16 et Range("G13:I14").Offset(4,3) pointe vers J17:L18. On remarquera donc qu'avec Offset, on peut récupérer une plage de plusieurs cellules, à la différence de Range(x) et Range(x,y) qui ne renvoient jamais qu'une cellule.

Si cela va sans dire, cela va mieux en le disant: Il faut évidemment que les arguments utilisés permettent de rester dans la limites de la feuille. Range("a1")(0) renverra évidemment une erreur.


Bon travail avec Excel et VBA...

Envoyer le billet « EXcel VBA: Range(x), Range(x,y) et Range.Offset(x,y) » dans le blog Viadeo Envoyer le billet « EXcel VBA: Range(x), Range(x,y) et Range.Offset(x,y) » dans le blog Twitter Envoyer le billet « EXcel VBA: Range(x), Range(x,y) et Range.Offset(x,y) » dans le blog Google Envoyer le billet « EXcel VBA: Range(x), Range(x,y) et Range.Offset(x,y) » dans le blog Facebook Envoyer le billet « EXcel VBA: Range(x), Range(x,y) et Range.Offset(x,y) » dans le blog Digg Envoyer le billet « EXcel VBA: Range(x), Range(x,y) et Range.Offset(x,y) » dans le blog Delicious Envoyer le billet « EXcel VBA: Range(x), Range(x,y) et Range.Offset(x,y) » dans le blog MySpace Envoyer le billet « EXcel VBA: Range(x), Range(x,y) et Range.Offset(x,y) » dans le blog Yahoo

Mis à jour 23/08/2018 à 15h20 par Pierre Fauconnier

Catégories
VBA , Excel , MS Office

Commentaires