[VBA] Interdire changer nom feuille excel

Résolu
Bonjour,

Je voudrais savoir s'il était possible d'empécher tout renommage de feuille dans excel.
Si oui, cela peut-il s'appliquer sur certaines feuilles et non sur toutes ?

Cordialement,

PPA

7 réponses

  1. Je vais essayer d'étayer ma requête.
    J'ai plusieurs macro ajoutant des feuilles dans mon classeur.
    Ces macros dépendent de données qui sont présentes dans 4 autres feuilles du classeur.
    1- Si le nom d'une de ces 4 feuille change, la macro ne pourra s'éxécuter car elle ne trouvera pas la feuille.
    2- Si une de ces 4 feuille est supprimée, la macro ne pourra s'éxécuter car elle ne trouvera pas la feuille.

    1- La réponse serait surement dans les index. Comment la propriété index d'une feuille fonctionne ? En changeant une feuille de place, l'index de cette feuille ne va-t-il pas changer ?

    2- Comment empécher la suppression de ces 4 feuilles ?

    De plus, toutes modifications, suppressions sur les autres feuilles nouvellement créées (autre que les 4 indispensables) par les macros devra être possible.

    Cordialement,

    PPA
    1. Bonsoir

      Dommage, je le suivai de loin pour connaitre les solution ou les infos

      cordialement
      Iama
      1. Bonsoir,

        Dans votre code VBA, plutôt que d'utiliser la propriété [ Name ],
        utiliser la propriété [ CodeName ].

        Ainsi même si le nom de la feuille est modifier par l'utilisateur,
        le [ CodeName ] reste inchangé.

        Vous pouvez ainsi toujours trouver la bonne feuille.

        Exemple Type :
        Sub Recherche() 
        
            Dim ws As Worksheet 
            Dim strTexte As String 
             
            For Each ws In Worksheets 
                strTexte = strTexte & ws.Name & vbLf 
                strTexte = strTexte & ws.CodeName & vbLf 
                strTexte = strTexte & ws.Index & vbLf & vbLf 
            Next ws 
             
            MsgBox strTexte 
        
        End Sub 
        ' 
        


        Lancer cette procédure, changer le nom d'une feuille et relancer
        la procédure.

        Pour la suppression, je n'ai pas encore d'idée.

        Une bonne nuit de sommeil pourra peut-être m'inspirer :-)

        Cdt

        Info
        1. re:

          Une partie de la solution pour la suppression :

          Placer ce code derrière chaque feuille qui ne doit pas être supprimer.

          Option Explicit 
          
          Private Sub Worksheet_Activate() 
               
              Dim OptionMenu As Object 
              Dim ctrlMenu As Object 
              Dim MenuItem As Object 
               
              Set OptionMenu = CommandBars(1).Controls 
              Set ctrlMenu = OptionMenu("Edition") 
               
              For Each MenuItem In ctrlMenu.Controls 
                  If (MenuItem.ID = 847) Then 
                      MenuItem.Enabled = False 
                      Exit For 
                  End If 
              Next MenuItem 
               
          End Sub 
          ' 
          
          Private Sub Worksheet_Deactivate() 
          
              Dim OptionMenu As Object 
              Dim ctrlMenu As Object 
              Dim MenuItem As Object 
               
              Set OptionMenu = CommandBars(1).Controls 
              Set ctrlMenu = OptionMenu("Edition") 
               
              For Each MenuItem In ctrlMenu.Controls 
                  If (MenuItem.ID = 847) Then 
                      MenuItem.Enabled = True 
                      Exit For 
                  End If 
              Next MenuItem 
          End Sub 
          ' 
          


          Ces procédures "active/désactive" l'option
          du menu principal [ Supprimer une feuille ].

          Reste a trouver l'option de suppression quand on clic/droit
          sur le nom de la feuille dans le menu contextuel.

          Cdt

          Info
          1. Merci pour tes réponses Info.
            Je vais tester ça de suite.
            Je sais qu'il y a moyen de gérer l'évènement clic droit dans le menu contextuel, faut que je retrouve ça sur le net et je mettrai le code associé.

            Cordialement,

            PPA
          2. C'est bon j'ai trouvé.

            A METTRE DANS THISWORKBOOK
            Private Sub Workbook_Open()
            call ActionSuppression
            End Sub

            A METTRE DANS UN MODULE
            Sub ActionSuppression()
            Dim c As CommandBarControl
            For Each c In Application.CommandBars.FindControls(ID:=847)
            c.OnAction = "Suppression"
            Next c
            End Sub

            Sub Suppression()
            'UNE CONDITION
            MsgBox "Vous ne pouvez pas supprimer cette feuille", vbOKOnly, "INFORMATION"
            'Affiche un message au lieu de supprimer
            'AUTRE CONDITION
            ActiveSheet.Delete 'supprime si possible
            End Sub

            Cordialement,

            PPA

            Lien https://support.microsoft.com/en-us pour connaitre la liste des ID de microsoft sur les controles.
          3. Ton code fonctionne au poil .
            Merci!!!
            :)
        2. re :

          J'ai testé votre code et il ne fonctionne pas en Excel2003.

          j'ai du transformé la procédure de supression ainsi :

          Sub Suppression()
          
              Dim ws As Worksheet
          
              'UNE CONDITION
              MsgBox "Vous ne pouvez pas supprimer cette feuille", vbOKOnly, "INFORMATION"
              'Affiche un message au lieu de supprimer
          
              For Each ws In Worksheets
                  If ((ws.CodeName <> "Feuil1") And (ws.CodeName <> "Feuil3")) Then
                      ActiveSheet.Delete
                  End If
              Next ws
              
              
          End Sub
          '
          


          Cdt

          Info
          1. re:

            J'ai été trop vite dans la réécriture de la procédure !

            Désolé.

            Sub Suppression() 
            
                Dim ws As Worksheet 
            
                For Each ws In Worksheets 
                    'UNE CONDITION 
                    If ((ws.CodeName <> "Feuil1") And (ws.CodeName <> "Feuil3")) Then 
                        ActiveSheet.Delete
                        Exit For 
                    Else 
                    'Affiche un message au lieu de supprimer 
                        MsgBox "Vous ne pouvez pas supprimer cette feuille", vbOKOnly, "INFORMATION"
                        Exit For
                    End If 
                Next ws 
                 
                 
            End Sub 
            ' 
            


            Cdt

            Info