VBA Sélection variable

Calvus

XLDnaute Barbatruc
Bonsoir le Forum,

J'ai un code, dans une feuille, avec lequel je remplis un tableau, sous un autre tableau variable.

[Highlight=vb]'Nettoyage
Range("A20:O50").Clear

'Remplir la ligne 20 des titres
For i = 1 To 15
a = Array("Num", "", "Société", "Nom", "Prénom", "Action 1", "Echéance 1", "Rendez Vous", "Heure RV", "Action 2", "Echéance 2", "Rappel", "Heure", "Action 3", "Echéance 3")
Cells(20, i) = a(i - 1)
Next i[/code]

Ceci fonctionne très bien.
Or, voulant décaler mon tableau car le premier grandit, j'ai remplacé par ceci :

[Highlight=vb]'Nettoyage
' Range("A20:O50").Clear
Range("A50").End(xlUp).CurrentRegion.Clear
Pos = Range("A50").End(xlUp).Offset(4, 0).Address

'Remplir la ligne 20 des titres
For i = 1 To 15
a = Array("Num", "", "Société", "Nom", "Prénom", "Action 1", "Echéance 1", "Rendez Vous", "Heure RV", "Action 2", "Echéance 2", "Rappel", "Heure", "Action 3", "Echéance 3")
Cells(Pos.Address, i) = a(i - 1)
Next i
[/code]

L'erreur se produit après : Pos = Range("A50").End(xlUp).Offset(4, 0).Address
Bloc with non défini.

Qu'est ce qui ne va pas ?

Merci de votre aide.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : VBA Sélection variable

Bonsoir à tous,

Et comme ceci : :confused:
VB:
Dim Pos As Long
Range("A50").End(xlUp).CurrentRegion.Clear
Pos = Range("A50").End(xlUp).Offset(4, 0).Row
'Remplir la ligne 20 des titres
a = Array("Num", "", "Société", "Nom", "Prénom", "Action 1", "Echéance 1", "Rendez Vous", "Heure RV", "Action 2", "Echéance 2", "Rappel", "Heure", "Action 3", "Echéance 3")
Range(Cells(Pos, 1), Cells(Pos, 15)) = a
 
Dernière édition:

laetitia90

XLDnaute Barbatruc
Re : VBA Sélection variable

bonsoir tous :):):)
ou encore ??

Code:
Sub es()
  [A50].End(3).CurrentRegion.Clear
  [A50].End(3)(5).Resize(, 15) = Array("Num", "", "Société", "Nom", "Prénom", "Action 1", "Echéance 1", _
 "Rendez Vous", "Heure RV", "Action 2", "Echéance 2", "Rappel", "Heure", "Action 3", "Echéance 3")
End Sub
 

Calvus

XLDnaute Barbatruc
Re : VBA Sélection variable

Re bonsoir, bonsoir Laetitia :) :)

Merci Mapomme, ça fonctionne bien. Peux tu me dire ce que tu as fait ? Et pourquoi en déclarant Pos comme Range ça ne fonctionne pas ?

Merci

Laetitia, le problème est que je ne saisis pas ton code, donc impossible pour moi de l'adapter....pour le moment... Merci
 

mapomme

XLDnaute Barbatruc
Supporter XLD
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.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : VBA Sélection variable

Bonjour à tous,

Hum, Range("A50").End(xlUp).CurrentRegion.Clear effacera le 1er tableau.

C'est vraiment ce que vous voulez Calvus ?

Normalement
il n'y a rien à effacer sous le 1er tableau :rolleyes:

Sinon :

Code:
Sub titres()
With Cells(Rows.Count, 1).End(xlUp)
  .Cells(2).Resize(Rows.Count - .Row, 15).ClearContents
  .Cells(5).Resize(, 15) = Array("Num", "", "Société", "Nom", "Prénom", "Action 1", _
  "Echéance 1", "Rendez Vous", "Heure RV", "Action 2", "Echéance 2", "Rappel", _
  "Heure", "Action 3", "Echéance 3")
