[macro] Supprimer>dupliquer>renommer un onglet

Anthonymctm

XLDnaute Occasionnel
Bonjour à tous,

J'aimerais disposer d'une petite macro qui semble simple à faire mais que je reste pour l’instant incapable de faire.

L'idée c'est de me permettre de réinitialiser tout un onglet en utilisant un onglet vierge masqué.
Je développe :
J'ai un onglet EC (0) masqué qui contient une macro
J'ai un onglet EC (1) affiché identique à EC (0) avec la même macro
Quand je clique sur cette macro, la feuille sur laquelle la macro est utilisée est supprimée, puis l'onglet EC (0) est dupliqué et reprend le nom de l'onglet qui vient d'être supprimé (EC (1) dans mon exemple)


Ce serait top de demander confirmation avant exécution de la macro avec une petit message du style "Confirmez-vous la réinitialisation ? Les données saisies sur cet onglet seront perdues."

Si vous pouvez me mettre quelques annotations dans le code que je comprenne bien de quoi il s'agit ce serait parfait <3
 
Dernière édition:
Solution
Bonjour,
La structure de mon fichier reste correct, il suffit de changer le nom des onglets.
Application.ScreenUpdating est mis à True en sortant de la macro.
Comme dit dans la macro du post #2 il doit toujours y avoir une feuille visible, donc Sheet.Visible = True dépend du contexte. Si la feuille est visible, ça ne sert à rien.

Concernant la position de la feuille, avant de détruire la feuille mémorisez sa position :
VB:
No = ActiveSheet.Index
Peut être peut on utiliser cet index pour positionner la nouvelle feuille.

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Anthonymctm,

Pourquoi la macro serait "dans la feuille" ? Avez vous un impératif ?
Car on ne met dans les feuilles que des événementielles qui agissent sur la feuille concernée, et la macro devrait supprimer la feuille qui la contient. Ça le VBA risque de ne pas aimer du tout.
Peut on tout simplement passer par une macro dans un module ?

Un exemple en PJ dont j'ai bien documenter la macro.
VB:
' Attention : Le classeur doit au moins contenir une feuille visible
' Donc dans l'ordre :
'1- Dupliquer la feuille EC(0) qui prend le nom de EC(2) puisque EC(1) existe.
'2- rendre visible cette feuille EC(2)
'3- Supprimer la feuille EC(1)
'4- Renommer EC(2) en EC(1)
' Donc bien conserver cet ordre d'execution.
Sub SupprimerCopierRenommer()
' Demande de confirmation
Confirmation = MsgBox("Etes vous sûr de vouloir réinitialiser cette feuille ?", vbOKCancel, "Demande de confirmation")
' Si Annuler, on sort
If Confirmation = vbCancel Then Exit Sub
' On fige l'écran et on inhibe les alertes
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' On duplique EC(0), elle s'appelera EC(2)
Worksheets("EC(0)").Copy After:=Sheets(Worksheets.Count)
' On la rend visible
Worksheets("EC(2)").Visible = True
' On selectionne EC(1)
Worksheets("EC(1)").Activate
' On supprime EC(1)
ActiveSheet.Delete
' On renomme EC(2) en EC(1)
Worksheets("EC(2)").Name = "EC(1)"
End Sub
 

Pièces jointes

  • Suppression de feuille et duplication modèle(V2).xlsm
    24.2 KB · Affichages: 7
Dernière édition:

Anthonymctm

XLDnaute Occasionnel
Bonjour Sylvanu,

Non non, la macro ne doit pas être présent dans la feuille ! Au contraire !
Ce que je voulais dire c'est juste que le bouton était sur la feuille :)

Quand je parlais de EC (1), c'était à titre d'exemple, en fait je peux avoir jusqu'à 10 EC (X)
Donc impossible d'écrire en toute lettre "EC (1)" ou "EC (2)" dans la macro.

Entre temps j'avais essayé un code en fouillant sur le net et j'ai fait un petit quelque chose qui fonctionne plutôt bien :
VB:
Sub Reset()
    Dim Name_OLD As String
    Dim Msg, Style, Title, Help, Ctxt, Response, MyString
    
    Name_OLD = ActiveSheet.Name 'sauvegarde l'ancien nom
    
Msg = "Confirmez-vous la réinitialisation ? Les données saisies sur cet onglet seront perdues."    ' Define message.
Style = vbYesNo + vbCritical + vbDefaultButton2    ' Define buttons.
Title = "Demande de confirmation"    ' Define title.
Help = "DEMO.HLP"    ' Define Help file.
Ctxt = 1000    ' Define topic context.
        ' Display message.
Response = MsgBox(Msg, Style, Title, Help, Ctxt)

If Response = vbYes Then    ' User chose Yes.
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    ActiveSheet.Delete 'supprime l'onglet
    Worksheets("EC (0)").Visible = True 'affiche l'onglet vierge
    Worksheets("EC (0)").Copy After:=Worksheets("EC (0)") 'copie l'ongelt vierge
    
    'ActiveSheet.Visible = True
    ActiveSheet.Name = Name_OLD 'renomme le nouvel onglet
    
  Worksheets("EC (0)").Visible = False 'masque l'onglet vierge
   
Else    ' User chose No.
    MyString = "Réinitialisation annulée"    ' Perform some action.
End If

       With ActiveSheet
               .EnableAutoFilter = True
               .EnableOutlining = True
               .Protect Contents:=True, UserInterfaceOnly:=True, AllowFormattingCells:=True, AllowInsertingRows:=True, AllowDeletingRows:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True
       End With
'Application.ScreenUpdating = True
End Sub
Le seul petit problème réside dans la position de l'onglet copié, ce serait possible de le garder à la même position qu'initialement ?

Tu peux me confirmer que le Application.ScreenUpdating = True et le ActiveSheet.Visible = True ne servent à rien ici ?
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
La structure de mon fichier reste correct, il suffit de changer le nom des onglets.
Application.ScreenUpdating est mis à True en sortant de la macro.
Comme dit dans la macro du post #2 il doit toujours y avoir une feuille visible, donc Sheet.Visible = True dépend du contexte. Si la feuille est visible, ça ne sert à rien.

Concernant la position de la feuille, avant de détruire la feuille mémorisez sa position :
VB:
No = ActiveSheet.Index
Peut être peut on utiliser cet index pour positionner la nouvelle feuille.
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 863
Messages
2 113 663
Membres
111 934
dernier inscrit
Yanoch