IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

VBA Excel - Comment incrémenter le nom d'une feuille Excel lorsqu'il existe déjà ?
Un billet blog de Philippe Tulliez

0PARTAGES

Préambule
Lors d’une formation "VBA pour excel" que je dispensais il y a un certain temps, une participante m’avait posé une question intéressante "Comment incrémenter le nom d'une feuille, si celui-ci existe déjà ?".
C'est le sujet de ce billet.



Créer une feuille et la renommer
Lorsque l’on crée dynamiquement une feuille dans un classeur Excel à l’aide de l’instruction Worksheets.Add et que l’on souhaite lui attribuer un nom particulier, par exemple le texte "CA" suivi de l’année et du numéro du mois en cours soit ActiveSheet.Name = "CA " & Format(Date, "yyyy-mm", il est possible que ce nom existe déjà et dans ce cas une erreur 1004 sera levée (Message : Erreur 1004 - Renommer une feuille

Nous pourrions intercepter l’erreur en l’ignorant, comme l’illustre le code ci-dessous, ce qui aura pour effet d’éviter l’affichage du message d’erreur mais qui nous laissera la feuille récemment créée avec son nom incrémenté comme par exemple Feuil7, Sheet7 ou autres, suivant la langue de l’interface.

Code VBA : Sélectionner tout
1
2
3
On Error Resume Next ' Va a l'instruction suivante si erreur
ActiveSheet.Name = "CA " & Format(Date, "yyyy-mm")
On Error GoTo 0 ' Rend la main au code VBA
Pour éviter cet inconvénient, nous pourrions supprimer la feuille si le numéro de l'erreur levée est égal à 1004
Cependant, la suppression d’une feuille engendre l’affichage du message
Microsoft Excel supprimera définitivement cette feuille, voulez-vous continuer
Pour éviter l’affichage de celui-ci, nous ajouterons l’instruction Application.DisplayAlerts = False, juste avant l’instruction de suppression. Soit le code complet
Code VBA : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub cmdRunAddSheet_Click()
  Dim SheetName As String
  Dim e As Long
  SheetName = "CA " & Format(Date, "yyyy-mm")
  Worksheets.Add                ' Ajoute une feuille
  On Error Resume Next
  ActiveSheet.Name = SheetName  ' Renomme la feuille
  e = Err.Number
  On Error GoTo 0
  If e = 1004 Then              ' Si l'erreur = 1004
    With Application
    .DisplayAlerts = False
     ActiveSheet.Delete         ' Supprime la feuille
    .DisplayAlerts = True
    End With
  End If
End Sub
Comment incrémenter le nom, s’il existe déjà ?
L'autre solution est d'incrémenter le nom, c'était le but de l'écriture de ce billet.

Dans notre exemple, nous avons choisi comme nom le mot CA suivi de l’année et du numéro du mois ce qui donne au moment de la rédaction de ce billet CA 2023-05 et comme nous parlons d'incrémentation, l’idée est donc d’avoir CA 2023-05 si le nom n'existe pas et ensuite CA 2023-05_1, CA 2023-05_2, etc.
La ligne de code pour la création du nom incrémenté est : ActiveSheet.Name = "CA " & Format(Date, "yyyy-mm" & "_" & Counter
Counter étant la variable contenant le n° incrémenté.

Pour réaliser cela, nous allons gérer l’erreur en utilisant l’instruction GoTo qui renverra à une étiquette nommée ErrHandler à la place de l’instruction Resume Next
L'instruction On Error GoTo ErrHandler, renvoie à l'étiquette ErrHandler en cas de levée d'erreur

Traitement de l’erreur
Dans cette procédure, nous vérifions que le numéro de l’erreur est bien 1004 et dans l’affirmative nous allons incrémenter la variable Counter et dans le cas contraire, un message doit s’afficher pour indiquer le numéro et la description de cette erreur. C’est une précaution qui permet de ne pas masquer un problème éventuel.

Code de la fonction
Code VBA : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function AddSheet(NewName As String) As Long
  ' Ajoute une feuille au classeur, la renomme et ajoute une incrémentation si la feuille existe déjà
  ' La fonction renvoie
  ' Philippe Tulliez (https://magicoffice.be)
  Dim Counter As Integer
  With Worksheets
  .Add After:=Worksheets(.Count) ' Ajoute une feuille
  End With
  ' Renomme la feuille
  On Error GoTo ErrHandler       ' Renvoie à l'étiquette ErrHandler si Erreur
  ActiveSheet.Name = NewName & IIf(Counter, "_" & Counter, "")
  On Error GoTo 0                ' Rend la main au VBA
ErrHandler:
  With Err
    Select Case .Number
       Case 1004
         Counter = Counter + 1   ' Incrémentation du compteur
         Resume
       Case Else
         AddSheet = .Number     ' Renvoi le n° d'erreur
    End Select
  End With
End Function
Exemple d'une procédure qui l'invoque
Code VBA : Sélectionner tout
1
2
3
4
5
6
Sub TestAction_AddSheet()
  Dim n As String, r As Long
  n = "CA " & Format(Date, "yyyy-mm")
  r = AddSheet(n)
  If r Then MsgBox "Erreur " & r & " à la création de la feuille " & n
End Sub
Procédure plus complète
Cette fonction qui porte le même nom a deux arguments et n'incrémente le nom qu'à condition de passer la valeur True à l'argument optionnel WithIncrementing
C'est cette procédure qui est utilisée dans le classeur à télécharger

Code de la procédure

Code VBA : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Function AddSheet(NewName As String, Optional WithIncrementing As Boolean) As Variant
  ' Procédure de création de feuille, nommage de celle-ci
  '     et incrémentation de son mom, s'il existe
  ' Arguments
  '   NewName             Nom à attribuer à la feuille
  '   [WithIncrementing]  True si l'incrémentation doit se faire
  '                       False (d:$si dans ce cas la feuille sera supprimée
  ' La procédure renvoie
  '    True   si la création de la feuille a eu lieu
  '    False  dans le cas contraire
  '    ou un n° d'erreur si une erreur autre que 1004 devrait avoir été levée
  Dim Counter As Integer
  ' Ajoute une feuille
  With Worksheets: .Add After:=Worksheets(.Count): End With
  ' Renomme la feuille
  On Error GoTo ErrHandler          ' Renvoie à l'étiquette ErrHandler si Erreur
  ActiveSheet.Name = NewName & IIf(Counter, "_" & Counter, "")
  On Error GoTo 0                   ' Rend la main au VBA
ErrHandler:
     ' Traitement des erreurs
     Select Case Err.Number
       Case 1004
          If WithIncrementing Then
             Counter = Counter + 1  ' Incrémentation du compteur
             Resume
           Else
             With Application
             .DisplayAlerts = False
              ActiveSheet.Delete
             .DisplayAlerts = True
             End With
             AddSheet = False
          End If
       Case 0: AddSheet = True
       Case Else: AddSheet = Err.Number
     End Select
End Function

Tutoriel en rapport avec le sujet


Classeur à télécharger
Vous avez lu gratuitement 3 580 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !