Dupliquer un onglet avec VBA

Bonjour à tous,

Voici ma problématique :

Je souhaite suivre la quantité de pièces produites par mon entreprise. Pour cela je crée un onglet excel que je nomme par la date, donc aujourd'hui je le nommerai "17 octobre". Dedans on retrouve différent tableaux qui me permettent de récapituler la production journalière. Je recevrais les informations pour compléter mes tableau entre le 2 nombre et le 18 novembre.

Pour ma question on admettra que je recevrais les informations le 2 novembre.

Ma question est la suivante ; En sachant que tout les onglets seront similaire, est il possible de créer un programme VBA permettant de dupliquer l'onglet de référence ( dans mon cas l'onglet 17 octobre ) en le renommant 18 octobre pour le premier, 19 pour le second etc .. Jusqu’à la date du 2 novembre ? Ce qui m'éviterait de copier coller l'onglet à la main, puis de le renommer, et ça une trentaine de fois.

J'avais pensé à créer une macro mais il est difficile pour moi d’incrémenter pour que la date passe de 17 novembre à 18 puis 19 etc ..

Merci pour votre aide

Bonjour,

Diverses méthodes possibles selon éléments (que tu ne fournis pas) : un onglet par jour, quel que soit le jour ?

Créer une modèle d'onglet (masqué).

Chaque jour à l'ouverture du classeur, une macro automatique (on ne fera rien sans macro en la matière !) le duplique et le nomme à la date du jour.

Ou bien macro attachée à un bouton, à chaque clic sur le bouton, l'onglet est dupliqué et nommé à la date du jour suivant le dernier jour établi.

Etc.

Cordialement.

Nb- Précise ta demande, et mets un fichier si tu souhaites une réponse circonstanciée et parfaitement adaptée...

Je précise ma demande avec un exemple, ce fichier concerne les arrêts d'une machine.

Oui quelque soit le jour, samedi et dimanche inclus

J'ai réalisé un onglet 10 octobre, avec trois tableaux dans mon onglet.

Pour l'onglet 11 octobre, j'ai copié collé l'onglet 10 octobre puis je l'ai renommé. Cependant quand je dois répéter l'opération une quarantaines de fois lors de mon retour en entreprise ( je suis en alternance) l'opération est assez fastidieuse ..

Voici le fichier :

32arret-ms19.xlsm (52.70 Ko)

Suggestion :

J'ai renommé ta feuille du 11 octobre : "modelDate" (nom que tu peux changer, le changer alors aussi dans la macro), et masqué.

Procédure à l'ouverture du classeur (à mettre dans le module ThisWorkbook)

Private Sub Workbook_Open()
    Dim ws As Worksheet, d As Date, nws$, i%
    d = Date: nws = Format(d, "d mmmm")
    Set ws = Worksheets("Synthèse")
    On Error GoTo wsmnq
    Worksheets(nws).Activate
    Exit Sub
wsmnq:
    With Worksheets("modelDate")
        .Visible = True
        .Copy before:=ws
        .Visible = False
    End With
    ActiveSheet.Name = nws
    Set ws = Worksheets(nws)
    i = i + 1: nws = Format(d - i, "d mmmm")
    Resume
End Sub

Effet à constater à l'ouverture.

Cordialement.

Bonjour MFerrand ,

Merci beaucoup !! C'est déjà un gros plus pour la saisie de mes données !

J'aurai toutefois une dernière demande si elle ne vous prend pas trop de temps.

Dans le fichier que vous me proposez, lors de son ouverture, les onglets vont se dupliquer à partir du fichier 10 octobre, jusqu’à la date d'aujourd'hui.

Seulement pour mes cours je dois souvent m’absenter sur une période de 2 mois environ, et lors de mon retour en entreprise (début Janvier ) j'aurais potentiellement besoin de réaliser une synthèse des arrêts du mois de novembre.

Donc il me suffira de renommer l'onglet 10 octobre ->1 novembre, puis de lancer votre programme. J'aurai donc des onglets du 1 novembre jusqu'au 1 Janvier. Ce qui marchera très bien puisque je pourrais remplir tout les onglets de novembre. Seulement j'aurais beaucoup d'onglet vide. D'où ma demande, est il possible de renommer mon onglet 1 novembre, puis ensuite de lancer un programme qui me demanderait jusqu'à quel date je souhaite aller ? Dans mon exemple je lui indiquerais 30 novembre.

