Code pour copier coller sous conditions

Noemy

XLDnaute Junior
Bonjour,
J'ai trouvé ce code qui m'interesse beaucoup, mais est-ce que quelqu'un pourrait me l'expliquer (simplement) afin que je puisse l'adapter à mon tableau.
Merci par avance.


Private Sub Worksheet_Change(ByVal Target As Range)

Dim cel As Range 'déclare la variable cel
Dim dest As Range 'déclare la variable dest

'boucle sur les cellules pouvant contenir
For Each cel In Range("E2:E65536")

'condition : si la valeur de la cellule contient la valeur
If cel.Value = "libre" Then
Set dest = Sheets("Analyse").Range("B65536").End(xlUp).Offset (1, 0) 'définit la variable dest
cel.EntireRow.Resize(, 255).Copy Destination:=dest 'copy la ligne de la cellule
End If 'fin de la condition

Next cel 'prochaine cellule de "ta_plage"
End Sub
 

Gorfael

XLDnaute Barbatruc
Re : Code pour copier coller sous conditions

Salut Noemy et le forum
J'ai trouvé ce code qui m'interesse beaucoup, mais est-ce que quelqu'un pourrait me l'expliquer (simplement) afin que je puisse l'adapter à mon tableau.
Bonne méthodologie ! :)

Private Sub Worksheet_Change(ByVal Target As Range)
è chaque modification de la feuille liée au module, cette macro se lance, et définit Target comme étant l'ensemble des cellules ayant subi une modification.
Dim cel As Range 'déclare la variable cel
Dim dest As Range 'déclare la variable dest
Les deux variables sont déclarées en tant que plage de cellule
For Each cel In Range("E2:E65536")
Pour chaque cellule de la plage E2:E65536
Trop gourmand en temps : il vaut mieux limiter les ligne de E à celles existant :
For Each cel In Range([E2], [:E65536].end(xlup)) par exemple
If cel.Value = "libre" Then
Si la valeur de la cellule testée est le mot "libre" alors
Set dest = Sheets("Analyse").Range("B65536").End(xlUp).Offset (1, 0)
Les plages ont besoin de l'instruction SET pour être définies
l'instruction définit dest comme suit :
Sheets("Analyse") : feuille de nom "Analyse"
Range("B65536").End(xlUp) : 1re cellule non-vide de B, en partant de la dernière ligne (65536) et en allant vers le haut = dernière cellule non-vide de la colonne B
Offset (1, 0) décaler d'uneligne, 0 colonne
Dest = Première cellule vide après la dernière cellule non-vide de B de la feuille "Analyse"
cel.EntireRow.Resize(, 255).Copy Destination:=dest 'copy la ligne de la cellule
Même style d'instruction : copier (copy) la ligne entière de la cellule testée (cel.EntireRow) retaillée à 255 (Resize(, 255)) à partir de la plage dest : une ligne faisant 256 colonnes, on est obligé de recadrer la longueur pour qu'elle puisse commencer en B
End If 'fin de la condition
Next cel 'prochaine cellule de "ta_plage"
sans commentaire
End Sub

2 "bizarreries" (à mon sens) :

- Pas de limitation de la plage de la colonne E à vérifier. Si c'est sur une instruction isEmpty, on pourrait le comprendre (quoiqu'on devrait se limiter à la plage en utilisation dans la feuille (UsedRange) au minimum), mais comme c'est sur une valeur non-nulle, il faut s'arrêter à la dernière cellule non-vide

- Pas d'utilisation de Target dans la macro :
je mets "libre" en E1 => Copie de ligne 1 en B1
je rempls F1 => copie de ligne 1 en B2
je remplis G1 => copie de ligne 1 en B3
etc... au minimum, il faudrait bloquer les évènements, effacer le "libre" testé, remettre en route les évènements (ou un principe équivalent)

A+
 

Discussions similaires

Réponses
1
Affichages
287
Réponses
2
Affichages
206

Statistiques des forums

Discussions
312 858
Messages
2 092 872
Membres
105 546
dernier inscrit
DUL57