Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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 :
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

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

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
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…