Macro pour générer des onglets suivant une liste et une feuille modèle...

Christian0258

XLDnaute Accro
Bonjour à tout le forum,

Je souhaiterais, à nouveau, votre aide afin d'écrire une macro.
Cette macro devra générer, suivant une liste, des onglets sur la base d'une feuille "Modèle"....

voir fichier

Je vous remercie, par avance, pour le temps que vous voudrez bien m'accorder.

Bien amicalement,
Christian
 

Pièces jointes

  • GénérerOnglets.zip
    13.9 KB · Affichages: 57
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : Macro pour générer des onglets suivant une liste et une feuille modèle...

Bonjour Christian0258,
Ce sujet a déjà été traité de maintes fois.
Une petite recherche t'aurais permise de trouver quelque chose dans ce style (ici adapté à ton exemple):
VB:
Sub test()
Dim i&, F As Worksheet
Application.ScreenUpdating = False
With Sheets("Fournisseurs")
    For i = 1 To .Cells(.Rows.Count, 11).End(xlUp).Row
        Tmp = Left(.Cells(i, 11).Value, 30)
        On Error Resume Next
        Set F = Sheets(Tmp)
        If Err Then
            Err.Clear
            Sheets("Modèle").Copy After:=Sheets(Sheets.Count)
            ActiveSheet.Name = Tmp
        End If
    Next i
End With
Application.ScreenUpdating = True
End Sub
Cordialement

EDIT Les noms de la liste ne sont pas tous compatible avec des noms de feuilles (plus de 30 caractères pour certains)
Je dépose le code qui évite le problème en ne prenant que les 30 premiers.

Cordialement

Re EDIT bonjour Sourcier, je ne t'avais pas vu désolé.
 
Dernière édition:

sourcier08

XLDnaute Occasionnel
Re : Macro pour générer des onglets suivant une liste et une feuille modèle...

Salut,

Impossible de faire ce que tu demandes.

1 - La limite de caractères pour un onglet est de 31.
2 - Les caractères spéciaux sont interdits.

Sinon, la macro qui devrait arriver à faire ça est :

Code:
Sub Macro1()

Dim plage As Range
Dim cell As Range

Sheets(1).Range("K1").End(xlDown).Row
Set plage = Sheets(1).Range("K1:K" & Sheets(1).Range("K1").End(xlDown).Row)

For Each cell In plage
    Sheets(2).Copy After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = cell.value    
Next cell

End Sub

Bon week-end...


[EDIT] Bonjour Efgé, j'ai encore mis trop de temps à répondre.
 

Efgé

XLDnaute Barbatruc
Re : Macro pour générer des onglets suivant une liste et une feuille modèle...

Re à tous,
Sourcier avait raison, en plus il y a des caractères interdits...
Donc il faut traiter chaque "futur nom" :
Dans le code j'utilise une fonction personnalisé SheetName
Le code principal:
VB:
Sub test()
Dim i&, F As Worksheet
Application.ScreenUpdating = False
With Sheets("Fournisseurs")
    For i = 1 To .Cells(.Rows.Count, 11).End(xlUp).Row
        Tmp = SheetName(.Cells(i, 11).Value)
        On Error Resume Next
        Set F = Sheets(Tmp)
        If Err Then
            Err.Clear
            Sheets("Modèle").Copy After:=Sheets(Sheets.Count)
            ActiveSheet.Name = Tmp
        End If
        Set F = Nothing
    Next i
End With
Application.ScreenUpdating = True
End Sub

La fonction :
VB:
Function SheetName(ByRef Nom As String) As String
Dim Interdits(), i%, T!
T = Timer
Interdits = Array("[", "]", "\", "/", "?", "*", ":")
Nom = Trim(Nom)
For i = LBound(Interdits) To UBound(Interdits)
    Nom = Replace(Nom, Interdits(i), "")
Next
If Len(Nom) > 30 Then Nom = Left(Nom, 30)
If Len(Nom) = 0 Then
    Do
    Loop While Timer < T + 0.01
    Nom = Format(Date, "yymmdd") & Replace(Timer, Application.International(3), "")
End If
SheetName = Nom
End Function

Il faut bien évidemment copier les deux dans le même module.
Cordialement
 

Christian0258

XLDnaute Accro
Re : Macro pour générer des onglets suivant une liste et une feuille modèle...

Re, le forum, Efgé, soucier08,

Merci à vous pour le boulot.
J'ai bien noté vos remarques sur la limite de caractères et les caractères eux-mêmes.

Encore un grand merci.
Bien à vous,
Christian
 

Christian0258

XLDnaute Accro
Re : Macro pour générer des onglets suivant une liste et une feuille modèle...

Re, le forum, Efgé,

Je reviens vers vous pour ce sujet...

Comment modifier le code écrit par Efgé :

For i = 1 To .Cells(.Rows.Count, 11).End(xlUp).Row
Tmp = SheetName(.Cells(i, 11).Value)

afin de prendre pour référence, non pas la colonne 11,
toujours dans la feuille "Fournisseurs", mais la zone ; D10 à D39

Merci pour votre aide si précieuse.
Bien à vous,
Christian
 

Christian0258

XLDnaute Accro
Re : Macro pour générer des onglets suivant une liste et une feuille modèle...

Re, le forum, Efgé,

Merci, Efgé, pour ton aide.
Un grand merci.

Dis-moi, Efgé, ma liste de D10 à D39 peut-être + ou - remplie, c'est le cas actuellement, il reste 7 cellules vides...et de fait ça me génère autant de feuille au format chiffre...comment faire pour ne pas générer les onglets dans le cas de cellules vides...

Bien amicalement,
Christian
 
Dernière édition:

sourcier08

XLDnaute Occasionnel
Re : Macro pour générer des onglets suivant une liste et une feuille modèle...

Salut,

Tu peux ajouter, je pense :

Code:
If Cells(i, 4).Value = "" then resume next

ce qui donnerait :
Code:
Sub test()
Dim i&, F As Worksheet
Application.ScreenUpdating = False
With Sheets("Fournisseurs")
    For i = 10 To 39
        Tmp = SheetName(.Cells(i, 4).Value)
        If Cells(i, 4).Value = "" then resume next
        On Error Resume Next
        Set F = Sheets(Tmp)
        If Err Then
            Err.Clear
            Sheets("Modèle").Copy After:=Sheets(Sheets.Count)
            ActiveSheet.Name = Tmp
        End If
        Set F = Nothing
    Next i
End With
Application.ScreenUpdating = True
End Sub

À tester !
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : Macro pour générer des onglets suivant une liste et une feuille modèle...

Re, Bonjour Sourcier08,
@ Sourcier08:
Si tu utilise Cell, sans l'avoir définie, tu auras toujours cell = "".
Donc on peux faire plutot :
VB:
Sub test_2()
Dim i&, F As Worksheet
Application.ScreenUpdating = False
With Sheets("Fournisseurs")
    For i = 10 To 39
        If .Cells(i, 4).Value < > "" Then
            Tmp = SheetName(.Cells(i, 4).Value)
            On Error Resume Next
            Set F = Sheets(Tmp)
            If Err Then
                Err.Clear
                Sheets("Modèle").Copy After:=Sheets(Sheets.Count)
                ActiveSheet.Name = Tmp
            End If
            Set F = Nothing
        End If
    Next i
End With
Application.ScreenUpdating = True
End Sub
Cordialement

Edit
Comme tu as modifié ton post:
C'est pire :D
Tmp va être de valeur numérique puisque la fonction va voir que la valeur est vide et que tu vérifie après la passage de la fonction :D
Donc on se retrouvera avec le problème évoqué par Christian (création de la feuille).

Cordialement
 
Dernière édition:

Christian0258

XLDnaute Accro
Re : Macro pour générer des onglets suivant une liste et une feuille modèle...

Re, le forum, sourcier08, Efgé,

Merci à vous, pour votre aide si précieuse et pour le temps que vous bien voulu m'accorder.

Efgé, ton code est parfaitement parfait.

Bien à vous,
Christian
 

Discussions similaires

Statistiques des forums

Discussions
312 466
Messages
2 088 662
Membres
103 910
dernier inscrit
amor57