Création automatique et dynamique d'onglets

avec ta proposition, si il n’y a qu’un seul nom en colonne A et que l’on appuie sur le bouton, une message box « rien à faire » apparait.
ma question est :
Est il possible qu’avec un seul nom en colonne A cellule A6, l’onglet soit créé avec le nom de la cellule A6 ?

comme ceci ?
test_Creation_Auto_Onglet (1).xlsm (35,8 Ko)

TOP du TOP :+1:
désolé, d’abuser mais j’ai une dernière question.
Quand les onglets sont créés, est il possible que chacun d’entre eux ait le même tableau vide préformaté avec les entêtes " NOMS", « ADRESSE », « CODE POSTAL »…
si oui, comment dois je procéder ?
Après cela, j’en aurais terminé avec les onglets.
Merci.
bonne soirée

test_Creation_Auto_Onglet (1).xlsm (38,3 Ko)
le nom du tableau est le même que la feuille avec prefix « TBL_ »

1 « J'aime »

Bonjour @Cow18
Vraiment !!! RESPECT
Maintenant, à moi d’adapter cette super macro a mon projet et tenter de comprendre le fonctionnement pour ajouter des entêtes au tableau.
Mille MERCI pour la réactivité et les solutions fonctionnelles.

Bonne journée.

1 « J'aime »

avec explication

Sub Creation()
     Dim aA, aListe, i, sh, sh1, sh0, N, Dict, LO

     Set sh1 = Sheets("Feuil1")              'votre feuille
     Set Dict = CreateObject("scripting.dictionary")     'création d'un dictionaire pour avoir que des noms uniques !!!
     Dict.comparemode = vbTextCompare        'orthographe en masjucules=miniscules, donc FEUIL1 = feuil1 = FeUiL1
     For Each c In sh1.Range("A6:A30").Cells     'ajouter tous les noms de cette plage au dictionaire, mais le dictionaire a la propriété d'ignorer les doublons (même avec un orthographe différent masjucules/miniscules)
          If Len(c.Value) > 0 Then Dict(CStr(c.Value)) = vbEmpty
     Next
     For Each sh In ThisWorkbook.Sheets      'même chose, ajouter tous les noms "uniques" des feuilles aud dictionaire
          Dict(CStr(sh.Name)) = vbEmpty
     Next
     Dict.Remove sh1.Name                    'supprimer le nom de "feuil1" dans le dictionaire (sera toujours la première feuille dans le fichier)

     N = Dict.Count                          'nombre d'éléments uniques dans le dictionaire
     If N = 0 Then MsgBox "rien à faire": Exit Sub     'aucun autre nom que "Feuil1" (situation, la plage est vide ou ne contient que "feuil1" et on n'a que la "feuil1" comme feuilles
     If N = 1 Then Dict(WorksheetFunction.Rept("Z", 255)) = vbEmpty     'ajouter un "dummy" qu'on n'utilisera pas (sursauter un inconvénient des dictionaires qui ne contiennent qu'un élément = ajouter un 2eme et l'ignorer, avec un élément, on n'a pas une liste)
     aListe = Application.Transpose(Application.Sort(Application.Transpose(Dict.keys)))     'liste trié alphabetique avec les anciens et nouveaux noms

     For i = 1 To N                          'traiter ces noms triés
          If aListe(i) <> sh1.Name Then      'sorry, cette ligne sert à rien, on avait déjà supprimer ce nom du liste ici dessus !
               On Error Resume Next          'continuer si on fait une erreur
               Set sh = Nothing              'reset de sh
               Set sh = Worksheets(aListe(i))     'assigner la feuille nommée comme aliste(i) à sh, donc cette feuille existe déjà, autrement erreur
               On Error GoTo 0               'fin de continuer en cas d'erreur

               If i = 1 Then Set sh0 = sh1 Else Set sh0 = Sheets(aListe(i - 1))     'si i=1, la feuille précédente est "feuil1", autrement le nom précédent dans la liste
               If sh Is Nothing Then         'on avait fait une erreur ici dessus, cette feuille n'existe pas encore  >>> créer au bon endroit !!!
                    Sheets.Add(after:=sh0).Name = aListe(i)     'ajouter et nommer feuille après feuille précédente
                    With ActiveSheet         'avec cette nouvelle feuill
                         Set c = .Range("C2").Resize(, 3)     'plage de l'entête du tableau à partir de C2
                         c.Value = Array("Nom", "Adresse", "Code Postal")     'les entêtes
                         Set LO = .ListObjects.Add(xlSrcRange, c, , xlYes)     'créer le tableau structuré
                         On Error Resume Next     'continuer en cas d'erreur
                         LO.Name = "TBL_" & aListe(i)     'nommer ce tableau (erreur, si ce nom existe déjà, alors le tableau aura un nom général, genre "TableauX" avec X=chiffre
                         On Error GoTo 0     'fin continue en cas d'erreur
                    End With

               Else                          'feuille existante = éventuellement déplacer
                    sh.Move after:=sh0
               End If
          End If
     Next

     Application.Goto Sheets("Feuil1").Range("A1")     'se positionner dans cette cellule pour terminer
