Appel d'une macro "permanente"

Résolu
Bonjour,
J'ai créé des collections permettant de répertorier les noms de mes onglets dans ces collections. Cette macro, je l'ai placé dans "thisworkbook".
Sub Workbook_open()

ong_tous.Add Sheets("feuil1")
ong_tous.Add Sheets("feuil2")
ong_tous.Add Sheets("feuil3")
ong_tous.Add Sheets("feuil4")
ong_tous.Add Sheets("feuil5")
ong_tech.Add Sheets("feuil3")
ong_tech.Add Sheets("feuil4")
ong_tech.Add Sheets("feuil5")

End Sub

Mon problème, c'est que je teste beaucoup de macros qui ont besoin de cette macro. Mais dès que j'appuie sur le bouton "réinitialiser", je suis obligé de retourner dans "thisworkbook" et lancer la macro...

J'aimerai ne pas avoir à faire cela et que mes 2 collections soient enregistrées une bonne fois pour toutes dans mon fichier excel.

5 réponses

  1. "un module standard ,pas un module de feuille, ni module ThisWorkbook, ni module de classe!"

    Quelle est la différence entre chaque ? (désolé mais je débute...)
    1. Modérateur
      Un module de feuille : fait référence à une feuille spécifiquement. Tu y accèdes :
      - sous VBE en double cliquant sur "Feuil1" (par exemple) dans la fenêtre VBA-Project (en haut à gauche de ta fenêtre VBE)
      - depuis ta feuille en cliquant droit sur l'onglet / visualiser le code.
      C'est dans ce type de module que tu fais intervenir les événements de ta feuille : Selection_Change(), Change() etc...

      Le module ThisWorkbook. Tu y accèdes, sous VBE en double cliquant sur ThisWorkbook dans la fenêtre VBA-Project (en haut à gauche de ta fenêtre VBE)
      Ce module te donne accès aux événements liés au classeur :
      WorkBooks_Open() : lors de l'ouverture du classeur
      Before_Close : avant la fermeture
      Tu peux donc déclencher automatiquement, grâce à ces événements, des codes.
      Par exemple : enregistrer systématiquement avant la fermeture.

      Les modules de classe, c'est un poil plus compliqué. Ils servent à créer des classes. Un peu de lecture à ce sujet.

      Sinon, la macro fonctionne????
    2. J'ai mis ma fonction dans le module où j'ai toutes mes macros et c'est PARFAIT!
      Merci beaucoup de ton aide
    3. Modérateur
      de rien!
      A+
  2. Modérateur
    Bonjour,

    J'ai compris alors.
    Plutôt que d'utiliser des Objets Collection, je te recommande d'utiliser des petites fonctions qui vont considérablement alléger ton code.

    Par exemple, pour ne s'occuper que des feuilles paires ou que des feuilles impaires :
    Fonctions à placer dans un module standard (pas un module de feuille, ni module ThisWorkbook, ni module de classe!)
    Function TabFeuillesPaires() As Variant 
    TabFeuillesPaires = Array("Feuil2", "Feuil4", "Feuil6", "Feuil8", "Feuil10", "Feuil12", "Feuil14") 
    End Function


    Function TabFeuillesImpaires() As Variant 
    TabFeuillesImpaires = Array("Feuil1", "Feuil3", "Feuil5", "Feuil7", "Feuil9", "Feuil11", "Feuil13") 
    End Function


    Et donc, ensuite, pour "appeler" uniquement les feuilles qui t'intéressent, dans une Sub, dans un événement (Workbook_Open, UserForm_Initialize, etc...) :
    Sub Test() 
    Dim Wsh As Worksheet 
    
    For Each Wsh In ThisWorkbook.Worksheets(TabFeuillesPaires) 
        Debug.Print Wsh.Name 
    Next 
    End Sub

    Cordialement,
    Franck P
    1. Modérateur
      La réponse généraliste à ta question est :
      1- tu places ton code récurrent dans un module standard
      ex :
      Sub RempliColl()
      ong_tous.Add Sheets("feuil1") 
      ong_tous.Add Sheets("feuil2") 
      ong_tous.Add Sheets("feuil3") 
      ong_tous.Add Sheets("feuil4") 
      ong_tous.Add Sheets("feuil5") 
      ong_tech.Add Sheets("feuil3") 
      ong_tech.Add Sheets("feuil4") 
      ong_tech.Add Sheets("feuil5")
      End Sub

      2- tu appeles cette macro de ou tu veux
      ex :
      Sub Workbook_open() 
      Call RempliColl
      End Sub
      1. En fait chaque feuille a un nom spécifique. Chaque collection regroupe certaines de ces feuilles (pas toutes...).
        Concrètement j'ai 9 onglets, dans ces neuf onglets, 5 appartiennent a une collection, et d'ailleurs, 3 onglets de cette collection sont dans une deuxieme collection..
        1. Modérateur
          Question complémentaire : Tu te sert de ces collections pour quoi?
          En fait, selon l'utilité d'une collection ou non, nous saurons t'orienter vers une solution.
        2. je m'en sers pour faire du for each.
          for each sh in on_tous
          .
          .
          next sh
      2. Modérateur
        Bonjour,

        Question préalable : à quoi peut bien servir de stocker les feuilles dans une collection alors qu'elles le sont déjà par définition ?
        Extrait de l'aide VBA :
        L'objet Worksheet appartient à la collection Worksheets. La collection Worksheets contient tous les objets Worksheet d'un classeur.

        L'objet Worksheet appartient également à la collection Sheets. La collection Sheets contient toutes les feuilles du classeur (aussi bien les feuilles de graphique que les feuilles de calcul).


        Cordialement,
        Franck P