renommage multiple et automatique de feuilles à partir d'une autre.

hagen59

XLDnaute Nouveau
Bonjour à tous.
Je suis nouveau sur le Forum et aussi novice dans les fonctions avancées de cet outil puissant qu'est Excel.
J'ai quelques connaissances en programmation datant de mes études donc globalement je comprends ce qu'il faut faire mais il me manque la connaissance du langage proprement dit pour me débrouiller. Je m'initie donc petit à petit.
Je vous sollicite aujourd'hui car je suis bloqué sur une chose qui me parait assez simple mais dont je n'arrive pas à me dépêtrer.
j'ai naturellement chercher sur le forum et sur Google. J'ai trouvé pas mal de choses plus ou moins ardues mais rien ne répond exactement à ce que je souhaite faire ou je n'arrive pas à modifier.

Ci joint un fichier Excel exemple.
Une feuille pilote dans laquelle une colonne contient des valeurs susceptibles de changer. toto tata titi toutou.
Je souhaite mettre à jour le nom des feuilles (autres que la feuille pilote ) automatiquement en fonction de la valeur contenu dans les cases de cette colonne.
Par exemple
feuille 1 pilote qui contient les valeur toto tata titi toutou
nom de feuille 1 toto
nom de feuille 2 est tata
nom de feuille 3 est titi
et ainsi de suite

Si on change tata en tutu la feuille correspondante change de nom pour tutu.

Sur la feuille pilote de mon fichier excel j'ai une ligne de code qui fonctionne mais sur la page pilote. c'est à dire si vous changez la valeur toto la feuille va automatiquement changer de nom par la nouvelle valeur.
ActiveSheet.Name = Range("b1").Value
C'est ce que je souhaite faire mais sur les autres feuilles, par sur la pilote qui est ma base de données.
Chaque feuille aura donc un code qui lui dit de la renommer en fonction de la valeur contenue dans la case X de la feuille pilote.
Sur feuille 2 par exemple
nom de la feuille 2 = valeur de la case B1 de la feuille pilote.
Sur feuille 4
nom de la feuille 4 = valeur de la case lambda de la feuille pilote.
et ainsi de suite
Suis je clair ?

Pour éviter les problèmes de code en cas d'ajout de feuilles, inversion de feuilles etc, j'ai préféré opter pour une ligne de code sur chaque feuille plutôt qu'un code global et plus complexe avec une boucle d'incrémentation.

je vous remercie par avance pour votre aide.

Jean Francois.
 

Pièces jointes

  • test2.xls
    32 KB · Affichages: 28
  • test2.xls
    32 KB · Affichages: 30
  • test2.xls
    32 KB · Affichages: 29

Dranreb

XLDnaute Barbatruc
Re : renommage multiple et automatique de feuilles à partir d'une autre.

Bonsoir.
Dans le module de la 1ère feuille (pilote):
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Or Target.Count <> 1 Then Exit Sub
On Error Resume Next
Worksheets(Target.Row + 1).Name = Target.Value
End Sub
P.S J'ai vaguement l'impression que cette solution ne vous conviendra pas parce que vous semblez vouloir pouvoir changer l'ordre des feuille sans en changer l'ordre dans le sommaire. C'est bien un sommaire, oui ?
N'y aurait il pas un titre dans chaque autre feuille que vous pourriez reproduire à droite du nom dans le sommaire ?
Si alors vous le reproduisiez par une formule renvoyant à cette cellule il serait possible de l'analyser pour identifier la feuille à renommer.
Si l'ordre du sommaire doit être changé aussi quand vous changer de place, ajoutez ou supprimez une feuille, ce serait plus simple: il suffirait de le remettre à jour par une Private Sub Worksheet_Activate() dans celui ci (avec Application.EnableEvents = False devant pour ne pas déclencher la Worksheet_Change).
À +
 
Dernière édition:

hagen59

XLDnaute Nouveau
Re : renommage multiple et automatique de feuilles à partir d'une autre.

Bonjour,

Normalement ca ne bougera pas. Il est cependant possible que je retire ou ajoute une feuille mais il y a très peu de chance.
De plus si jamais ca devait arriver l'ordre des noms dans la colonne ne doit pas forcément etre dans le même ordre que les feuilles donc peu importe il me semble.

Est il possible sur chaque feuille à renommer de mettre ce code :
ActiveSheet.Name = feuille pilote case B1.Value
Avec B1 valeur qui change en fonction de la feuille.

