Activer une sub sur toutes les feuilles

Bonjour,

Après avoir lu maints et maints topics sur la répétition d'une macro sur toutes les feuilles, je sèche. Ma macro marche bien sur une feuille, mais elle ne veut pas se repeter sur les autres...

C'est du code VBA pour excel.

En gras ce que j'ai rajouté pour la faire boucler sur toutes les feuilles :

Sub Auto_Open()

Dim sh As Worksheet

With ActiveWorkbook
For Each sh In Worksheets
With sh


Dim TODAY As Integer
TODAY = NoSemaineISO(Now)

For Each d In Range("A4:HP5")
If d.Value = TODAY Then
Application.Goto d.Offset(0, 0)
Application.Goto d.Offset(0, 45)
Application.Goto ActiveCell.Offset(2, -45)
End If
Next

End With
Next sh
End With

End Sub

Merci de votre aide

6 réponses

  1. Bonjour Marillies,

    Et si tu places ton code dans un module? Cela ne résoudrait pas ton problème?
    0
    1. C'est déjà dans un module donc non ça ne résoud pas mon problème :).
      0
      1. Dans un module, j'ai créé un Public Sub.

        Dans chaque feuille, j'ai créé un évènement OnChange et dans le OnChange, j'ai fait un

        Call FonctionContenueDansModule(Argument)


        J'ai essayé en faisant cet appel sur chaque feuille, m'évitant de retaper toute la macro à chaque fois et ça fonctionne.

        0
        1. Modérateur
          Bonjour,
          1- je ne comprends pas l'utilité de cette procédure...
          Application.Goto d.Offset(0, 45) ?????
          Mais bon cela ne me regarde pas.

          2- Lorsque tu utilises des "With Sheets(1) ... End With", pour agir sur la feuille 1, il faut ajouter un point . devant les objets que tu souhaites manipuler.
          Exemple :
          Sheets(1).Select 'tu sélectionnes la feuille 1 (select à éviter, c'est juste pour l'exemple) 
          With Sheets(2) 
              Range("A10").Value = 100 ' sans le point devant Range, va agir sur la Feuille 1 (feuille sélectionnée préalablement)
              .Range("A10").Value = "ABCD" 'va agir sur la feuille 2 (feuille concernée par le with)
          End With

          Cordialement,
          Franck P
          0
          1. Heremion : Je ne comprend pas. Il faut que je l'écrive dans chaque feuille ?

            Pijaku : 1- C'est une bidouille de mon prédécesseur que je n'ai pas l'autorisation de modifier. Cela centre sur le numéro de la semaine en cours.

            2- Est ce que tu peux me montrer dans ma macro ou est ce que je dois modifier directement, parce que j'ai essayé de mettre des sh. mais ça bug.
            -> Autre question : il faut que je mette le nom de la feuille à chaque fois, ou sh remplace ce nom la ?

            -> Je ne suis pas informaticienne de base ^^
            0
            1. Modérateur
              Ta macro modifiée, comme ça devrait fonctionner ... ou pas (non testé) :
              Sub Auto_Open()  
              Dim sh As Worksheet  
              Dim TODAY As Integer  
              Dim d As Range 
              
              For Each sh In ThisWorkbook.Worksheets  
                  With sh  
                      TODAY = NoSemaineISO(Now)  
                      For Each d In .Range("A4:HP5") 'j'ai ajouté un point devant Range 
                          If d.Value = TODAY Then  
                              Application.Goto d.Offset(0, 0)  
                              Application.Goto d.Offset(0, 45)  
                              Application.Goto ActiveCell.Offset(2, -45)  
                          End If  
                      Next d 
                  End With  
              Next sh  
              End Sub 
              0
            2. Il me dit incompatibilité de type sur la ligne
              If d.value = TODAY Then
              0
            3. Modérateur
              Que contient ta fonction NoSemaineISO?
              Function NoSemaineISO()
              ??????
              End function
              0
            4. Pour trouver le numéro de la semaine en fonction de la date d'aujourd'hui.

              Function NoSemaineISO(d As Date) As Integer
              NoSemaineISO = Format(d, "ww", vbMonday, vbFirstFourDays)
              End Function
              0
            5. Modérateur
              Alors essaye ceci :
              Sub Auto_Open()
              Dim sh As Worksheet
              Dim TODAY As Integer
              Dim Cel As Range

              For Each sh In ThisWorkbook.Worksheets
              With sh
              TODAY = NoSemaineISO(Now)
              For Each Cel In .Range("A4:HP5") 'j'ai ajouté un point devant Range
              If Cel.Value = TODAY Then
              Application.Goto Cel.Offset(0, 0)
              Application.Goto Cel.Offset(0, 45)
              Application.Goto ActiveCell.Offset(2, -45)
              End If
              Next Cel
              End With
              Next sh
              End Sub
              0
          2. En fait, tu mets ta fonction ou ton sub dans le module Module1 par exemple, précédé bien évidemment du mot "public".

            Et dans chaque feuille, dans l'évènement sur lequel tu veux que ton code s'exécute, tu fais un
            Call TaFonctionDuModule(argument)

            0
            1. Il y a vraiment beaucoup de feuilles, je cherchais quelque chose de moins répétitif.
              0