Nom de l'onglet par rapport à une cellule

Bonjour,

je souhaite nommer les onglets de mon classeur, par rapport au nom d'une cellule.

En A4 de la Feuil1, j'ai la valeur pour l'onglet.

J'ai mis :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A4")) Is Nothing Then
        ActiveSheet.Name = ActiveSheet.Range("A4")
    End If
End Sub

Mon soucis est que dans la Feuil2, en A4, j'ai mis une formule pour que la valeur A4 de la Feuil2, soit différente. Je m'explique :

Feuil1, cellule A4 : j'ai une date, par exemple 01.01.2022

Feuil2, cellule A4 : j'ai mis la formule pour automatisé mon classeur pour que la date soit 6 jours plus tard, soit 07.01.2022

En mettant dans la Feuil2 le même code VBA, le nom de l'onglet ne change pas... en effet, je dois aller dans la Feuil2, cellule A4 et faire Enter pour que cela prenne.

Existe t'il un moyen d'y parvenir automatiquement ?

Bonsoir,

Modifiez l'événementiel afin que ce ne soit plus le Change qui déclenche le code, mettez par exemple "Activate", comme cela le nom de l'onglet sera mis à jour lorsque que vous activez la feuille.

Par contre si vous voulez que le noms de feuilles se mettent à jour lors du changement de date de la feuille 1 alors c'est votre code qu'il faut changer.

@ bientôt

LouReeD

Bonjour,
Une proposition !?
Cdlt.

14vinzu01.xlsm (15.79 Ko)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim dt As Date

    If Target.Address = "$A$4" And IsDate(Target) Then
        Me.Name = Format(Target.Value, "dd.mm.yyyy")
        dt = DateAdd("d", 6, Target.Value)
        With Feuil2
            .Range("A4").Value = dt
            .Name = Format(dt, "dd.mm.yyyy")
        End With
    Else
        Me.Name = Me.CodeName
        With Feuil2
            .Name = .CodeName
            .Range("A4").Value = vbNullString
        End With
    End If

End Sub

un petit peu parreil

Private Sub Worksheet_Change(ByVal Target As Range)
     With Target
          If .Address <> "$A$4" Then Exit Sub     'c'était pas A4 qui etait modifié
          If Me.Name <> ThisWorkbook.Worksheets(1).Name Then Exit Sub     'cette feuille n'a pas l'index 1 (n'est pas la 1ière)
          If Not IsDate(.Value) Then Exit Sub     'ce n'est pas une date
          If WorksheetFunction.Median(DateSerial(2020, 1, 1), DateSerial(2029, 12, 31), .Value) <> .Value Then Exit Sub     'ce n'est pas une date des années 2020-'29

          For i = 1 To ThisWorkbook.Worksheets.Count     'boucle toutes les feuilles
               With ThisWorkbook.Worksheets(i)
                    If i > 1 Then .Range("A4") = Target.Value + (i - 1) * 6     'A4 = A4 de la première feuille + multiple de 6
                    s = Format(.Range("A4").Value, "dd.mm.yy")     'en format texte
                    On Error Resume Next
                    ThisWorkbook.Worksheets(s).Name = "X_" & Rnd     ' s'il existe déjà une feuille avec ce nom, renommez-la !
                    On Error GoTo 0
                    .Name = s     'renommez cette feuille
               End With
          Next
     End With
End Sub

La solution de Jean-Eric est vraiment top, mais par contre j'ai 5 onglets au total... j'ai tenté de modifier le code pour y parvenir mais je sèche

Bonjour...

Traitement idenditique (?) pour plusieurs onglets, dans la page de codes de ThisWorBook :

Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal R As Range)
  Dim Ws As Worksheet, Nom As String
  'hors cellule : sortie
  If Intersect(R, [A4]) Is Nothing Or R.CountLarge > 1 Then Exit Sub
  'blocage des évènementielles pour éviter des appels récursifs
  evN
  If Not IsDate(R) Then 'erreur de saisie
    MsgBox "date attendue !", vbCritical, "Saisie refusée...": Sh.Name = Sh.Name: R = ""
  Else
    Nom = Format(R, "dd.mm.yyyy") 'nom prévu
    'déjà utilisé ? Si oui,avertissement reprise et déblocage des évènementielles
    For Each Ws In Sheets
      If Ws.Name = Nom Then MsgBox "Nom déjà utilisé !", vbCritical, "Saisie refusée...": R = "": evO: Exit Sub
    Next
    Sh.Name = Nom
  End If
  'déblocage des évènementielles du classeur
  evO
