Microsoft 365 Créer un formulaire pour duplication d'onglet avec tableau

QualitéNG

XLDnaute Nouveau
Bonjour,

Je me penche sur une fonctionnalité que je n'ai jamais testé avec Excel.

Je souhaite créé des tableaux récap des CA de plusieurs sociétés avec quelques formules, et ce à chaque mois. Un onglet = un mois. Et je nomme les tableaux en fonction du mois (et de l'année) pour venir récupérer des données via des formules sur des tableaux de stat (que je n'ai pas encore créé).

Ce fichier sera utilisé par d'autres et j'aimerais simplifier les choses pour les utilisateurs. Evidemment ils ne savent pas renommer les tableaux et même s'ils apprennent, je ne suis pas à l'abri d'une faute de frappe qui rendra le tableau introuvable dans mes formules. Je souhaite simplifier et automatiser.

Voici mon idée de base :
- je fais un tableau modèle dans un onglet modèle (que je peux modifier dans l'avenir, l'objectif est que l'automatisation le duplique et non le créer)
- ce tableau sera formaté, avec ses propres formules, son nom de tableau
- l'onglet, en plus de ce tableau, aura des cases titres pour avoir le mois et l'année mais aussi des segments pour simplifier des filtres (pareil l'idée est d'organiser cet onglet modèle pour le dupliquer)
- à chaque nouveau mois, j'aimerai avoir un formulaire qui a pour objectif de dupliquer l'onglet modèle, remplir les cases titres avec mois et année (via des listes pour éviter les fautes de frappes), modifier le nom du nouveau tableau avec mois et année et modifier le nom de l'onglet

J'ai tenté d'enregistrer une macro mais je me heurte à un manque de connaissance. J'ai regardé l'outil formulaire mais je vois comment créer des tableaux mais comme je veux dupliquer un onglet et renommer plusieurs choses, mes connaissances sont trop limitées.

J'ai créé un fichier exemple avec des sociétés au pif. Dans mon exemple j'aimerai avoir un formulaire, dans ce formulaire je note le mois de février et l'année 2024. A la validation, j'aimerai avoir un nouvel onglet nommé février 2024, identiques au modèle avec son tableau, son segment, sa mise en forme et ses formules, ainsi que les cases titres Février et 2024. Le plus important sera que la tableau sera nommé fevrier2024.

Est-ce que des gens peuvent m'aider sur ça ? Je ne sais pas par où commencer et je n'ai pas du tout les connaissances.

Merci pour votre aide.

P.S. : Si on y arrive, j'aimerais presque pousser l'automatisation plus loin avec ce même formulaire qui possède les champs à remplir de mon tableau, que les cellules protégées le soient également comme dans le modèle.
 

Pièces jointes

  • testtableaucopier.xlsm
    28.3 KB · Affichages: 1
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour QualitéNG, le forum,

De nombreuses solutions ont déjà été données sur ce forum.

Le code de l'UserForm :
VB:
Private Sub CommandButton1_Click()
If ComboBox1.ListIndex = -1 Then ComboBox1 = "": ComboBox1.SetFocus: Exit Sub
If ComboBox2.ListIndex = -1 Then ComboBox2 = "": ComboBox2.SetFocus: Exit Sub
Dim mois$
mois = ComboBox1 & " " & ComboBox2
On Error Resume Next
If IsError(Sheets(mois)) Then Else MsgBox "Ce mois a déjà été créé...": Exit Sub
Sheets("MODELE").Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = mois
[A1] = ComboBox1
[A2] = ComboBox2
Unload Me 'ferme l'UserForm
End Sub

Private Sub UserForm_Initialize()
ComboBox1.List = Sheets("Données").[A1:A12].Value
ComboBox2.List = Sheets("Données").[C1:C31].Value
End Sub
A+
 

Pièces jointes

  • testtableaucopier.xlsm
    39.9 KB · Affichages: 1

job75

XLDnaute Barbatruc
Une macro un peu plus élaborée :
VB:
Private Sub CommandButton1_Click()
If ComboBox1.ListIndex = -1 Then ComboBox1 = "": ComboBox1.SetFocus: Exit Sub
If ComboBox2.ListIndex = -1 Then ComboBox2 = "": ComboBox2.SetFocus: Exit Sub
Dim mois$, etat
mois = ComboBox1 & " " & ComboBox2
On Error Resume Next
With Sheets("MODELE")
    If IsError(.Name) Then MsgBox "Créez la feuille MODELE !", 48: End
    If IsError(Sheets(mois)) Then Else MsgBox "Ce mois a déjà été créé...": Exit Sub
    etat = .Visible
    .Visible = xlSheetVisible 'si la feuille est masquée
    .Copy After:=Sheets(Sheets.Count)
    .Visible = etat
End With
ActiveSheet.Name = mois
[A1] = ComboBox1
[A2] = ComboBox2
Unload Me 'ferme l'UserForm
End Sub
La feuille MODELE peut être masquée.

Bonjour Lolote83.
 

Pièces jointes

  • testtableaucopier(1).xlsm
    40.7 KB · Affichages: 0

QualitéNG

XLDnaute Nouveau
Bonsoir @Lolote83 et @job75,

Je vous remercie pour vos réponses. Vous avez été très réactifs.

J'avais brièvement parcouru le forum mais comme je n'ai jamais utilisé les userforms et que je n'ai pas de connaissance dans le VBA, je ne savais pas par où commencer.

Je vais étudier vos fichiers. Je vais apprendre à manier ces outils en adaptant vos solutions à mon vrai fichier utilisé.

Dernière question avant de me lancer, est-il possible de donner une position à l'onglet créé ? Si je veux que chaque nouvel onglet se positionne en deuxième par exemple. Le premier onglet étant un onglet de stat, le deuxième sera l'onglet du mois le plus récent enregistré. Du code existe pour faire ça ?

Merci beaucoup déjà pour vos réponses.
 

job75

XLDnaute Barbatruc
Bonjour QualitéNG, le forum,
Dernière question avant de me lancer, est-il possible de donner une position à l'onglet créé ?
Bien sûr, il suffit de déplacer l'onglet créé :
VB:
Private Sub CommandButton1_Click()
If ComboBox1.ListIndex = -1 Then ComboBox1 = "": ComboBox1.SetFocus: Exit Sub
If ComboBox2.ListIndex = -1 Then ComboBox2 = "": ComboBox2.SetFocus: Exit Sub
Dim mois$, etat, i
mois = ComboBox1 & " " & ComboBox2
On Error Resume Next
With Sheets("MODELE")
    If IsError(.Name) Then MsgBox "Créez la feuille MODELE !", 48: End
    If IsError(Sheets(mois)) Then Else MsgBox "Ce mois a déjà été créé...": Exit Sub
    Application.ScreenUpdating = False
    etat = .Visible
    .Visible = xlSheetVisible 'si la feuille est masquée
    .Copy After:=Sheets(Sheets.Count)
    .Visible = etat
End With
ActiveSheet.Name = mois
[A1] = ComboBox1
[A2] = ComboBox2
'---déplacement en tête---
For i = 1 To Sheets.Count - 1
    If IsDate("1/" & Sheets(i).Name) Then Sheets(mois).Move Before:=Sheets(i): Exit For
Next
Unload Me 'ferme l'UserForm
End Sub
L'onglet est déplacé avant la 1ère feuille de mois.

A+
 

Pièces jointes

  • testtableaucopier(2).xlsm
    42.3 KB · Affichages: 1

job75

XLDnaute Barbatruc
Il paraît plus logique de procéder au classement chronologique des onglets :
VB:
Private Sub CommandButton1_Click()
If ComboBox1.ListIndex = -1 Then ComboBox1 = "": ComboBox1.SetFocus: Exit Sub
If ComboBox2.ListIndex = -1 Then ComboBox2 = "": ComboBox2.SetFocus: Exit Sub
Dim mois$, etat, sc, i, dat1$, j, dat2$
mois = ComboBox1 & " " & ComboBox2
On Error Resume Next
With Sheets("MODELE")
    If IsError(.Name) Then MsgBox "Créez la feuille MODELE !", 48: End
    If IsError(Sheets(mois)) Then Else MsgBox "Ce mois a déjà été créé...": Exit Sub
    Application.ScreenUpdating = False
    etat = .Visible
    .Visible = xlSheetVisible 'si la feuille est masquée
    .Copy After:=Sheets(Sheets.Count)
    .Visible = etat
End With
ActiveSheet.Name = mois
[A1] = ComboBox1
[A2] = ComboBox2
'---classement chronologique---
sc = Sheets.Count
For i = 1 To sc - 1
    dat1 = "1/" & Sheets(i).Name
    If IsDate(dat1) Then
        For j = i + 1 To sc
            dat2 = "1/" & Sheets(j).Name
            If IsDate(dat2) Then If CDate(dat2) > CDate(dat1) Then Sheets(j).Move Before:=Sheets(i)
        Next j
    End If
Next i
Sheets(mois).Select
Unload Me 'ferme l'UserForm
End Sub
 

Pièces jointes

  • testtableaucopier(3).xlsm
    43.3 KB · Affichages: 5
Dernière édition:

Discussions similaires

Réponses
3
Affichages
267
Réponses
17
Affichages
645

Statistiques des forums

Discussions
312 210
Messages
2 086 277
Membres
103 170
dernier inscrit
HASSEN@45