Créer une macro pour copier sous condition avec boucle

G

Guest

Invité
Bonjour,

J'ai écris le code suivant qui fonction bien:

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

zeb

Modérateur
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.
 

weny29

Nouveau membre
Bonjour,

Grace à tes conseil j'ai réussi à faire la même chose avec un code plus simple (et plus conventionnel j'imagine)

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

zeb

Modérateur
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).

Code:
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)
Code:
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 :
Code:
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 :
Code:
Dim col_test_source As Range

Set col_test_source = ws_source.Columns("AG")

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

Tout ça nous donne :
Code:
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 :
Code:
' // 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 ????? :sol:
 

weny29

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

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

Modérateur
[strike]Oups. j'ai écrit une connerie[/strike]

[mauvaise foi=ON]

pffff... Relis mieux mon code :o

[:patch]
 

zeb

Modérateur
J'accepte tes remerciements si tu acceptes de bien comprendre ce que je t'ai proposé.
S'il devait y avoir quelques points difficiles à comprendre, n'hésite pas ;)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 125
Messages
6 717 768
Membres
1 586 361
Dernier membre
Florian3549
Partager cette page
Haut