End Sub
'blocage des évènementielles du classeur, la suivante étant Obligatoire
Sub evN(): Application.EnableEvents = 0: End Sub

'déblocage des évènementielles du classeur si elles sont bloquées
Sub evO(): Application.EnableEvents = 1: End Sub

Au final, le code de Jean-Eric ne fonctionne pas... en effet, si je mets la date en A4, cela met le nom de l'onglet correctement, mais dès que je mets une valeur dans une autre cellule, la feuille se renomme différemment...

Pour Ordonc, cela n'agit que sur le premier onglet et pas les autres.

Je cherche je cherche..... mais je ne suis pas un grand "pro" malheureusement

ma reaction de hier matin. On change A4 de la première feuille et tout le reste s'adapte.

15vinzu01.xlsb (34.92 Ko)

Bonjour BsAlv,

en effet, cela fonctionne vraiment super bien. J'ai tenté de modifier votre code car je voulais mettre le format de cellule A4 jjjj jj mmmm aaa mais impossible car à chaque fois cela me change le nom des onglets mais pas le format de cellule. J'ai tenté ça :

Private Sub Worksheet_Change(ByVal Target As Range)
     With Target
          If .Address <> "$A$4" Then Exit Sub     'c'était pas A4 qui etait modifié
          If Me.Name <> ThisWorkbook.Worksheets(1).Name Then Exit Sub     'cette feuille n'a pas l'index 1 (n'est pas la 1ière)
          If Not IsDate(.Value) Then Exit Sub     'ce n'est pas une date
          If WorksheetFunction.Median(DateSerial(2020, 1, 1), DateSerial(2029, 12, 31), .Value) <> .Value Then Exit Sub     'ce n'est pas une date des années 2020-'29

          For i = 1 To ThisWorkbook.Worksheets.Count     'boucle toutes les feuilles
               With ThisWorkbook.Worksheets(i)
                    If i > 1 Then .Range("A4") = Target.Value + (i - 1) * 6     'A4 = A4 de la première feuille + multiple de 6
                    .Range("A4").NumberFormat = "dd.mm.yy"
                    s = Format(.Range("A4").Value, "jjjj jj mmmm aaa?")     'en format texte
                    On Error Resume Next
                    ThisWorkbook.Worksheets(s).Name = "X_" & Rnd     ' s'il existe déjà une feuille avec ce nom, renommez-la !
                    On Error GoTo 0
                    .Name = s     'renommez cette feuille
               End With
          Next
     End With
End Sub

Mon autre question est que vous avez mis DateSerial(2029, 12, 31)

Cela veut dire que dès 2030 cela ne fonctionnera plus ?

Merci beaucoup !

re,

VBA n'est pas francophone, alors il faut utiliser le format "anglais" mais pour les années oubien 2 oubien 4 fois y, 3 fois donne des résultats douteux ... .

Parce que vous utilisez 2 dd, ce n'est pas le format "long date" prédéfini (voir l'annexe)

10vinzu01.xlsb (36.03 Ko)
s = Format(.Range("A4").Value, "dddd dd mmmm yy")     'en format texte "jjjj jj mmmm aaa"

autre question, oui, entre 1/1/2020 et 31/12/2029, mais cela est facile à adapter (ou à effacer) et ici, c'etait plutôt pour prevenir d'entrer des dates discutables. C'est mieux d'ajouter la raison.

 If WorksheetFunction.Median(DateSerial(2020, 1, 1), DateSerial(2029, 12, 31), .Value) <> .Value Then msgbox "mauvaise date": Exit Sub     'ce n'est pas une date des années 2020-'29

Ok merci beaucoup pour ces précisions qui me seront forts utiles

Rechercher des sujets similaires à "nom onglet rapport"