Re : VBA Sélection variable
Bonjour
(...) Peux tu me dire ce que tu as fait ? Et pourquoi en déclarant Pos comme Range ça ne fonctionne pas ? (...)
Pour simplifier, on suppose que Pos fait référence à une seule cellule.
Dans ton code n°2, tu écris (avec
Pos étant un range) :
Pos = Range("A50").End(xlUp).Offset(4, 0).Address
Ce qui revient à chercher l'adresse de la cellule
Range("A50").End(xlUp).Offset(4, 0) et d'affecter cette adresse au Range
Pos (*).
La valeur de la cellule représentée par
Pos serait donc une chaine de caractère représentant une adresse.
Ex: si Range("A50").End(xlUp).Offset(4, 0) représente la cellule A5 alors la cellule référencée par Pos contiendra le texte "$A$5".
Or si
Pos n'a
jamais été initialisé avant l'instruction ci-dessus,
Pos est égal à
Nothing. On ne peut pas affecter une valeur à une propriété
(*) d'une variable objet non initialisée d'où l’erreur.
Quand bien même cela serait corrigé, considérons l'instruction
Cells(Pos.Address, i) = a(i - 1)
Cells représentant ici
l'ensemble de toutes les cellules de la feuille active.
Cells nécessite en premier paramètre soit un nombre, soit un texte représentant un nombre.
Ex: Cells(2,3) ou Cells("2",3) représente la cellule
C2.
Pos.address renvoie un
texte qui est l'
adresse absolue du range
Pos (par exemple si Pos est la cellule A5, alors Pos.address renvoie "
$A$5")
Cells(
(Pos.Address, i) deviendrait
Cells("$A$5",i) VBA renverrait une erreur car VBA ne sait pas comment interpréter
"$A$5" qui n'est ni un nombre, ni un texte représentant un nombre.
(*) Pos = "$A$5" revient à écrire Pos.
Value = "$A$5" car la propriété
Value est la propriété
par défaut d'un objet de type Range.
Quant à mon code:
On déclare Pos comme un entier de type Long et on lui affecte le numéro de la ligne de
Range("A50").End(xlUp).Offset(4, 0) soit :
Pos=
Range("A50").End(xlUp).Offset(4, 0).row
Ensuite on considère le range qui débute à Cells(Pos, 1) jusqu'à Cells(Pos, 15)
- soit 15 cellules en ligne à partir de Cells(Pos, 1)
-, ce qui s'écrit: Range(Cells(Pos, 1), Cells(Pos, 15)).
On affecte à la propriété par défaut Value des cellules de ce Range le tableau
a (qui comporte aussi 15 valeurs) :
Range(Cells(Pos, 1), Cells(Pos, 15)).value =
a
Ce qui peut s'écrire: Range(Cells(Pos, 1), Cells(Pos, 15))=
a
nb: votre boucle ferait la même chose très bien:
For i = 1 To 15
Cells(Pos, i) = a(i - 1)
Next i
nota: Le code de laetitia90 (que je salue 🙂) fait la même chose avec une écriture beaucoup plus condensée.