XL 2016 Ajouter onglet selon liste de nom dans une colonne

_l_ours

XLDnaute Nouveau
Bonjour,
Désolé si le sujet a été traité mais je n'ai pas vraiment trouvé., j'ai fait quelques recherches et donc j'ai tenté d'adapter selon ce que j'ai trouvé sur ce forum mais y'a un bug dans ma macro.
Voilà ma problématique : je souhaite en cliquant sur un bouton ajouter des onglets selon une liste de nom d'une colonne (la colonne A par exemple) sachant que la liste de nom pourra évoluer selon les jours (et en terme de nom, et en terme de quantité de ligne remplies).
J'ai donc bidouillé ça en macro :

Sub bouton1_cliquer()
Dim nom, c As Range
For Each c In Range("A:A")
nom = c.Value
Sheets.Add Count:=1, after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = nom
Next c
End Sub

Le problème est que je n'arrive pas à arrêter la création d'onglet à la dernière cellule remplie, et que ça me créé un onglet supplémentaire et que la macro se met en débogage (sachant que le débogage me signale la ligne "ActiveSheet.Name = nom").
Je suppose que le problème est dû au fait que la macro s'exécute sur toute la colonne A et cherche donc des cellules remplies sur toute la colonne (ma range), mais comment limiter celà aux uniques cellules renseignées ? (sachant que pour le moment j'ai entre 10 et 14 cellules qui peuvent être remplies, mais que ça peut évoluer).

Je vous joint le fichier test après l'exécution de la macro où vous pouvez constater l'onglet sans nom (le dernier).

merci d'avance pour votre aide
 

Pièces jointes

  • test.xlsm
    26.3 KB · Affichages: 5
Solution
Bonsoir à toutes & à tous, bonsoir @_l_ours et @job75
La liste des noms est placée dans le tableau structuré "tb_Noms" (on peut ainsi la déplacer sans toucher à la macro)
J'arrive un peu tard mais j'y vais de ma proposition avec 3 contrôles de validité :
  • La feuille n’existe pas
  • Le nom ne contient pas de caractères interdits
  • Le nom ne fait pas plus de 31 caractères
Et affichage en fin de procédure des noms ne convenant pas

VB:
Sub bouton1_cliquer()
     Const interdit$ = "\/*?[]"
     
     Dim nom, c As Range, tst$, Erreurs$
     
     For Each c In [Tb_Noms].SpecialCells(xlCellTypeConstants)
          nom = c.Value
          
          'Est-ce que la feuille existe déjà ?
          On Error Resume Next: tst =...

job75

XLDnaute Barbatruc
Mais 2 feuilles ne peuvent pas porter le même nom donc utiliser :
VB:
Sub bouton1_cliquer()
Dim c As Range, nom
    On Error Resume Next
    For Each c In Range("A:A").SpecialCells(xlCellTypeConstants)
        nom = c.Value
        If IsError(Sheets(nom)) Then 'si cette feuille n'existe pas
            Sheets.Add Count:=1, after:=Worksheets(Worksheets.Count)
            ActiveSheet.Name = nom
        End If
    Next c
End Sub
 

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonsoir à toutes & à tous, bonsoir @_l_ours et @job75
La liste des noms est placée dans le tableau structuré "tb_Noms" (on peut ainsi la déplacer sans toucher à la macro)
J'arrive un peu tard mais j'y vais de ma proposition avec 3 contrôles de validité :
  • La feuille n’existe pas
  • Le nom ne contient pas de caractères interdits
  • Le nom ne fait pas plus de 31 caractères
Et affichage en fin de procédure des noms ne convenant pas

VB:
Sub bouton1_cliquer()
     Const interdit$ = "\/*?[]"
     
     Dim nom, c As Range, tst$, Erreurs$
     
     For Each c In [Tb_Noms].SpecialCells(xlCellTypeConstants)
          nom = c.Value
          
          'Est-ce que la feuille existe déjà ?
          On Error Resume Next: tst = "": tst = Worksheets(nom).Name: On Error GoTo 0
          'Est-ce que nom contient des caractères interdits ?
          t = Evaluate("COUNT(IFERROR(FIND(MID(""" & interdit & """,ROW(OFFSET($A$1,0,0,LEN(""" & interdit & """))),1),""" & nom & """),""""))")
          
          If tst = "" And t = 0 And Len(nom) < 32 Then
               Worksheets.Add Count:=1, after:=Worksheets(Worksheets.Count)
               ActiveSheet.Name = nom
          Else
               Erreurs = Erreurs & "\" & nom
          End If
          
     Next c
     
     If Len(Erreurs) > 0 Then
          MsgBox "Feuilles préexistantes non recrées" & Chr(10) & "Ou nom ne convenant pas pour une feuille :" & Chr(10) & Replace(Mid(Erreurs, 2), "\", Chr(10))
     End If
End Sub

A bientôt
 

Pièces jointes

  • test1.xlsm
    29.8 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
312 047
Messages
2 084 864
Membres
102 690
dernier inscrit
souleymaane