End Sub

Donc le dictionaire est l’outil le plus important ici pour créer une liste avec des noms uniques, même si ces noms ont un orthographe différent en masjucules ou miniscules.Si le dictionaire ne contient qu’un élément, on ne sait pas créer une liste, c’st pourquoi on ajoute un « dummy » >>> ici le nom « ZZZZZZZZZZ…Z » (255 fois Z en triant, il sera certainement le dernier) qu’on ignorera.
Puis avec cette liste (et sans le nom « Feuil1 »), on crée des nouvelles feuilles ou on déplace les feuilles existantes dans la séquence de la liste « aListe » et avec « Feuil1 » comme première feuille.
On ajoute un tableau seulement aux nouvelles feuilles

2 « J'aime »

Super @Cow18
tes explications m’ont permis de comprendre ce que je devais modifier pour ajouter des entêtes et visualiser le cheminement de la macro, bien que je ne sois pas au top concernant l’utilisation des formules vba.
pour preuve, je me heurte a un autre petit problème qui est le suivant.
si je veux rajouter une feuille « Data » et une feuille « INTERFACE » avant la feuille 1 et que celles ci restent avant la feuille 1 même après avoir créé les autres feuilles.
est ce bien dans la boucle IF juste avant la création du tableau que je doive modifier quelque chose ?
ou bien la ligne sh.Move After:=sh0
Merci .

c’est même plus facile
For Each sh In ThisWorkbook.Sheets 'ajouter tous les noms des feuilles aud dictionaire
Dict(CStr(sh.Name)) = vbEmpty
Next
Dict.Remove sh1.Name 'supprimer le nom de « feuil1 » dans le dictionaire (sera toujours la premièer feuille)
On Error Resume Next 'continuer en cas d’erreur
** Dict.Remove « Interface » 'supprimer « interface » dans le dictionaire**
** Dict.Remove « DATA » 'supprimer « data » dans le dictionaire**
** On Error GoTo 0**

 N = Dict.Count                          'nombre d'éléments uniques dans le dictionaire
 If N =
    For Each sh In ThisWorkbook.Sheets      'ajouter tous les noms des feuilles aud dictionaire
          Dict(CStr(sh.Name)) = vbEmpty
     Next
     Dict.Remove sh1.Name                    'supprimer le nom de "feuil1" dans le dictionaire (sera toujours la premièer feuille)
     On Error Resume Next                    'continuer en cas d'erreur**********************************************************
     Dict.Remove "Interface"                 'supprimer "interface" dans le dictionaire************************************************
     Dict.Remove "DATA"                      'supprimer "data" dans le dictionaire***************************************************
     On Error GoTo 0                         '*******************************************************************************

```ignore mon message précédent, avec ces 4 lignes marquées avec "*****", cela fonctionnera.
L'idée est que, si ces feuilles existent, ils seront ajoutées dans le dictionaire, mais puis on les supprime, donc dans le déroulement, ces feuilles ne seront plus traitées (ni ajouté s'elles n'existent pas, ni déplace s'elles existent). Si ces feuilles se trouvent avant la feuille "Feuil1", elles y restent. Sinon elles seront déplacées vers la queue, parce que les feuilles dans "aListe" seront insérées

[test_Creation_Auto_Onglet (1).xlsm|attachment](upload://9T2ybH2VLb5OvVVM88IyYHtTcwc.xlsm) (55,4 Ko)

test_Creation_Auto_Onglet (1).xlsm (55,4 Ko)
je ne comprends pas ce qui se passe avec mes textes ici ???

2 « J'aime »

ouaaahh quelle maitrise… :+1:
c’est pas simple, mais quand on voit les possibilités que cela offre, tenter d’apprendre le langage vba mérite de s’y intéresser.

Vraiment merci pour ton aide.
bonne soirée

1 « J'aime »