Se connecter avec
S'enregistrer | Connectez-vous

Créer une macro pour copier sous condition avec boucle

Dernière réponse : dans Programmation
Lassé par la pub ? Créez un compte
Expert Programmation

Salut,

Non. Il n'est pas question que je t'aide à utiliser le presse-papier comme variable temporaire ! :o 

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)

  1. If Worksheets("Liste salariés").Range("AG5").Value = "CTEM" Then
  2. Worksheets("Liste salariés").Range("A5,B5,AI5,AJ5").Copy _
  3. Destination:=Worksheets("feuil2").Range("A2")
  4.  
  5. End If


Merci pour ton aide.
Je suis prête à découvrire la suite du code !
Expert Programmation

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).

  1. Dim ws_source As Worksheet
  2. Dim ws_target As Worksheet
  3.  
  4. Set ws_source = Worksheets("Liste salariés")
  5. Set ws_target = Worksheets("feuil2")
  6.  
  7. If ws_cible.Range("AG5").Value = "CTEM" Then
  8. ws_cible.Range("A5,B5,AI5,AJ5").Copy Destination:=ws_target.Range("A2")
  9. 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)
  1. Dim cols_source As Range
  2. Dim cel_target As Range
  3.  
  4. Set cols_source = Union(ws_source.Columns("A"), ws_source.Columns("B"), ws_source.Columns("AI"), ws_source.Columns("AJ"))
  5. Set cel_target = ws_target.Range("A2")


Certains voudraient écrire la ligne 4 avec un With :
  1. With ws_source
  2. Set cols_source = Union(.Columns("A"), .Columns("B"), .Columns("AI"), .Columns("AJ"))
  3. 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 :
  1. Dim col_test_source As Range
  2.  
  3. Set col_test_source = ws_source.Columns("AG")


Soit lig_souce, une ligne de la feuille source.
  1. Dim lig_source As Range


Tout ça nous donne :
  1. Dim ws_source As Worksheet
  2. Dim cols_source As Range
  3. Dim col_test_source As Range
  4. Dim lig_source As Range
  5.  
  6. Dim ws_target As Worksheet
  7. Dim cel_target As Range
  8.  
  9. Set ws_source = Worksheets("Liste salariés")
  10. Set ws_target = Worksheets("feuil2")
  11. With ws_source
  12. Set cols_source = Union(.Columns("A"), .Columns("B"), .Columns("AI"), .Columns("AJ"))
  13. Set col_test_source = .Columns("AG")
  14. End With
  15. Set cel_target = ws_target.Range("A2")
  16.  
  17. ' // Pour la ligne 5 !
  18. Set lig_source = ws_source.Rows(5)
  19.  
  20. If Intersect(lig_source , col_test_source).Value = "CTEM" Then
  21. Intersect(lig_source, cols_source).Copy Destination:=cel_target
  22. 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 :
  1. ' // Le For Each va faire varier la ligne, de ligne en ligne
  2. For Each lig_source In ws_source.Range(ws_source.Rows(5), ws_source.Rows(10))
  3. If Intersect(lig_source , col_test_source).Value = "CTEM" Then
  4. Intersect(lig_source, cols_source).Copy Destination:=cel_target
  5. ' // A la suivante dans la cible !
  6. Set cel_target = cel_target.Offset(1)
  7. End If
  8. 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 ????? :sol: 
zeb a édité ce message

Bonjour et encore merci pour ton aide.
Suite à tes indications, j'ai réécris le code suivant:

  1. Dim ws_source As Worksheet
  2. Dim cols_source As Range
  3. Dim col_test_source As Range
  4. Dim lig_source As Range
  5. Dim ws_target As Worksheet
  6. Dim cel_target As Range
  7.  
  8. Set ws_source = Worksheets("Liste salariés")
  9. Set ws_target = Worksheets("feuil2")
  10. With ws_source
  11. Set cols_source = .Range(.Columns("A"), .Columns("B"), .Columns("AI"), .Columns("AJ"))
  12. Set col_test_source = .Columns("AG")
  13. End With
  14. Set cel_target = ws_target.Range("A2")
  15. Set lig_source = ws_source.Rows(5)
  16.  
  17. For Each lig_source In ws_source.Range(ws_source.Rows(5), ws_source.Rows(10))
  18. If Intersect(lig_source, col_test_source).Value = "CTEM" Then
  19. Intersect(lig_source, cols_source).Copy Destination:=cel_target
  20.  
  21. Set cel_target = cel_target.Offset(1)
  22. End If
  23. 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