Excel: Mon code est désactivé à l'ouverture.

Résolu
Bonjour,

Sur Excel 2007, j'ai crée un petit code pour interdire la modification d'une feuille.
J'ai donc tapé ce code dans la feuille en question (le code annule toutes les modifications et affiche un message d'erreur).
Le code s'exécute normalement tant que je n'ai pas enregistré et fermé la feuille.
J'enregistre ensuite au format xlsm (classeur avec macros), et je ferme Excel.
Lorsque je rouvre mon fichier, le code ne marche plus! On peut modifier la feuille sans problème...
Je voudrais savoir comment faire pour empêcher Excel de désactiver mon code.
Je ne veux pas passer par la protection d'Excel pour interdire la modification de ma feuille.

14 réponses

  1. Contributeur
    Tu peux enregistrer en .xls (Excel97-2003)

    J'enregistre personnellement tous mes fichiers pouvant être partagés dans ce format, pour les personnes n'ayant pas les récentes versions
    1. En fait,
      Option Explicit
      Private Sub Workbook_BeforeClose(Cancel As Boolean)
       'on rétabli à la fermeture
       ThisWorkbook.IsAddin = True
      End Sub
      Private Sub Workbook_Open()
       'empêcher l'affichage d'un classeur s'il est ouvert alors que l'exécution
      'des macros est désactivée dans les options de sécurité
      ThisWorkbook.IsAddin = False
      End Sub


      Cela oblige à enregistrer sous xlam. Comment le garder sous xlsm?
      1. Je viens de voir que mon code n'était pas parfait:
        Par exemple, il ne protège pas contre la suppression des graphiques.

        Quelqu'un aurait un meilleur code?
        1. Contributeur
          OUI

          A mettre dans ThisWorBook:

          Option Explicit
          Private Sub Workbook_BeforeClose(Cancel As Boolean)
           'on rétabli à la fermeture
           ThisWorkbook.IsAddin = True
          End Sub
          Private Sub Workbook_Open()
           'empêcher l'affichage d'un classeur s'il est ouvert alors que l'exécution
          'des macros est désactivée dans les options de sécurité
          ThisWorkbook.IsAddin = False
          End Sub
          
          

          1. J'ai supprimé le code dans ThisWorkBook, effectivement il n'y a plus d'erreur, et le code fonctionne toujours.

            Si quelqu'un sait comment faire ce que je cherche sans macro, je suis preneur.

            Sinon, est-il possible d'interdire l'ouverture du classeur si les macros sont désactivées?
            1. Contributeur
              Dès l'ouverture du classeur, on lance le sub modif.

              Tu ne la lances pas à l'ouverture, elle va se lancer d'elle même au changement de saisie sur la feuille

              Pour l'exécution automatique, je souhaiterais qu'elle se fasse sur n'importe quel ordinateur, sans avoir besoin d'activer toutes les macros.

              C'est impossible, il faut trouver une autre solution sans macro. Les macros ne peuvent fonctionner que si elles sont activées
              1. On s'est mal compris:

                La cause de l'erreur est la suivante:

                Dès l'ouverture du classeur, on lance le sub modif.
                Or, le sub modif annule la dernière modification effectuée (Application.Undo). Seulement, à l'ouverture du classeur, il n'y a rien à annuler, puisqu'aucune modification n'a encore été faite. Il faudrait donc que l'on sorte du sub si aucune modification n'est présente dans l'historique.

                Pour l'exécution automatique, je souhaiterais qu'elle se fasse sur n'importe quel ordinateur, sans avoir besoin d'activer toutes les macros.
                Sinon, quelqu'un qui veut modifier la feuille n'a qu'à ne pas activer les macros, et tout mon code sera neutralisé.
                1. Contributeur
                  -Comment supprimer ce message d'erreur

                  cliquer sur Developpeur dans le ruban en haut

                  Sécurités des macros

                  Paramètres des macros: Activer toutes les macros

                  -Comment faire pour que la macro s'exécute automatiquement (si possible)

                  Et dans ThisWorkBook mettre:

                  Option Explicit
                  Private Sub Workbook_Open()
                  modif
                  End Sub
                  


                  Elle est opérationnelle à l'ouverture du classeur!!!

                  1. Je n'ai pas fait de macro pour rétablir la saisie. J'aurais pu mais je n'en ai pas besoin.

                    Après avoir fait les modifications indiquées, le message "Les macros sont désactivées" s'affiche. Je clique sur "Activer pour ce document", et un message d'erreur (erreur 1004) s'affiche. A part ça, une fois que j'ai fermé le message d'erreur, le code fonctionne.
                    Maintenant je voudrais savoir:

                    -Comment supprimer ce message d'erreur
                    -Comment faire pour que la macro s'exécute automatiquement (si possible)
                    1. Contributeur
                      Mettre dans un module:

                      Option Explicit
                      Public Sub modif()
                      Dim Skip As Boolean
                      If Skip = True Then
                      Skip = False
                      Exit Sub
                      End If
                      Skip = True
                      UserForm1.Show
                      End Sub
                      
                      


                      Dans la feuille concernée:

                      Option Explicit
                      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
                      modif
                      End Sub
                      


                      Et dans ThisWorkBook:

                      Option Explicit
                      Private Sub Workbook_Open()
                      modif
                      End Sub
                      


                      Mais je ne comprends pas trop le processus, où est la macro pour rétablir la saisie?
                      1. Voilà ce que j'ai pour l'instant: (Feuil1)

                        Dim skip as Boolean
                        Private Sub Worksheet_Change(ByVal Target As Range)
                        If skip = True Then
                        skip = False
                        Exit Sub
                        End If
                        skip = True
                        Application.Undo
                        UserForm1.Show
                        End Sub


                        UserForm1 est une fenêtre toute simple

                        Comment le transformer en macro?
                        (Désolé, le VBA, je ne connais pas trop)
                        1. Contributeur
                          Bonjour,

                          Ton code doit être une macro, exemple:

                          Sub mamacro()
                          'blablabla
                          End Sub
                          


                          Ensuite dans ThisWorkBook en haut à gauche tu mets ceci:

                          Option Explicit
                          
                          Private Sub Workbook_Open()
                          mamacro
                          End Sub