Nom de la feuille automatique par rapport à une cellule

Résolu
Liitch Messages postés 78 Statut Membre -  
Liitch Messages postés 78 Statut Membre -
Bonjour à tous,

J'ai un fichier annuel qui contient autant de feuille que de semaine dans l'année, soit 52.
Vu que ce fichier est réactualisé chaque année. On modifie seulement le n° de semaine de la première feuille et ensuite les n° de semaine des autres feuilles font +1 automatiquement. (Pour éviter de réécrire manuellement chaque n° de semaine)

J'aimerai une macro qui permet de prendre le numéro de la semaine inscrit en C1 de chaque feuille et qui renomme l'onglet comme tel.

Pour l'instant j'ai cette macro que j'ai trouvé sur un autre forum :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Application.Intersect(Target, Range("C1")) Is Nothing Then
ActiveSheet.Name = Format(Range("C1"), "00")
End If
End Sub

Cependant, le nom de l'onglet ne se met pas automatiquement quand la valeur en C1 est changée. Il faut que je clique en C1 de chaque feuille et faire "entrer" pour que ça change le nom de l'onglet.
Étant donné que j'ai 52 feuilles, c'est assez contraignant...

Je pense qu'il faut juste adapter la macro, mais je débute en VBA et je n'y arrive pas.

J'espère avoir bien expliquer mon problème pour que vous puissiez trouver la solution.

Merci d'avance pour votre aide !



--
Bye bye
« Avant de rêver, il faut savoir. »

