Mise à jour du nom des feuilles d'un classeur en vba

  • Initiateur de la discussion jean-michel
  • Date de début
J

jean-michel

Guest
Bonjour,

C'est la première fois que je viens sur votre site, c'est également ma première macro que j'essaie de réaliser en vba, mais j'ai quelques soucis.

J'essaie de faire une macro qui permette de mettre à jour le nom de chaque feuille d'un classeur, en fonction d'une valeur figurant dans la cellule A1, par exemple, pour chacune d'entre elle.

J'ai une valeur du style 01/01/04 et je cherche à ce que le nom de la feuille dans laquelle figure cette valeur devienne JANVIER 2004, et ainsi de suite jusqu'à DECEMBRE 2004.

Les feuilles étant déjà existantes, j'ai déjà essayé plusieurs types de boucles, de conditions, mais au bout du compte je n'obtiens pas de résultat. J'en suis actuellement à 'erreur d'execution 424'

De plus, je n'arrive pas à limiter la macro aux feuilles que je veux actualiser.
Pourriez-vous m'aider ?

Voici ci-dessous le code vba:

Sub RenommerdesFeuilles()
Dim i As Integer, j As Integer
Dim Dates, Onglet As String
Application.ScreenUpdating = False
For i = 1 To Worksheets.Count
Dates = Sheet.Range("A1").Value
Onglet = UCase(Format(Dates, "mmmm yyyy"))
If Sheets(i).Name <> Dates Then
Sheets(i).Name = [Onglet]
Sheets(i).Select Replace:=False
j = j + 1
End If
Next
If Not IsEmpty(Dates) Then
On Error GoTo mon_message
End If
Exit Sub
mon_message:
attention = MsgBox("La feuille existe déjà", vbOKOnly, "Attention")
End Sub

Merci par avance

Salutations

Jean-Michel
 
Z

Zon

Guest
Salut,
En mettant l'optin explicit tu te rendrais compte sheet écris comme cela pourrait être une variable mais pas définis d'où l'erreur 424. Il vaut mieux utliser la collection worksheets avec l'index i
On peut rajouter un test sur la cellule A1 pour vois si c 'est bien une date


Sub RenommerdesFeuilles()
Dim i As Integer
Dim Dates, Onglet As String
Application.ScreenUpdating = False
For i = 1 To Worksheets.Count 'parcourt toutes les feuilles du classeur
if iisdate(worksheets(i).Range("A1").Value) then
dates= worksheets(i).Range("A1").Value
else dates=Sheets(i).Name 'si pas une date on affecte à date le nom de la feuille comme cela grâce au test d'aprés on ne renommera pas la feuille.
Onglet = UCase(Format(Dates, "mmmm yyyy"))
If Sheets(i).Name <> Dates Then
Sheets(i).Name = Onglet 'vrochets inutiles
End If
Next
'tout le reste me semble inutile
End Sub

Enfin, qu'est ce que tu entends par "De plus, je n'arrive pas à limiter la macro aux feuilles que je veux actualiser "

On peut l'écrire aussi:

Sub RenommerdesFeuilles()
Dim I As Integer, Dates
Application.ScreenUpdating = False
For I = 1 To Worksheets.Count
With Worksheets(I)
Dates = IIf(IsDate(.[A1]), .[A1], .Name)
On Error Resume Next 'la gestion d'erreur permet d'éviter de nommer une feuille dont le nom existeriat déjà.
If .Name <> Dates Then .Name = UCase(Format(Dates, "mmmm yyyy"))
On Error GoTo 0
End With
Next I
End Sub
A+++
 
J

jean-michel

Guest
Bonsoir Zon,

Merci beaucoup pour ta réponse, j'ai finalement adopté ta version de macro qui est beaucoup plus courte et surtout plus efficace que la mienne.

Je ne connaissais pas la fonction IIf, je me suis documenté dessus.
Je me demande où renvoit le 'goto 0' ?

En ce qui concerne ma volonté de limiter la macro aux feuilles que je veux actualiser, il s'agissait de limiter le fonctionnement de la macro aux feuilles contenant effectivement une date en A1. Mais en ce qui concerne la suppression de la boite de dialogue, je ne suis pas d'accord, car ,pour moi, c'est aussi un moyen d'auto-controle.
Si, par exemple, une date 01/02/04 est malencontreusement saisie, ou resaisie, dans la cellule A1, après une première utilisation de la macro, d'une autre feuille que FEVRIER 2004, et qu'elle même a le nom MARS 2004, la macro ne me dit pas dans quelles feuilles où il y a des dates en A1, elle a rencontré un pb. Il faut dire que j'ai déjà vu des aneries pires que ça!

Quelle est la meilleure façon de faire, à ton avis ?

Salutations

Jean-Michel
 
Z

Zon

Guest
Re,

Le goto 0 sert pas à grand chose dans cette procédure il remet Err à 0.


Tu n'as pas besoin de variable pour ta mesgbox puisque tu utilises Vbokonly. et puis ton on error goto monmessage ne sert à rien fait comme ceci.

Peut être comme ceci ça t'iras mieux:
Sub RenommerdesFeuilles()
Dim I As Integer
Application.ScreenUpdating = False
For I = 1 To Worksheets.Count
With Worksheets(I)
If IsDate(.[A1]) Then
On Error Resume Next 'la gestion d'erreur permet d'éviter de nommer une feuille dont le nom existeriat déjà.
.Name = UCase(Format(.[A1], "mmmm yyyy"))
Else
MsgBox "Vous n'avez pas saisi de nom pour la feuille " & .Name
.Activate
Exit Sub
End If
End With
Next I
End Sub


A+++
 

Discussions similaires

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz