Créer une macro pour copier sous condition avec boucle
Dernière réponse : dans Programmation
Bonjour,
J'ai écris le code suivant qui fonction bien:
Par contre, je souhaite l'appliquer en boucle aux lignes suivantes.
Pouvez vous m'aider!
J'ai écris le code suivant qui fonction bien:
Sheets("Liste salariés").Select
If Range("AG5").Value = "CTEM" Then
Range("A5,B5,AI5,AJ5").Select
Selection.Copy
Sheets("Feuil1").Select
Range("A2").Select
ActiveSheet.Paste
End If
Par contre, je souhaite l'appliquer en boucle aux lignes suivantes.
Pouvez vous m'aider!
Autres pages sur : creer macro copier condition boucle
Lassé par la pub ? Créez un compte
Salut,
Non. Il n'est pas question que je t'aide à utiliser le presse-papier comme variable temporaire !
Sauf que tu voudrais bien qu'on t'aide quand même. Hein !?
Alors on va transformer ton code un tant soit peu pour ne plus utiliser le presses-papier.
Regarde un peu l'aide concernant la commande Copy.
Ensuite, il faudra ne plus sélectionner telle feuille avant de considérer telle cellule de la feuille active, mais il faudra directement considérer telle cellule de telle feuille.
Enfin, il suffira d'appliquer une bête boucle à ceci et tu auras ta solution.
Sauf qu'on pourra faire une boucle pas si bête que ça.
Et pour pousser plus loin, je te montrerai comment ne pas avoir de "trous" dans ta nouvelle feuille.
A te lire.
Non. Il n'est pas question que je t'aide à utiliser le presse-papier comme variable temporaire !
Sauf que tu voudrais bien qu'on t'aide quand même. Hein !?
Alors on va transformer ton code un tant soit peu pour ne plus utiliser le presses-papier.
Regarde un peu l'aide concernant la commande Copy.
Ensuite, il faudra ne plus sélectionner telle feuille avant de considérer telle cellule de la feuille active, mais il faudra directement considérer telle cellule de telle feuille.
Enfin, il suffira d'appliquer une bête boucle à ceci et tu auras ta solution.
Sauf qu'on pourra faire une boucle pas si bête que ça.
Et pour pousser plus loin, je te montrerai comment ne pas avoir de "trous" dans ta nouvelle feuille.
A te lire.
Bonjour,
Grace à tes conseil j'ai réussi à faire la même chose avec un code plus simple (et plus conventionnel j'imagine)
Merci pour ton aide.
Je suis prête à découvrire la suite du code !
Grace à tes conseil j'ai réussi à faire la même chose avec un code plus simple (et plus conventionnel j'imagine)
If Worksheets("Liste salariés").Range("AG5").Value = "CTEM" Then
Worksheets("Liste salariés").Range("A5,B5,AI5,AJ5").Copy _
Destination:=Worksheets("feuil2").Range("A2")
End If
Merci pour ton aide.
Je suis prête à découvrire la suite du code !
Salut,
Eh, c'est bien ça !
Alors, dans ce cas, la réponse est "oui, je vais t'aider" !
Alors pour faire plus simple, on va compliquer un peu tout ça.
Je veux deux variables, l'une pour savoir où je lis (source), l'autre où j'écris (cible).
C'est pas assez compliqué
Soit cols_source les colonnes qui t'intéressent dans la source, c'est-à-dire, A, B, AI et AJ.
Et soit cel_target, la cellule vers laquelle on copie. (Tu vas voir qu'il faut en faire une variable)
Certains voudraient écrire la ligne 4 avec un With :
Bon, il n'y a plus qu'à mettre la ligne 5 de la source en paramètre.
On doit s'occuper de AG5, A5, B5, AI5, AJ5.
Oups, j'ai oublié de m'occuper de la colonne AG.
Voilà qui est fait :
Soit lig_souce, une ligne de la feuille source.
Tout ça nous donne :
Et maintenant ?
Ben on fait varier lig_source ! (Et cel_target aussi)
Alors soit tu sais combien tu as de lignes, soit on va de la ligne 5 à la ligne 65536, soit on va de la ligne 5 à la dernière ligne non-vide, soit on s'arrête à la première ligne vide, etc.
Les possibilités ne manquent pas.
Disons que tu veux le faire pour les ligne 5 à 10.
Voilà alors le code à adopter :
T'as vu ?! Grâce à la variable cel_target, on ne se déplace dans la feuille cible que si on quelque chose à y a copier. Ainsi, pas de "trous", ce qui arrive quand on fait "si Ok copier ligne 5 dans ligne 5".
-----------------------
Alors, ça t'aide ?????
Eh, c'est bien ça !
Alors, dans ce cas, la réponse est "oui, je vais t'aider" !
Alors pour faire plus simple, on va compliquer un peu tout ça.
Je veux deux variables, l'une pour savoir où je lis (source), l'autre où j'écris (cible).
Dim ws_source As Worksheet Dim ws_target As Worksheet Set ws_source = Worksheets("Liste salariés") Set ws_target = Worksheets("feuil2") If ws_cible.Range("AG5").Value = "CTEM" Then ws_cible.Range("A5,B5,AI5,AJ5").Copy Destination:=ws_target.Range("A2") End If
C'est pas assez compliqué
Soit cols_source les colonnes qui t'intéressent dans la source, c'est-à-dire, A, B, AI et AJ.
Et soit cel_target, la cellule vers laquelle on copie. (Tu vas voir qu'il faut en faire une variable)
Dim cols_source As Range Dim cel_target As Range Set cols_source = Union(ws_source.Columns("A"), ws_source.Columns("B"), ws_source.Columns("AI"), ws_source.Columns("AJ")) Set cel_target = ws_target.Range("A2")
Certains voudraient écrire la ligne 4 avec un With :
With ws_source Set cols_source = Union(.Columns("A"), .Columns("B"), .Columns("AI"), .Columns("AJ")) End With
Bon, il n'y a plus qu'à mettre la ligne 5 de la source en paramètre.
On doit s'occuper de AG5, A5, B5, AI5, AJ5.
Oups, j'ai oublié de m'occuper de la colonne AG.
Voilà qui est fait :
Dim col_test_source As Range Set col_test_source = ws_source.Columns("AG")
Soit lig_souce, une ligne de la feuille source.
Dim lig_source As Range
Tout ça nous donne :
Dim ws_source As Worksheet Dim cols_source As Range Dim col_test_source As Range Dim lig_source As Range Dim ws_target As Worksheet Dim cel_target As Range Set ws_source = Worksheets("Liste salariés") Set ws_target = Worksheets("feuil2") With ws_source Set cols_source = Union(.Columns("A"), .Columns("B"), .Columns("AI"), .Columns("AJ")) Set col_test_source = .Columns("AG") End With Set cel_target = ws_target.Range("A2") ' // Pour la ligne 5 ! Set lig_source = ws_source.Rows(5) If Intersect(lig_source , col_test_source).Value = "CTEM" Then Intersect(lig_source, cols_source).Copy Destination:=cel_target End If
Et maintenant ?
Ben on fait varier lig_source ! (Et cel_target aussi)
Alors soit tu sais combien tu as de lignes, soit on va de la ligne 5 à la ligne 65536, soit on va de la ligne 5 à la dernière ligne non-vide, soit on s'arrête à la première ligne vide, etc.
Les possibilités ne manquent pas.
Disons que tu veux le faire pour les ligne 5 à 10.
Voilà alors le code à adopter :
' // Le For Each va faire varier la ligne, de ligne en ligne For Each lig_source In ws_source.Range(ws_source.Rows(5), ws_source.Rows(10)) If Intersect(lig_source , col_test_source).Value = "CTEM" Then Intersect(lig_source, cols_source).Copy Destination:=cel_target ' // A la suivante dans la cible ! Set cel_target = cel_target.Offset(1) End If Next
T'as vu ?! Grâce à la variable cel_target, on ne se déplace dans la feuille cible que si on quelque chose à y a copier. Ainsi, pas de "trous", ce qui arrive quand on fait "si Ok copier ligne 5 dans ligne 5".
-----------------------
Alors, ça t'aide ?????
zeb a édité ce message
Bonjour et encore merci pour ton aide.
Suite à tes indications, j'ai réécris le code suivant:
Malheureusement, lorsque je lance la macro, il y a le message d'erreur suivant:
Erreur de compilation.
Nombre d'arguments incorrect ou affectation incorrecte
Avec le 1er "Range" de la ligne 11 surligné.
Je ne comprend pas trop le problème.
-------------
Modérateur : j'ai modifié ton message pour mettre [code=VB]. C'est juste pour faire joli. Fais-le de toi-même dorénavant.
Suite à tes indications, j'ai réécris le code suivant:
Dim ws_source As Worksheet Dim cols_source As Range Dim col_test_source As Range Dim lig_source As Range Dim ws_target As Worksheet Dim cel_target As Range Set ws_source = Worksheets("Liste salariés") Set ws_target = Worksheets("feuil2") With ws_source Set cols_source = .Range(.Columns("A"), .Columns("B"), .Columns("AI"), .Columns("AJ")) Set col_test_source = .Columns("AG") End With Set cel_target = ws_target.Range("A2") Set lig_source = ws_source.Rows(5) For Each lig_source In ws_source.Range(ws_source.Rows(5), ws_source.Rows(10)) If Intersect(lig_source, col_test_source).Value = "CTEM" Then Intersect(lig_source, cols_source).Copy Destination:=cel_target Set cel_target = cel_target.Offset(1) End If Next
Malheureusement, lorsque je lance la macro, il y a le message d'erreur suivant:
Erreur de compilation.
Nombre d'arguments incorrect ou affectation incorrecte
Avec le 1er "Range" de la ligne 11 surligné.
Je ne comprend pas trop le problème.
-------------
Modérateur : j'ai modifié ton message pour mettre [code=VB]. C'est juste pour faire joli. Fais-le de toi-même dorénavant.
zeb a édité ce message
Lassé par la pub ? Créez un compte
- Contenus similaires :
- ForumMacro copier coller cellule sous condition
- ForumMacro copier coller ligne si condition
- ForumCréer une macro excel 2007
- ForumCréer une macro de recherche sur excel
- ForumMacro copier un document
- ForumMacro copier avec conditions
- ForumMacro copier une ligne
- ForumMacro copier des donnã es
- ForumExcel créer une macro
- ForumMacro copier colonne
- Voir plus