Merci
 

Dranreb

XLDnaute Barbatruc
Re : renommage multiple et automatique de feuilles à partir d'une autre.

Non. Répondez à mes questions. Vous me faites penser à Fernand RAYNAUD. Toujours … avec des croissants.
De plus vous l'aviez mis dans une Worksheet_Change de sorte qu'elle ne se déclencherait que quand on en modifierait une cellule. Et ce serait dangereux parce que si on la modifie par macro il se pourrait que la feuille ne soit pas du tout la feuille active. Le moins serait alors plutôt d'utiliser le mot clé Me à la place de ActiveSheet. Et plutôt dans une Worksheet.Activate: la feuille serait renommée plus tôt, mais toujours pas immédiatement dès qu'on change le nom dans le sommaire.
Pour cela il faut choisir une des 2 solutions que j'ai proposées, et pas autre chose:
1 - On garantit que l'ordre du sommaire est toujours l'ordre des feuilles,
2 - Il y a la formule =FeuilleX!$A$1 à coté du nom et on l'utilise pour identifier la feuille à renommer.
À moins que que vous ne teniez pas à ce que la feuille soit renommée immédiatement, laquelle de ces 2 seules proposées pour l'instant vous conviendrait ?

P.S. Il y en aurait bien une 3ième basée sur des noms dans le classeur, qui offrirait l'avantage de la 2 sans impliquer de formule. Mais elle serait beaucoup moins claire à gérer.

P.S.2 La solution qui aurait ma préférence serait la 1. À mettre dans le module de la feuille sommaire (ou pilote):
VB:
Option Explicit

Private Sub Worksheet_Activate()
Dim N As Long
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Me.Columns(2).ClearContents
For N = 2 To Sheets.Count
   Me.Cells(N - 1, 2).Value = Sheets(N).Name
   Next N
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Or Target.Count <> 1 Then Exit Sub
On Error Resume Next
With Sheets(Target.Value): .Name = .Name & " (ancienne)": End With
Sheets(Target.Row + 1).Name = Target.Value
End Sub

On pourrait éventuellement imaginer une solution à mon sens plus idiote :
On pourrait mettre dans chaque module de feuille:
VB:
Public Function LignePilote() As Long: LignePilote = 1: End Function
Avec 2, 3, évidemment au lieu de 1 pour les feuilles suivantes, et mettre dans la feuille pilote:
VB:
Private Sub Worksheet_Activate()
Dim F As Object, L As Long ' pour traiter aussi bien les Chart éventuels que les Worksheet
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Me.Columns(2).ClearContents
On Error Resume Next
For Each F In ThisWorkbook.Sheets
   Err.Clear: L = F.LignePilote: If Err Then L = 0
   If L > 0 Then Me.Cells(L, 2) = F.Name
   Next F
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim F As Object, L As Long
If Target.Column <> 2 Or Target.Count <> 1 Then Exit Sub
On Error Resume Next
For Each F In ThisWorkbook.Sheets
   Err.Clear: L = F.LignePilote: If Err Then L = 0
   If L = Target.Row Then
      With ThisWorkbook.Sheets(Target.Value): .Name = .Name & " (ancienne)": End With
      F.Name = Target.Value
      Exit Sub: End If
   Next F
End Sub

On pourrait aussi se baser sur le CodeName: en dehors d'être le nom VBA de l'objet Worksheet c'est aussi une propriété String qui reproduit ce nom. Ça impliquerait juste de nommer correctement les feuilles dans VBA mais plus besoin de Function LignePilote.
Les procédures dans la feuille pilote seraient les même au changement près de 'F.LignePilote' en 'Mid$(F.CodeName), 6)', à supposer que les CodeName choisis commenceront toujours par 'Feuil' qui fait 5 caractères et se termineront par le numéro de ligne dans le sommaire, à part la feuille pilote elle même qu'on pourrait appeler FPilt0 pour VBA si on ne la veut pas dans le sommaire.
Important: dans la fenêtre de propriété d'une feuille, la propriété Name indiquée sans parenthèses est le nom Excel de la feuille.
Son nom VBA, lui, qu'on peut changer aussi, c'est celui indiqué en premier entre parenthèses. Pour ne pas confondre, on l'appelle couramment son CodeName bien que ceci est en réalité le nom d'une propriété String qui reproduit ce nom.

À +
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 634
Messages
2 111 430
Membres
111 134
dernier inscrit
sem698