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 SubMon 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.
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 Subun 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 SubLa 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.
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 SubMon 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)
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-'29Ok merci beaucoup pour ces précisions qui me seront forts utiles