End With
End Sub
A+
 

Calvus

XLDnaute Barbatruc
Re : VBA Sélection variable

Re, bonjour Job,

Hum, Range("A50").End(xlUp).CurrentRegion.Clear effacera le 1er tableau.

C'est vraiment ce que vous voulez Calvus ?

Normalement
il n'y a rien à effacer sous le 1er tableau :rolleyes:

Il faut faire attention en effet. Je vais chercher à mettre une condition pour éviter cela. Mais le but recherché est bien d'effacer le tableau généré comme ici, pour le remplacer par un nouveau.

Je vais garder votre code dans un coin pour le cas où je voudrais les cumuler. Merci. Même si j'ai toujours un peu de mal, je progresse. Et les jour où je n'en aurai plus besoin, vous m'expliquerez enfin vos codes :) :)

Par ailleurs, je cherche quelque chose qui me paraissait simple mais je bloque.
J'arrive à trouver une variable dans une plage, mais je n'arrive pas à décaler sur une colonne fixe.

[Highlight=vb]With celdep.Offset(0, Columns(3))[/code]

Voilà l'idée, mais forcément ça ne fonctionne pas.
Je voudrais que quelle que soit la colonne trouvée, le décalage se fasse sur la colonne 3 de la même ligne.
J'ai évidemment essayé Range, Celles, etc... mais sans succès.

Merci
 

job75

XLDnaute Barbatruc
Re : VBA Sélection variable

Re,

Je voudrais que quelle que soit la colonne trouvée, le décalage se fasse sur la colonne 3 de la même ligne.

Facile à piger :

Code:
With Intersect(celdep.EntireRow, Columns(3))
Plus court mais plus difficile :

Code:
With celdep(1, 4 - celdep.Column)
Edit : noter qu'avec le 1er code il pourrait être nécessaire de préciser la feuille devant Columns :

Code:
With Intersect(celdep.EntireRow, celdep.Parent.Columns(3))
alors que le 2ème code ne le nécessite pas.

A+
 
Dernière édition:

laetitia90

XLDnaute Barbatruc
Re : VBA Sélection variable

re tous :):):):) salut Job:):)

vu que l'ami ma pomme :) ta donner pas mal explication je vais faire trés simple

[a50].End(3)(5).Resize(, 15)

le 3 reduction de xlUp

le 5 selection de 4 lignes au dessous toujours 1 de plus que l'adress de la derniere ligne pleine
fais des essais tu conprendras avec 1 2 3 4 ect..
Resize(, 15) du moment que ton tableau ou array =15

on pourrait resize sur la colonne Resize(15,)
regarde l'aide pour resize assez simple a comprendre
dans ton cas on pourrait egalement faire pour ecrire a partir column 3

Code:
[a50].End(3)(5, 3).Resize(, 15) = Array("Num", "", "Société", "Nom", "Prénom", "Action 1", "Echéance 1", _
 "Rendez Vous", "Heure RV", "Action 2", "Echéance 2", "Rappel", "Heure", "Action 3", "Echéance 3")

(5, 3)
5 = 4lignes en dessous & le 3 column3
 

Calvus

XLDnaute Barbatruc
Re : VBA Sélection variable

Bonsoir le Forum,

Merci Job. Efficace comme d'habitude :) Et j'ai même réussi à piger le second code ! Merci :)

Laetitia, :), merci. Un grand pas en vba ce soir. Ça c'est de l'explication claire et concise. J'ai vraiment appris quelque chose. Merci

A bientôt :)
 

Discussions similaires

Réponses
0
Affichages
288
Réponses
7
Affichages
689

Membres actuellement en ligne

Statistiques des forums

Discussions
314 222
Messages
2 107 468
Membres
109 836
dernier inscrit
SophieL16