1 réponse

  1. valentin
     
    Bonjour Liitch,

    Fichier Excel 2007 : https://mon-partage.fr/f/g4NMpjlz/

    Il y a 15 feuilles de "01" à "15" ; sur la 1ère feuille, saisis en C1 :

      2 => "02" à "16"
      3 => "03" à "17"
    45 => "45" à "52", puis "01" à "07"

    ⚠  En C1 de la 1ère feuille du classeur, tu dois saisir un nombre,
    sinon la macro plante ; tu dois saisir un nombre entre 1 et 52 ;
    ça ne vérifie pas si ton nombre est correct.

    Alt F11 pour voir la macro, puis revenir sur Excel.

    -----------------------------------------

    Dans ton vrai classeur :

    ⚠  Si ta 1ère feuille se nomme "01" (par exemple), la formule en C1 de la
    feuille "02" ne doit pas être ='01'!C1+1 mais : =MOD('01'!C1;52)+1

    Formule en C1 de la feuille "03" : =MOD('02'!C1;52)+1
    Formule en C1 de la feuille "04" : =MOD('03'!C1;52)+1
    Formule en C1 de la feuille "05" : =MOD('04'!C1;52)+1

    etc...

    Ce code VBA est à mettre dans le code de la 1ère feuille du classeur :

    
    Option Explicit
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Dim FX As Byte, k As Byte
      If Target.Address = "$C$1" Then
        Application.ScreenUpdating = False: k = Worksheets.Count
        For FX = 1 To k: Worksheets(FX).Name = "T" & FX: Next FX
        For FX = 1 To k
          Worksheets(FX).Name = Format(Worksheets(FX).[C1], "00")
        Next FX
      End If
    End Sub
    
    

    Ça renomme en 2 temps pour éviter l'erreur de renommage
    d'une feuille par une autre déjà existante.

    Merci de me donner ton avis.

    Cordialement
     
    1
    1. Liitch Messages postés 78 Statut Membre
       
      Bonjour valentin,

      Merci pour ta réponse !

      Ca fonctionne mais quand je change le premier n° de semaine et que je re-clique dessus pour que les onglets se renomment (le 2e temps que tu as mentionné). Une fenêtre s'ouvre et marque :
      Erreur d'exécution '1004':
      Erreur définie par l'application ou par l'objet

      Avec comme possibilité de cliquer sur "Fin", "Débogage" et "Aide"

      Quand je clique sur "Débogage", ça m'ouvre la fenêtre pour visualiser le code et une partie du code est surlignée en jaune :

      Worksheets(FX).Name = Format(Worksheets(FX).[C1], "00")
      0
    2. valentin > Liitch Messages postés 78 Statut Membre
       
       
      Non, quand j'ai écris : « Ça renomme en 2 temps », c'est seulement parce que
      dans le code VBA, il y a d'abord la ligne #8 : ça renomme avec "T" devant
      (j'ai choisi "T" car c'est l'initiale de "Temporaire") ; ceci est le 1er renommage ;
      ensuite le 2ème renommage est fait par la ligne #10.

      Sur la 1ère feuille de ton classeur Excel, il faut juste entrer en C1 un nombre
      entre 1 et 56 ; dès que tu fais Entrée, c'est ok : tu n'as pas besoin de faire un
      double-clic sur le nombre !  ;)

      Merci de me dire si après ces nouvelles infos, ton problème est réglé ;
      si oui, merci de passer le sujet en résolu ; sinon, à te lire.
       
      0
    3. Liitch Messages postés 78 Statut Membre
       
      D'accord pour les 2 temps, je n'avais pas bien compris !

      Par contre, quand je rentre un nombre entre 1 et 52 en C1 dans la 1ère feuille du classeur et que je fais Entrée. Ca ne renomme pas directement l'ensemble des onglets.
      Il faut que je clique (1 seul clic pas un double-clic) pour que ça actualise les noms des onglets.
      Et quand je clique sur C1, là ça m'ouvre un message d'erreur avec écrit :
      Erreur d'exécution '1004':
      Erreur définie par l'application ou par l'objet

      Avec comme possibilité de cliquer sur "Fin", "Débogage" et "Aide"

      Et quand je clique sur "Débogage", là je remarque que la ligne de code :

       Worksheets(FX).Name = Format(Worksheets(FX).[C1], "00")
      est surlignée en jaune

      Alors peut être que le fait d'avoir une macro avant change quelque chose ?
      Parce que du coup ça me donne ça avec mes deux macros :

      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      temp = Array("ü", "")
      If Not Application.Intersect(Target, Range("B:B")) Is Nothing Then
      With Target
      p = Application.Match(Target, temp, 0)
      If Not IsError(p) Then
      If p = UBound(temp) + 1 Then p = 0
      Else
      p = 0
      End If
      Target = temp(p)
      Cancel = True
      End With
      End If
      End Sub

      Option Explicit

      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Dim FX As Byte, k As Byte
      If Target.Address = "$C$1" Then
      Application.ScreenUpdating = False: k = Worksheets.Count
      For FX = 1 To k: Worksheets(FX).Name = "T" & FX: Next FX
      For FX = 1 To k
      Worksheets(FX).Name = Format(Worksheets(FX).[C1], "00")
      Next FX
      End If
      End Sub


      Mais sinon ça marche, c'est juste le message d'erreur qui s'affiche, donc il doit y avoir un petit problème quelque part, non ?
      0
    4. valentin > Liitch Messages postés 78 Statut Membre
       
       
      Sur mon fichier Excel, après avoir saisi un nombre en C1 et validé par Entrée,
      ça renomme aussitôt l'ensemble des onglets ; sur ce même fichier Excel que
      j'ai transmis dans mon message de 12:31, ça ne le fait pas ?

      ---------------------------------------------------

      Dans ton vrai fichier, tu as bien mis mon code uniquement à l'emplacement
      du code de la 1ère feuille, n'est-ce pas ? tu ne dois pas le faire pour toutes
      les feuilles du classeur.

      Alt F11 ; côté gauche et en haut, juste sous la ligne "Microsoft Excel Objets",
      clique sur la 1ère feuille que tu vois, puis fais Entrée => ça ouvre à droite
      la bonne page : c'est là que tu dois placer ma macro, et seulement là =>
      si tu l'as mis ailleurs, il faut l'enlever !

      ---------------------------------------------------

      Ce que j'ai fait est indépendant de Worksheet_BeforeDoubleClick()
      mais regarde ta ligne temp = Array("ü", "") ; on dirait qu'il manque
      un caractère ! cette sub est pour un double-clic en colonne B ;
      ma sub est pour un changement en C1.

      ---------------------------------------------------

      Qu'une macro soit placée avant une autre ou après n'a pas d'incidence
      sur l'exécution du code : même résultat ; mais personnellement, si une
      sub A() est appelée par une sub B(), je préfère mettre A() avant B().

      D'autre part, regarde ta ligne isolée entre tes deux macros :
      Option Explicit doit être tout en haut du module => en haut
      de ta page.
       
      0
    5. Liitch Messages postés 78 Statut Membre
       
      Non plus, même sur le fichier Excel que tu m'as transmis. Après avoir entrer un nombre et fait Entrée. Ca ne renomme rien, c'est en recliquant sur C1 que ça renomme l'ensemble des onglets.

      ---------------------------------------------------------

      Oui, je l'ai bien mise sur une seule feuille. La première.

      ---------------------------------------------------------

      Oui je sais, c'est une macro que moi j'ai ajouté. Et non il ne manque pas de caractère c'est pour qu'on puisse "décocher" en effectuant un deuxième double-clic

      ---------------------------------------------------------

      J'ai pas compris avec tes sub A() & sub B()

      Du coup j'ai fait le changement pour Option Explicit, mais ça fait exactement pareil :

      - Obligé de resélectionner la cellule C1 (celle où j'ai entré un chiffre entre 1 et 52) pour renommer l'ensemble des onglets
      - Message d'erreur qui s'affiche quand je sélectionne C1
      - La ligne de code
      Worksheets(FX).Name = Format(Worksheets(FX).[C1], "00")
      est toujours surligné en jaune

      Pourtant je comprends pas, j'ai fait un copier coller de ta macro...
      J'ai regardé dans les options d'Excel, mais je n'ai rien trouvé qui aurait pu me bloquer.
      0