Merci pour votre aide

Cordialement

Bonjour,

Le cas de figure proposé est une procédure automatique se lançant à l'ouverture du classeur : elle cherche la feuille au nom de la date du jour, si elle ne la trouve pas, elle la génère, et poursuit en recherchant la feuille nommée de la veille, pour la générer également si elle ne la trouve pas, et ainsi de suite jusqu'à ce qu'elle parvienne à une feuille existante...

Il est indispensable qu'une telle feuille existe pour permettre à la procédure de se stopper (sans quoi cela finirait par planter en excédant les capacités...)

L'avantage de ce système est qu'il ne nécessite aucune intervention de ta part pour générer les feuilles, mais évidemment en cas d'absence prolongée cela peut amener une production en grand nombre de feuilles non souhaitées...

On peut effectivement remplacer la création automatique par un questionnement de l'utilisateur...

Ou bien un système mixte : la feuille du jour est générée à l'ouverture, éventuellement celles des 2 ou 3 jours qui précèdent si manquantes, mais au-delà soumettre la question à l'utilisateur... (et doubler le dispositif automatique par une possibilité de déclenchement manuel : il décline l'offre à l'ouverture de créer des feuilles manquantes mais peut ensuite en lancer la création manuellement).

Pas le temps de m'occuper de cela pour l'instant... j'y reviendrai.

Cordialement.

Merci pour votre réponse,

Si cela prend du temps ce n'est pas nécessaire, supprimer les onglets supplémentaires est une tache assez rapide.

Encore merci !

Cordialement

Bonsoir,

Une version mixte que tu peux réadapter.

Procédure à l'ouverture :

Private Sub Workbook_Open()
    Dim d As Date
    d = DateSuiv()
    If d > Date Then Exit Sub
    If Date - d > 3 Then
        Consult
    Else
        CréaFeuilDate d
    End If
End Sub

Si la date du jour est déjà créée, interruption. Si plus de 3 feuilles sont à créer, ouverture d'un Userform dans lequel tu peux modifier la date de la première feuille à créer (création de cette date jusqu'à la date du jour). Jusqu'à 3 feuilles, création automatique.

La fonction DateSuiv() renvoie la date de la première feuille à créer.

Function DateSuiv() As Date
    Dim d
    d = Worksheets("Synthèse").Previous.Name
    If IsDate(d) Then
        d = CDate(d)
        If Month(d) = 12 And Month(Date) = 1 Then d = DateAdd("yyyy", -1, d)
    Else
        d = Date - 1
    End If
    DateSuiv = d + 1
End Function

Pour déterminer cette date la fonction récupère le nom de la dernière feuille datée (précédant la feuille Synthèse). Si ce nom ne constitue pas une date, elle renvoie la date du jour (ce qui entrainera la création d'une seule feuille datée du jour...)

Procédure de création (lancée soit à l'ouverture, soit après validation par l'utilisateur) :

Sub CréaFeuilDate(d As Date)
    Dim i&, nws$, ws As Worksheet
    Set ws = Worksheets("Synthèse")
    Application.ScreenUpdating = False
    With Worksheets("modelDate")
        .Visible = True
        For i = d To Date
            nws = Format(i, "d mmmm")
            .Copy before:=ws
            ActiveSheet.Name = nws
        Next i
        .Visible = False
    End With
End Sub

Elle se contente d'ajouter les feuilles dans l'ordre...

Si l'utilisateur est consulté :

Sub Consult()
    Dim d As Date, vmax%
    d = DateSuiv()
    If d > Date Then Exit Sub
    vmax = CInt(Date - d)
    With UserForm1
        .d = d
        .tbD.Value = Format(d, "d mmmm")
        .spbD.Max = vmax
        .Show
        d = .d
    End With
    Unload UserForm1
    If d > 0 Then CréaFeuilDate d
End Sub

La procédure initialise le userform avec la date de première feuille et la variation maximale de cette date (constitué par l'écart avec la date du jour). L'utilisateur dispose d'un bouton-toupie pour faire varier la date. Quand il valide, les feuilles sont créées. S'il annule, aucune création n'est opérée.

Mais l'utilisateur pourra relancer la procédure par la suite, en utilisant un bouton (sur la feuille Synthèse) [auquel la procédure Consult est affectée].

Cordialement.

Rechercher des sujets similaires à "dupliquer onglet vba"