Numéroter et nommer des feuilles
Bonjour à tous,
J'aurais besoin d'aide afin de concevoir une macro qui vérifier si dans la cellule B3, les caractères "Équipement :"sont inscrits et si c'est le cas, numérote à partir de la première feuille (à l'extrême gauche) la cellule C8 : 001. Par la suite la macro passe à la prochaine feuille située à droite de la première et vérifie si dans la cellule B3, les caractères "Équipement :"sont inscrits et numérote la cellule C8 : 002 et ainsi de suite jusqu'à la dernière feuille située à l'extrême droite. Les feuilles contenant les caractères "Équipement :" dans la cellule B3 seront tous nommées en fonction du numéro apparaissant dans la cellule C8 comme dans l'exemple ci-joint. Seules les feuilles où les caractères "Équipement :" apparaissent dans la cellule B3 seront nommées en fonction du numéro apparaissant dans la cellule C8. Dans la feuille "Menu", les caractères "Équipement :" ne sont pas inscrits dans la cellule B3, la cellule C8 et le nom de la feuille demeurent donc inchangés. La numérotation commence à 001, 002, 003.....010...100... et est toujours constituée de 3 chiffres.
N.B. : Avant que la macro soit exécutée, il est possible d'avoir des numéros 001, 002,... dans la cellule B3 des feuilles et que les feuilles soient nommées selon la valeur apparaissant dans la cellule B3. Le but de cette macro est de changer automatiquement la valeur en B3 et le nom de la feuille si une ou de nouvelles feuilles sont insérées entre des feuilles existantes ou s'il y a suppression d'une ou plusieurs feuilles parmi les feuilles existantes.
Une fois la macro activée, B3 de chaque feuille sera numéroté à nouveau (001,....) et le nom des feuilles changera pour prendre la nouvelle valeur en B3. Il faut faire en sorte d'éviter les doublons entre les feuilles (nom unique correspondant à la valeur en B3).
Merci à la avance pour votre précieuse collaboration.
Dans l'attente de vous lire,
Salutations,
Renaud D.
Bonjour Renaud, bonjour le forum,
Peut-être comme ça :
Public Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglets)
Dim X As Integer 'déclare la variable X (incrément)
X = 1 'inititalise la variable X
For Each O In Sheets 'boucle sur tous les onglets O du classeur
'condition : si la cellule B3 de l'onglet contient : "Équipement: "
If O.Range("B3").Value = "Équipement :" Then
O.Name = CStr(Format(X, "000")) 'définit le nom de l'onglet
O.Range("C8").Value = O.Name 'récupère le nom de l'onglet dans la cellule C8 de l'Onglet
X = X + 1 'incrémente X
End If 'fin de la condition
Next O 'prochain onglet de la boucle
End SubBonjour ThauThème,
Merci d'avoir répondu à ma demande.
J'ai exécuté votre macro et à chaque feuille renommée, une fenêtre s'ouvre avec : "Nom invalide". J'appuie sur "OK", et je passe à la feuille suivante avec le même message et ce jusqu'à la fin.
Si la première feuille se nomme "003" au lieu de "001" et la troisième "001" au lieu de "003", la macro bloque (doublon). Les feuilles ne sont pas nécessairement classées dans un ordre croissant. Faudrait trouver un moyen de renommer les feuilles en tenant compte des doublons éventuels afin de les éliminer.
Au plaisir de vous relire,
Salutations,
Renaud D.
Bonsoir Renaud, bonsoir le forum,
Les messages viennent de la procédure événementielle Change contenue dans les onglets. Le code modifié ci-dessus passe outre cette procédure événementielle et gère les erreurs liées au doublons de nom :
Public Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglets)
Dim X As Integer 'déclare la variable X (incrément)
Dim TEST As Boolean 'déclare la variable TEST
Application.EnableEvents = False 'bloque les procédures événementielles
deb: 'étiquette
X = 1 'inititalise la variable X
For Each O In Sheets 'boucle sur tous les onglets O du classeur
'condition 1 : si la cellule B3 de l'onglet contient : "Équipement: "
If O.Range("B3").Value = "Équipement :" Then
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
O.Name = CStr(Format(X, "000")) 'définit le nom de l'onglet (génere une erreur si ce nom existe déjà)
If Err <> 0 Then 'condition 2 : si une erreur a été générée
'renomme l'onglet portant le même nom en metant "Provi " devant
Sheets(CStr(Format(X, "000"))).Name = "Provi " & CStr(Format(X, "000"))
O.Name = CStr(Format(X, "000")) 'définit le nom de l'onglet
O.Range("C8").Value = O.Name 'récupère le nom de l'onglet dans la cellule C8
TEST = True 'définit la variable TEST
End If 'fin de la condition 2
On Error GoTo 0 'annule la gestion des erreurs
X = X + 1 'incrémente X
End If 'fin de la condition 1
Next O 'prochain onglet de la boucle
If TEST - True Then GoTo deb 'si test est [Vrai], va à l'étiquette deb
Application.EnableEvents = True 'permet les procédures événementielles
End SubBonsoir ThauThème,
Votre macro fonctionne presque. On est prêt, plutôt vous êtes prêt du but. Je vous ai envoyé le fichier, "Exemple 2", ci-joint. Initialement, nous avons :
Première feuille : C8 : 003, nom de la feuille : 003
Deuxième feuille : C8 : 045, nom de la feuille : 045
Troisième feuille : C8 : 001, nom de la feuille : 001
Lorsque la macro est exécutée, nous avons :
Première feuille : C8 : 001, nom de la feuille : 001
Deuxième feuille : C8 : 045, nom de la feuille : 002
Troisième feuille : C8 : 001, nom de la feuille : 003
Au lieu (résultat désiré) de :
Première feuille : C8 : 001, nom de la feuille : 001
Deuxième feuille : C8 : 002, nom de la feuille : 002
Troisième feuille : C8 : 003, nom de la feuille : 003
Merci encore pour l'intérêt que vous accordez à mon problème.
Salutations,
Renaud D.
Bonsoir Renaud, bonsoir le forum,
La mise à jour de la cellule C8 se trouvait mal placée à l'intérieur de la condition2 . Je l'ai sortie et je pense que ça devrait marcher maintenant :
Public Sub Macro11()
Dim O As Worksheet 'déclare la variable O (Onglets)
Dim X As Integer 'déclare la variable X (incrément)
Dim TEST As Boolean 'déclare la variable TEST
Application.EnableEvents = False 'bloque les procédures événementielles
deb: 'étiquette
X = 1 'inititalise la variable X
For Each O In Sheets 'boucle sur tous les onglets O du classeur
'condition 1 : si la cellule B3 de l'onglet contient : "Équipement: "
If O.Range("B3").Value = "Équipement :" Then
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
O.Name = CStr(Format(X, "000")) 'définit le nom de l'onglet (génere une erreur si ce nom existe déjà)
If Err <> 0 Then 'condition 2 : si une erreur a été générée
'renomme l'onglet portant le même nom en metant "Provi " devant
Sheets(CStr(Format(X, "000"))).Name = "Provi " & CStr(Format(X, "000"))
O.Name = CStr(Format(X, "000")) 'définit le nom de l'onglet
TEST = True 'définit la variable TEST
End If 'fin de la condition 2
O.Range("C8").Value = O.Name 'récupère le nom de l'onglet dans la cellule C8
On Error GoTo 0 'annule la gestion des erreurs
X = X + 1 'incrémente X
End If 'fin de la condition 1
Next O 'prochain onglet de la boucle
If TEST - True Then GoTo deb 'si test est [Vrai], va à l'étiquette deb
Application.EnableEvents = True 'permet les procédures événementielles
End SubBonsoir ThauThème,
Votre macro fonctionne beaucoup mieux. Cependant, parfois, lors de l'exécution de la macro, ou après la suppression d'une feuille ou de l'insertion d'une feuille, la macro tourne sans arrêt et je dois appuyer sur la touche d'échappement pour sortir de la boucle. La macro s'arrête alors à la ligne "If Err <> 0 Then 'condition 2 : si une erreur a été générée". Toutefois, la numérotation des cellule B8 est effectuée. Les feuilles sont nommées correctement en fonction de la valeur en B8.
Existe-t-il un moyen d'empêcher la macro de tourner sans arrêt ? Faut-il tout simplement sauvegarder le fichier, fermer Excel et exécuter la macro par la suite ?
Dans l'attente de vous lire,
Salutations,
Renaud D.
Bonsoir Renaud, bonsoir le forum,
Essaie comme ça mais après, je n'ai plus de solutions...
Public Sub Macro11()
Dim O As Worksheet 'déclare la variable O (Onglets)
Dim X As Integer 'déclare la variable X (incrément)
Application.EnableEvents = False 'bloque les procédures événementielles
X = 1 'inititalise la variable X
For Each O In Sheets 'boucle sur tous les onglets O du classeur
'condition 1 : si la cellule B3 de l'onglet contient : "Équipement: "
If O.Range("B3").Value = "Équipement :" Then
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
O.Name = CStr(Format(X, "000")) 'définit le nom de l'onglet (génere une erreur si ce nom existe déjà)
If Err <> 0 Then 'condition 2 : si une erreur a été générée
'renomme l'onglet portant le même nom en metant "Provi " devant
Sheets(CStr(Format(X, "000"))).Name = "Provi " & CStr(Format(X, "000"))
O.Name = CStr(Format(X, "000")) 'définit le nom de l'onglet
End If 'fin de la condition 2
O.Range("C8").Value = O.Name 'récupère le nom de l'onglet dans la cellule C8
On Error GoTo 0 'annule la gestion des erreurs
X = X + 1 'incrémente X
End If 'fin de la condition 1
Next O 'prochain onglet de la boucle
Application.EnableEvents = True 'permet les procédures événementielles
End SubBonjour ThauThème,
Votre macro fonctionne à la perfection.
Je tiens à vous transmettre mes plus sincères remerciements pour votre aide.
Vous êtes un pro.
Sincères salutations,
Renaud D.