[VBA] Macro copier/coller en boucle
Bonsoir à tous les maitres programmeurs !
Je suis nouveau par ici, j’ai beaucoup parcouru le forum et vos cours, mais j’ai rien trouvé qui pourrait m’aider mais aussi pas tout compris.
Je un peu perdu à vrai dire !
Mon fichier est un planning mensuel, la macro copie certaines informations vers une autre feuille et l’imprime (ligne copiée dans ("02")/collée sur un modèle ("Feuil1") et qui la copie sur ("11"») puis l’imprime, ligne suivante, etc..)
Chaque jour à sa propre macro, mais chaque jour le nombre de lignes varie...
Le 02 du mois par exemple il peut y en avoir 10 lignes et le lendemain, le 03 du mois par exemple 15.
C'est une macro par jour.
J’aimerai aussi que la macro s’arrête une fois que la 1ère cellule copiée est vide ? (Colonne A, à partir de A13)
Il y a 2 codes, 2 essais, lequel serait le mieux une fois mes erreurs réparés ?
L’un est une copie d’une macro de mon entreprise qui fonctionne et l’autre et un enregistrement « amélioré »
J’ai une seconde question concernant le « tas » de macro, avec cette solution j’ai 31 macros sur le fichier… Soit 1 par jour.
Est-il possible d’avoir qu’une macro, avec un choix de la journée en question pour l’impression ?
Avec un UserForm ?
Merci à vous pour votre temps
PS : je débute vraiment en VBA..
Voici le une bribe du fichier en question :
Bonjour
Essaie plutot ce code :
Sub test()
'Macro Dan 10/04/13
Dim i As Integer
Dim demande As String
demande = MsgBox("voulez vous lancer la macro?", vbYesNo + vbQuestion + vbDefaultButton2)
If demande = vbYes Then
With Worksheets("02")
For i = 13 To Range("A" & Rows.Count).End(xlUp).Row
.Range("A" & i).Copy Worksheets("Feuil1").Range("L55")
.Range("B" & i).Copy Worksheets("Feuil1").Range("R58:R59")
.Range("C" & i).Copy Worksheets("Feuil1").Range("Q61")
.Range("D" & i).Copy Worksheets("Feuil1").Range("Q62")
.Range("I" & i).Copy Worksheets("Feuil1").Range("O56:P56")
.Range("K" & i).Copy Worksheets("Feuil1").Range("O55:P55")
.Range("L" & i).Copy Worksheets("Feuil1").Range("O57")
.Range("P" & i).Copy Worksheets("Feuil1").Range("L56")
.Range("Q" & i).Copy Worksheets("Feuil1").Range("L57")
.Range("R" & i).Copy Worksheets("Feuil1").Range("L58")
Worksheets("Feuil1").PrintOut From:=1, To:=2, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
Next i
End With
MsgBox "Fini!!"
Else: MsgBox "Séquence annulée"
End If
End SubAttention aux cellules fusionnées dans ta feuille1, j'ai du modifier le code sinon cela buggue. Avec VBA à éviter !
Si ok, clique sur le V vert à coté du bouton EDITER lors de ta réponse afin de cloturer le fil
Amicalement
Bonjour Dan!
Merci, ça marche super bien!!!
C'est trés rapide en exécution!
Tu peux m'expliquer:
Dim i As Integer
Dim demande As StringEt, est ce que dans ton code je peux ajouter une condition? (pour une autre impression..)
Du style si dans la colonne A = "UnMot" que ça imprime une feuille en plus ("feuil2") avec les mêmes informations copiés?
Re,
Et, est ce que dans ton code je peux ajouter une condition? (pour une autre impression..)remplace le code que je t'ai donné par celui-ci :
Sub test()
'Macro Dan 10/04/13
Dim i As Integer
Dim demande As String
demande = MsgBox("voulez vous lancer la macro?", vbYesNo + vbQuestion + vbDefaultButton2)
If demande = vbYes Then
With Worksheets("02")
For i = 13 To Range("A" & Rows.Count).End(xlUp).Row
.Range("A" & i).Copy Worksheets("Feuil1").Range("L55")
.Range("B" & i).Copy Worksheets("Feuil1").Range("R58:R59")
.Range("C" & i).Copy Worksheets("Feuil1").Range("Q61")
.Range("D" & i).Copy Worksheets("Feuil1").Range("Q62")
.Range("I" & i).Copy Worksheets("Feuil1").Range("O56:P56")
.Range("K" & i).Copy Worksheets("Feuil1").Range("O55:P55")
.Range("L" & i).Copy Worksheets("Feuil1").Range("O57")
.Range("P" & i).Copy Worksheets("Feuil1").Range("L56")
.Range("Q" & i).Copy Worksheets("Feuil1").Range("L57")
.Range("R" & i).Copy Worksheets("Feuil1").Range("L58")
Worksheets("Feuil1").PrintOut From:=1, To:=2, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
If .Range("A" & i) = "unmot" Then
.Range("A" & i).Copy Worksheets("Feuil2").Range("L55")
.Range("B" & i).Copy Worksheets("Feuil2").Range("R58:R59")
.Range("C" & i).Copy Worksheets("Feuil2").Range("Q61")
.Range("D" & i).Copy Worksheets("Feuil2").Range("Q62")
.Range("I" & i).Copy Worksheets("Feuil2").Range("O56:P56")
.Range("K" & i).Copy Worksheets("Feuil2").Range("O55:P55")
.Range("L" & i).Copy Worksheets("Feuil2").Range("O57")
.Range("P" & i).Copy Worksheets("Feuil2").Range("L56")
.Range("Q" & i).Copy Worksheets("Feuil2").Range("L57")
.Range("R" & i).Copy Worksheets("Feuil2").Range("L58")
Worksheets("Feuil2").PrintOut From:=1, To:=2, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
End If
Next i
End With
MsgBox "Fini!!"
Else: MsgBox "Séquence annulée"
End If
End SubPour les Dim, il s'agit d'une déclaration de variable pour ton code. En gros, cela permet d'allouer un espace mémoire à la variable définie et qu'excel va utiliser pour exécuter le code. Ici ce n'est pas important mais dans de gros programmes cela a une implication sur la rapidité par exemple. Ne pas le mettre revient à laisser excel faire tout seul. Donc bonne pratique à suivre.
Si ok oublie pas de cloturer le fil
Amicalement
Bonsoir Dan,
Merci pour la rapidité de tes réponses !
Pourquoi dans la déclaration de variable c'est "i"?
Concernant le second code, il ne fonctionne pas selon mes besoins, je me suis sans doute mal expliqué.
La macro se lance, mais ne sort qu'une impression et s'arrête après.
Il faudrait que ça copie/colle les informations, mais que ça imprime que quand il y a "cemot" dans la colonne A?
J'ai essayé d'enlever juste la 1ère partie du code
Sub test()
'Macro Dan 10/04/13
Dim i As Integer
Dim demande As String
demande = MsgBox("voulez vous lancer la macro?", vbYesNo + vbQuestion + vbDefaultButton2)
If demande = vbYes Then
With Worksheets("02")
For i = 13 To Range("A" & Rows.Count).End(xlUp).Row
If .Range("A" & i) = "unmot" Then
.Range("A" & i).Copy Worksheets("Feuil2").Range("L55")
.Range("B" & i).Copy Worksheets("Feuil2").Range("R58:R59")
.Range("C" & i).Copy Worksheets("Feuil2").Range("Q61")
.Range("D" & i).Copy Worksheets("Feuil2").Range("Q62")
.Range("I" & i).Copy Worksheets("Feuil2").Range("O56:P56")
.Range("K" & i).Copy Worksheets("Feuil2").Range("O55:P55")
.Range("L" & i).Copy Worksheets("Feuil2").Range("O57")
.Range("P" & i).Copy Worksheets("Feuil2").Range("L56")
.Range("Q" & i).Copy Worksheets("Feuil2").Range("L57")
.Range("R" & i).Copy Worksheets("Feuil2").Range("L58")
Worksheets("Feuil2").PrintOut From:=1, To:=2, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
End If
Next i
End With
MsgBox "Fini!!"
Else: MsgBox "Séquence annulée"
End If
End SubRe,
Dans le code à cette ligne -->
If .Range("A" & i) = "unmot" Thenj'ai mis --> "unmot" mais il faut le remplacer par ce que tu veux controler. Si c'est "cemot", remplace "unmot" par "cemot"
Amicalement
Oui oui, j'avais fait le changement.
re,
Et ?? c'est bon ou pas ?
A moins que j'ai pas compris ton besoin. Dans le code que je t'ai proposé, il imprime toujours la feuille 1 et si le mot est rencontré en colonne A il imprime la feuille 1 et la feuille 2.
Pourquoi dans la déclaration de variable c'est "i"?
le i n'a pas d'importance, tu peux choisisr n'importe quoi, si tu mets Federov (ou Federer...
Oublie pas de cloturer le fil si ta demande est terminée. Clique sur le V vert à coté du bouton EDITER lors de ta réponse
Amicalement
Bonjour Dan
Mais pour l'info sur le "i" :p
Alors pour le second code, non c'est pas bon
Le code est pratiquement similaire au 1er.
Il faut juste que ça imprime la feuil2 Si dans la Colonne A il y a "unmot", et pas les autres qui peuvent y être.
Ou alors que ce code copie et colle les infomations dans la feuill2 que si "cemêmemot" apparait dans la colonne A et s'arrête une fois qu'il n'y a plus rien a copier?
Je sais pas si je suis bien clair :/
re,
C'est juste une question de bien placer l'instrcution SI
Déso mais pour bien comprendre
si "unmot" en colonne A, tu imprimes uniquement la feuille 2
Si pas "unmot" en colonne A, tu imprimes uniquement la feuille 1
A te relire
Re,
Alors c'est si "unmot" en colonne A = impression de la feuille 2
Si autre mot ne rien faire et passer à la ligne suivante.
Si plus de ligne arrêter la macro
On va y arriver
re,
Ok mais quid de la feuille 1, tu ne l'imprimes plus ? C'était le sujet de ta demande là...
Sinon tu fais ceci :
Sub test()
'Macro Dan 10/04/13
Dim i As Integer
Dim demande As String
demande = MsgBox("voulez vous lancer la macro?", vbYesNo + vbQuestion + vbDefaultButton2)
If demande = vbYes Then
With Worksheets("02")
For i = 13 To Range("A" & Rows.Count).End(xlUp).Row
If .Range("A" & i) = "unmot" Then
.Range("A" & i).Copy Worksheets("Feuil2").Range("L55")
.Range("B" & i).Copy Worksheets("Feuil2").Range("R58:R59")
.Range("C" & i).Copy Worksheets("Feuil2").Range("Q61")
.Range("D" & i).Copy Worksheets("Feuil2").Range("Q62")
.Range("I" & i).Copy Worksheets("Feuil2").Range("O56:P56")
.Range("K" & i).Copy Worksheets("Feuil2").Range("O55:P55")
.Range("L" & i).Copy Worksheets("Feuil2").Range("O57")
.Range("P" & i).Copy Worksheets("Feuil2").Range("L56")
.Range("Q" & i).Copy Worksheets("Feuil2").Range("L57")
.Range("R" & i).Copy Worksheets("Feuil2").Range("L58")
Worksheets("Feuil2").PrintOut From:=1, To:=2, Copies:=1, Collate _
:=True, IgnorePrintAreas:=False
End If
Next i
End With
MsgBox "Fini!!"
Else: MsgBox "Séquence annulée"
End If
End SubA te relire
Salut Dan!
Désolé j'ai pas pu essayer avant maintenant...
Alors avec ce code, la macro se termine dès le lancement
J'ai bien le message de lancement est de suite après le message de fin, j'ai bien changé le "mot"
Si si la feuil1 je l'imprime toujours (encore merci!!), la c'est une variable parmi la variable du nombre de lignes au quotidien
re
J'ai bien le message de lancement est de suite après le message de fin, j'ai bien changé le "mot"
Attention que ce code là, n'est que pour imprimer la feuille 2, si cela fait cela c'est que tu n'as pas le mot dans ta colonne. Attention aux majuscules et minucules. Cela doit correspondre au mot dans le code
J'ai pas l'impression que l'on ne se comprend ou que tu ne lis pas bien ce que j'écris car si tu me reparles de la feuille 1 c'est que ce que je t'écrivais dans ce post --> Ven Avr 12, 2013 12:08 pm, est ce que tu veux.
Eventuellement remets le fichier sur lequel tu testes ce que je te donne.
A te relire
Salut Dan!
Et bien écoute, tout fonctionne à merveille !!
En refaisant un fichier light, et en retestant aussi, et bien tout fonctionne..
Sur mon fichier il doit y avoir une "couille"
Je valide le poste et je te remercie pour tout le temps que tu m'as consacré !!!
Je repasserai en cas de soucis