ITEM

Quand parle-t-on des items et à quoi sert le (0 après (xldown) ?

Lorsque l'ActiveCell est A1, comment sélectionner la plage A1:A4 sachant que les cellules A2, A3, A4 sont vides alors que A5 est remplie ?

Range(ActiveCell, ActiveCell.End(xlDown)(0)).Select 

Le (0), c'est un coup des item...

Première réponse :

Range(...)(X, Y) est un raccourci de la propriété .Item: Range(...).Item(X, Y) Cette propriété est décrite dans l'aide VBA. Elle présente certaines particularités. Par exemple, le premier paramètre peut être supérieur au nombre de cellules comprises dans la plage.
Dans ce cas, Range(Ref)(X) lit la Xième cellule des colonnes délimitées par la référence indiquée.
Par exemple: Range("A1:E1")(6) correspond à B1 (6ème cellule de la plage A1:E65536)
Range("B10:F15")(6) correspond à B11 (6ème cellule de B10:F65536)
La propriété .Item est l'accesseur des objets Range. Ainsi, quand on utilise par exemple Sheets(ShName).Cells(5,6), on utilise en fait de manière implicite la propriété .Item, renvoyant un élément de la collection Cells : Sheets(ShName).Cells.Item(5,6).
Pour renvoyer la cellule (X,Y) d'une plage variable, il est inutile de passer par .Cells(X,Y). L'utilisation directe de la propriété Item -Range(Ref).Item(X,Y) ou Range(Ref)(X,Y)- est beaucoup plus rapide en vitesse d'exécution, et même un peu plus rapide que l'emploi de Offset.

Deuxième réponse, du même

En très gros, on peut dire que la propriété Item correspond à la fonction de feuille de calcul INDEX. Mais en beaucoup plus chinois (pardon Hai-Li): MaPlage(RowIndex, ColumnIndex) renvoie la référence de la cellule qui se situe à l'intersection de la ligne RowIndex et de la colonne ColumnIndex de MaPlage, de la même manière que =INDEX(MaPlage;NumLigne;NumCol) dans une feuille de calcul. Plage(1) renvoie la référence de la première cellule de la plage.
Par exemple, mettons que tu as dans la variable Zaza (Range) la référence d'une plage de dimensions inconnues: Set Zaza = Selection
Si tu veux par exemple sélectionner la première cellule de cette plage, dont tu ne connais pas a priori l'adresse ni les dimensions, tu peux utiliser Item(1): Zaza.Item(1).Select, ou alors plus simplement, Zaza(1).Select
Zaza(2) renvoie la deuxième cellule de la plage, en lisant celle-ci ligne par ligne:

Range("A1:C3")(1) = Range("A1") Range("A1:C3")(2) = Range("B1") Range("A1:C3")(3) = Range("C1") Range("A1:C3")(4) = Range("A2") ... Range("A1:C3")(9) = Range("C3")

Pour sélectionner la dernière cellule de la plage Zaza : Zaza(Zaza.Count).Select Zaza(5, 13), équivalent de Zaza.Item(5,13) renvoie la cellule qui se trouve sur la 5ème ligne, 13ème colonne de la plage Zaza.

Si le paramètre "RowIndex" de la propriété Item(RowIndex) est "hors plage", ça marche aussi:
Range("B2")(3) = Range("B4") (on descend de 3 lignes vers le bas à partir de B2).

Si RowIndex est inférieur à 1, Cellule.Item(N) "remonte" de (N+1) lignes:
Range("B2")(0) = Range("B1") Range("C3")(-1) = Range("C1")

Même chose pour le deuxième paramètre, ColumnIndex, mais pour le décalage par colonne:
Range("B2")(1, 3) = Range("D2") Range("B2")(1, 0) = Range("A2") Range("D3")(1, -2) = Range("A3")

Quand la plage est constituée d'une seule cellule, Plage(X, Y) ou Plage.Item(X, Y) est équivalent à Plage.Offset(X - 1, Y - 1). Mais la propriété Item est plus rapide qu'Offset à l'exécution de la macro.

Si la plage est constituée de colonnes (issues de la propriété .Columns ou .EntireColumn) ou de lignes (issues de .Rows ou .EntireRow), alors la propriété Item renvoie aussi, respectivement, une colonne ou une ligne, et non pas une cellule unique.
Par exemple :

Dim Plage As Range
Set Plage = Range("A1:C3").Columns
MsgBox Plage(2).Address(0, 0)  ' ou MsgBox Plage.Item(2).Address(0, 0)    

= affiche "B1:B3" (2ème colonne de la plage)

Set Plage = Range("A1:C3").Rows
MsgBox Plage(3).Address(0, 0)  ' ou MsgBox Plage.Item(3).Address(0, 0)    

= affiche "A3:C3" (3ème ligne de la plage)
Là aussi, on peut utiliser des décalages "hors plage", et un paramètre RowIndex inférieur à 1:

Set Plage = Range("A5:C7").Rows
MsgBox Plage(0).Address(0, 0)  ' ou MsgBox Plage.Item(0).Address(0, 0)    

= affiche "A4:C4" (1ère ligne au-dessus de A5:C7)

Last but not least, tout le monde parle Item sans le savoir dans ses macros, comme la prose de Mr Jourdain. Il s'agit en effet de la propriété (dans ce cas, je crois que les amerloques disent "accessor") par défaut des objets Plage.
Donc en fait, quand on utilise par exemple : Cells(5, 8).Select ... sans le savoir, on utilise la propriété Item, sous sa forme implicite : Cells.Item(5, 8).Select
Ce qui veut dire : sélectionner l'Item (5, 8) de l'objet Cells, qui représente la totalité des cellules de la feuille de calcul.

Même chose pour les propriétés Rows et Columns. Et pour mieux tout embrouiller, comme la propriété Item renvoie une référence de cellule, donc un objet sur lequel on peut appliquer encore la propriété Item, les Item peuvent s'enchaîner ad libitum, ce qui fait que l'instruction suivante, quoique complètement débile, est parfaitement valide: Cells(3)(4,5)(-2)(8,1)(12)(-5)(0).Select

Auteur :

Mot clef associé à cette page :