Instructions identiques macro

Bonjour,

J'ai une macro qui me permet de faire des filtres élaborés sur 4 onglets.
Je souhaiterais savoi s'il est possible "raccourcir" la macro.

Les instructions sont 4 fois les mêmes ;
Sheets(1er filter). Sélect
Range(A6). Sélect
Sheets(BDD).columns(a:i).advancedfilter action:=xlfiltrecopy,_criteriarange=range(a1:c3), copytorange:=range(1er filtre!extraction)_, unique:=false


Et ainsi de suite pour les 3 autres onglets.

De plus j'ai rajouter une somme :

Dim derlig As Long
Sheets(1er filtre).select
derlig = Range("D65536").End(xlUp).Row
Cells(derlig + 1, 4) = Application.Sum(Range("D2:D" & derlig))
End Sub


La encore 4 fois la même instruction...

Y a t i' un moyen plus adapté ?
Je bidouille depuis peu...

Merci d'avance


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

2 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,

    Envoyé sans copier-coller depuis un iPhone... quel courage !
    Il y a peut-être moyen d'utiliser une boucle For sur les rangs des onglets :
    For i = 1 To 4
    Sheets(i).Select
    ...
    Next i
    1. Pas de connexion internet, donc on s'adapte ! Et j'apprends en même temps...

      J'essaye mais étant depuis peu sur vba c'est compliqué !
      Il faut mettre (si j'ai compris) ;
      for i = 1 to 4
      Sheets (i).select
      Range(A6). Sélect
      Sheets(BDD).columns(a:i).advancedfilter action:=xlfiltrecopy,_criteriarange=range(a1:c3), copytorange:=range(1er filtre!extraction)_, unique:=false
      Next i

      Dim derlig as long
      For i = 1 to 4
      Sheets(i).select
      derlig = Range("D65536").End(xlUp).Row
      Cells(derlig + 1, 4) = Application.Sum(Range("D2:D" & derlig))
      Next i
      End Sub
    2. Ou (dans une seule boucle For)
      Sub essai()
      Dim derlig as Long
      For i = 1 to 4
      Sheets (i).select
      Range(A6). Sélect
      Sheets(i).columns(a:i).advancedfilter action:=xlfiltrecopy,_criteriarange=range(a1:c3), copytorange:=range(1er filtre!extraction)_, unique:=false
      derlig = Range("D65536").End(xlUp).Row
      Cells(derlig + 1, 4) = Application.Sum(Range("D2:D" & derlig))
      Next i
      End Sub

      ou quelque chose d'approchant
  2. Contributeur
    Bonjour,

    Pour parcourir toutes les feuilles voir ceci:

    https://silkyroad.developpez.com/vba/boucles/#LII

      Dim Ws As Worksheet
        
        'Boucle sur les feuilles du classeur.
        For Each Ws In ThisWorkbook.Worksheets
           '
           '
            'mettre le code ici
           '
        Next Ws


    tu remplaces 1er filter par Ws

    @+ Le Pivert
    1. Bonjour Le Pivert,

      C'est toujours bon à rappeler... ou à enseigner dans ce cas.
      A souligner : il y a peut-être plus que 4 onglets.

      A+
    2. Merci de vos retours je vais étudier tout ça, pour le moment c'est un peu abstrait mais le lien semble assez "pédagogique"
    3. Contributeur
      Je vois quand même une chose dans cette ligne:

      Sheets(1er filter). Sélect


      il faut mettre le nom de la feuille entre guillemets comme ceci:

      Sheets("1er filter"). Sélect


      et je me pose des questions sur cela aussi!

      range(1er filtre!extraction)


      Et pour finir en haut du module ( là où ce trouve ton code) mets ceci:
      Option Explicit
      , cela t'obligera à déclarer toutes tes variables

      @+
    4. Contributeur
      @Zoul67C'est pour cela que la boucle
       For Each Ws In ThisWorkbook.Worksheets
      est plus adapter

      @+
    5. @cs_Le PivertC'est pour cela que la boucle For Each Ws In ThisWorkbook.Worksheets est plus adapter

      Je l'ai compris exactement à l'inverse...
      Si le traitement n'est à faire que sur 4 onglets (parmi 10 p. ex.) For Each tout seul ne convient pas.