Diminuer le nombre de macros
Bonjour à tous,
J'ai créé une macro afin de copier/coller/trier et imprimer des données d'une feuille à l'autre. J'ai 34 feuilles au total. Ce qui fait que je dois répéter la macro 34 fois.
Est-ce possible de créer une seule macro pour faire la même tâche ? Voir fichier en pièce jointe. Le fichier en pièce jointe ne comprend que 10 semaines mais le fichier original comprend 34 semaines.
Merci de votre aide.
bonjour
Faudrait nommer les semaines autrement. (mauvais idée d'utiliser le . )
on peut nommer les feuilles comme ceci "sem1, sem2....") et sur cette base essayer ce code
Sub ImprimerSem01()
Application.ScreenUpdating = False
Sheets("Données").Select
Range("BE2:BH18").Copy
Range("BI2").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
With ActiveWorkbook.Worksheets("Données")
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=Range("BL3:BL18"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("BI2:BL18")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
For i = 1 To 34
On Error Resume Next
Sheets("Sem" & i).Select
Range("CD177:CS222").Copy
With Sheets("Stats d'équipe")
.Select
.Range("B3").PasteSpecial Paste:=xlPasteValues
.PrintOut Copies:=1
End With
On Error GoTo 0
Next
End SubSi ok, merci de cloturer le fil en cliquant que la case à coche verte à coté du bouton EDITER
Cordialement
Bonjour Dan,
Merci pour ta réponse rapide. J'ai modifié le nom de semaines tel que suggéré.
Le code fonctionne très bien. J'ai du faire deux modifications au code : " For i = 1 to 1 plutôt que 1 to 34. Ainsi que le range Sheets' ("sem" & i) passe de CD177 à CD175.
J'aurais du spécifier que je n'ai besoin que d'une copie des Stats. d'équipe par semaine. Concernant le range j'aimerais, si possible ajouter un tri avant l'impression. J'ai essayé de l'ajouter à ton code sans succès.
J'aimerais trier la plage B3:Q19 de la feuille "Stats. d'équipe" avant l'impression de la feuille. Est-ce possible d'ajouter le tri à ton code
Autre détail, la date indiquée sur chacune des feuilles Sem1:Sem34 ne change pas sur la feuille Stats. d'équipe. Elle montre toujours la date de la Sem1. Est-ce possible que la date suive celle de chacune des feuilles "Sem " au moment de l'activation du code.
Merci beaucoup pour ton aide.
re
Le code fonctionne très bien. J'ai du faire deux modifications au code : " For i = 1 to 1 plutôt que 1 to 34. Ainsi que le range Sheets' ("sem" & i) passe de CD177 à CD175.
For i = 1 to 1, ne sert à rien car dans ce case tu sera toujours avec la semaine 1. Par contre si je comprends, cela voudrait que l'on exécute le code en étant sur une des feuilles Sem... au choix ?
J'aimerais trier la plage B3:Q19 de la feuille "Stats. d'équipe" avant l'impression de la feuille. Est-ce possible d'ajouter le tri à ton code
Oui c'est possible mais en fonction de quel critère ?
Cordialement
Bonjour Dan,
Merci pour l'intérêt que tu portes à mon problème.
Concernant "For i = 1 To 1" lorsque j'ai imprimé la première fois il s'est imprimé 34 copies. J'ai changé le 34 pour 1 dans le code et il s'est imprimé qu'une seul copie. Alors j'ai pensé que le tout était joué. C'est la différence entre toi et moi. Tu sait ce que tu fais alors que moi je patine plus qu'autre chose. J'essaie d'apprendre.....
Il faut savoir que les données dans la colonne BH de la feuille "Données" changent à chaque semaine.
Ce que j'aimerais c'est que le bouton de chacune des semaines (1 à 34) active qu'une seul code plutôt que 34 et que les données de chaque semaine s'impriment semaine après semaine avec le changement de date.
Pour ce qui est du tri B3:Q19, le tri se fait à partir de la cellule P3 du plus grand au plus petit. Ce qui aura comme résultat de placer les équipes en rang de 1 à 16 dans la colonne A.
Merci encore pour ton aide. C'est très apprécié.
Re,
Ok pour le bouton mais où se trouvera le bouton dans le fichier. Sur chaque feuille semaine ou ailleurs
Crdlt
Bonjour Dan,
Sur chaque feuille semaine de 1 à 34.
Merci
re
Essaie avec ce code
Sub ImprimerStatsdequipe()
Application.ScreenUpdating = False
With Sheets("Données")
.Range("BE2:BH18").Copy
.Range("BI2").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
With .Sort
.SortFields.Clear
.SortFields.Add Key:=Range("BL3:BL18"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
.SetRange Range("BI2:BL18")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
ActiveSheet.Range("CD175:CS222").Copy
With Sheets("Stats_equipe")
.Range("N1").Value = ActiveSheet.Name
.Select
.Range("B1").PasteSpecial Paste:=xlPasteValues
With .Sort
.SortFields.Clear
.SortFields.Add Key:=Range("P3:P19"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
.SetRange Range("B3:Q19")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
.PrintOut Copies:=1
End With
End SubLe code est à associer à chaque bouton qui sera placé sur les feuilles Sem1 à Sem34
Autres petits conseils, évite :
- les accents et les espaces dans les noms de feuilles et noms utilisés dans les codes (exemple Stat équipe). Cela pose toujours souci un jour ou l'autre.
A cette fin, renomme la feuille "Stats d'équipe" par --> "Stats_equipe" et la feuille Données par "Donnees". Le code est déjà adapté en fonction
- Les couleurs appliquées à l'entièreté d'une feuille lorsque les cellules ne contiennent pas de données ou une couleur blanche de fond inutile. Là les options excel permettent de ne pas monter les cellules et désactivant le quadrillage.
Sinon, c'est un joli fichier
Si ok, veille à clôturer le fil en cliquant sur la case à cocher verte à coté du bouton EDITER. (pour réouvrir le fil, il suffit de reclouer sur cette case devenue rouge)
Cordialement
Bonjour Dan,
Merci beaucoup pour ta réponse rapide. Le code fonctionne parfaitement.
Merci pour les conseils concernant la mise en page. Je vais les appliquer dès maintenant.
Je ferme le dossier
Bonne journée.
Bonjour Dan,
Je m'excuse de revenir sur un dossier fermé mais j'ai un problème, que j'espère tu pourras régler, si ça t'intéresse de retravailler un vieux dossier.
J'essaie d'utiliser ton code afin de copier/coller et imprimer un autre tableau (Billets_capitaines) situé au côté du tableau Stats_equipe en utilisant le bouton Imprimer. Ça me cause un problème.
J'ai créé la macro BilletsCapitaines en copiant une partie de ton code qui transfère les données de la plage CD175:CS222 que je peux activer avec le bouton Billets. Tout fonctionne parfaitement. (Ne pas regarder le collage et l'impression, je n'ai pas pris la peine de centrer les données sur les feuilles. Sans incidence sur la recherche).
Si j'ajoute Call ImprimerBillets à la fin du code Statsdequipe et que j'active le code avec le bouton Imprimer, les données de la plage CU175:CY418 ne se transfèrent pas sur la feuille Billets_capitaines, mais le code imprime les feuilles vide, sans données. Je ne comprend pas pourquoi le code fonctionne parfaitement avec le bouton Billets mais ne fonctionne qu'à moitié avec le bouton Imprimer. Il ne transfère pas les données mais imprime les feuilles.
Merci beaucoup pour ton aide.
Re
Si j'ajoute Call ImprimerBillets à la fin du code Statsdequipe et que j'active le code avec le bouton Imprimer, les données de la plage CU175:CY418 ne se transfèrent pas sur la feuille Billets_capitaines,
Normal je pense car le bouton Imprimer se trouve sur la feuille "semxx", tandis que lorsque tu as fini le premier code Imprimer "statsequipe", tu es sur la feuille "Statequipe" et non sur la feuille où se trouve le bouton.
Si tu utilises le CALL dans le premier code, essaie le code "imprimerbillets" plutôt comme ceci:
Sub ImprimerBillets()
Dim feuille As String
feuille = Sheets("Stats_equipe").Range("N1")
Sheets(feuille).Range("CU175:CY418").Copy
With Sheets("Billets_Capitaines")
.Range("E5").Value = Sheets(feuille).Name
.Select
.Range("A1").PasteSpecial Paste:=xlPasteValues
.PrintOut Copies:=1
End With
End SubCe code ne fonctionnera normalement que si tu l'exécutes à partir du premier (via le CALL)
J'ai enlevé le range("A1").select car il ne sert à rien il me semble. De même dans l'autre code où tu termines par range("A2").select
D'une manière générale, évite les SELECT quand tu peux, cela ralentit l'exécution du code
Bonjour Dan,
Encore une fois merci beaucoup pour ton aide. Le code fonctionne parfaitement.
Je vais suivre ton conseil et éviter les "Select" pour mes prochains codes.
Merci encore et passe une excellente journée
Je ferme le dossier, et cette fois j'espère que ce sera le dernière fois.