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.

11classeur1.xlsm (146.32 Ko)

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 Sub

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

13classeur1v1.xlsm (146.84 Ko)

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 Sub

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

4classeur1v1.xlsm (161.57 Ko)

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 Sub

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

Rechercher des sujets similaires à "diminuer nombre macros"