Protection classeur excel VBA

Résolu
Bonjour à tous,
Tout d'abord, précisons que je travaille sous excel 97... Désolé!!
J'ai créé un classeur, avec plein de codes VBA, que je voudrais protéger à 100%. Pour cela j'ai protéger mon classeur par Outils/Protection/protéger le classeur. Il n'y a donc pas de souci. Le seul moyen pour l'utilisateur de le "pirater" serait d'avoir accès à : Format/feuilles/afficher. La protection semblait convenir jusqu'à ce jour ou j'ai découvert qu'en ouvrant (ou créant) un 2nd fichier excel contenant la macro : workbook.UnProtect, on pouvait utiliser cette dernière pour "craquer" le 1er classeur et donc accéder à l'affichage des feuilles.
Ma question est donc simple :
comment faire, en VBA excel, pour fermer automatiquement mon classeur si un autre est ouvert ou créé?
Merci d'avance.
Cordialement.
Configuration: Windows 2003
Firefox 2.0.0.20

20 réponses

  1. Modérateur
    Merci à tous. Je pense que mon problème est résolu avec toutes vos propositions. Merci à m@rina, eriiic, lhermite et tous ceux qui ont lu ce post, se sont penchés sur mon souci et n'ont pas trouvé de solutions.
    A bientôt en tout cas.
    0
    1. Contributeur
      Re, Bonjour M@rina, Eric;
      bien entendu, j'ai un peu regarder les deux autres propositions faites.
      Le plus radical pour toi est d'employer l'exemple de M@rina, les feuilles cachée ne peuvent être affichée qu'avec du VBA.
      sauf que je n'ai pas trouver xlSheetVeryHidden mais xlVeryHidden , essaye les deux.
      Pour mise en route >> Tu ouvre un Module
      tu fait une nouvelle macros
      Sub Cache()
          Sheets("NomFeuil").Visible = xlSheetVeryHidden
          '... autant de lignes que de feuilles à cacher
          
      End Sub

      Tu met le curseur DANS la macros et tu tape F5.

      La solution d'eriic est aussi valable, si le classeur est déactiver tu ferme ton classeur.
      Private Sub Workbook_Deactivate()
      Workbooks("NomDeTonClasseur").Close
      end sub

      l'Exemple que je t'ai donné n'est plus pertinent, et a ne pas employer, quelques explications quand même..
      Le nom du Module ne peu pas avoir le même nom qu'une sub, sinon excel ne s'y retrouve pas.
      DoEvents .. Quand arrive sur cette lignes permet à d'autre processsus de s'exécuter.
      Static, avec dim, chaque fois que la sub est appellée la variable est ré initialisée (vide) avec static la valeur de la variable reste même après avoir quitté la sub.
      Conseils..
      Les mots que tu ne comprend pas.. Tu doubleclic sur le mot (il est surligné) et tu tape F1.
      A+
      0
      1. Modérateur
        Wahou!! Toutes ces infos en une seule nuit... Au fait m@rina tu dors de temps en temps??? Penser à VBA à minuit...
        Merci beaucoup je vais essayer la méthode de lhermite.
        Des petites questions comme je l'avais annoncé hier :
        1- pourquoi renommer le module 1 fait échouer cette procédure?
        2- que signifie :
        Static dans : Static Nom As String. Je connais Dim mais static?
        3- que signifie : DoEvents
        4- que peux apporter la fonction : xlSheetVeryHidden ?
        5- Workbook_Deactivate? à utiliser comment?
        Private Sub Workbook_Deactivate()
        ?????????????????
        End Sub
        Merci encore de vous être penchés sur mon problème. Je précise également qu'il s'agit d'un classeur permettant aux utilisateurs de pointer matin midi et soir. Il faut donc qu'il soit "maxi sécurisé" pour que nos chers employés ne modifient pas leurs pointages.
        0
        1. Contributeur
          Bonjour tout le monde,

          Et pourquoi pas utiliser tout simplement l'evenement Workbook_Deactivate ?
          Mais bon tu sais, les protections excel sont toutes relatives, il suffit de l'ouvrir dans open office à priori...
          eric
          -1
          1. Modérateur
            Bonsoir,

            Je vois que la conversation est bien avancée.

            Je pensais à quelque chose : et si tu utilisais la propriété VeryHidden pour cacher la feuille ?
            ça doit faire quelque chose comme :

            ActiveSheet.visible = xlSheetVeryHidden

            ça vaut peut être le coup d'essayer ?

            m@rina
            0
            1. Contributeur
              Bon, beh pour demain alors..
              Tu ne doit pas changer le nom de Module1
              Je reprend...
              Dans l'IDE de PERSO.xls
              Insertion >> Module.
              Tu change pas le nom de Module1
              Dans cette fenêtre tu colle la sub TestOuvert
              Public Sub testerOuvert()
              Static Nom As String
                  Nom = ActiveWorkbook.Name
              reco:
                  If ActiveWorkbook.Name <> Nom Then
                      Workbooks(Nom).Close
                      Exit Sub
                  End If
                  DoEvents
                  GoTo reco
              End Sub

              Toujours dans l'IDE de PERSO.xls...
              tu doubleclic sur ThysWorkBook
              Dans cette fenêtre tu colle la macros
              Private Sub Workbook_Open()
                  testerOuvert
              End Sub

              A demain.
              0
              1. Modérateur
                pas de souci pour la création de "perso", d'un module testerOuvert dans ce classeur, d'y insérer le workbookopen etc... Par contre il me dit : "fonction ou procédure attendue, pas un module"...
                merci pour tout, j'abandonne pour aujourd'hui.
                De retour dès demain avec plein de questions pour la suite...
                Merci à tous ceux qui m'ont aidé aujourd'hui et à demain
                0
                1. Contributeur
                  C'est ce que je craignais avec ton classeur protégé.
                  Revenons à la 1ère solution.
                  le répertoir est
                  c:\Document and setting\Utilisateur\Application data\Microsoft\Excel\XLSTART
                  s'il n'existe pas tu le crée.
                  Ensuite tu crée le classeur PERSO.xls que tu sauve dans ce répertoir,
                  C'est dans celui la que tu met les code.
                  0
                  1. Modérateur
                    Je crois que puisque mon projet VBA est protégé, il n'arrive pas à exécuter le module... Par contre je ne sais pas enlever temporairement cette protection, et j'en ai besoin...
                    0
                    1. Modérateur
                      en fait excel agit comme s'il ne connaissait pas la fonction testerOuvert. Il ne la trouve pas....
                      0
                      1. Modérateur
                        il me dit :
                        erreur de compilation dans le module caché thisworkbook.
                        0
                        1. Contributeur
                          Tu a tout compris.
                          Mais tout compte fait, ce n'est peut-être pas nécessaire de créer un nouveau classeur..
                          (Pas tester)
                          Dans un module de ton classeur tu copie la macros "testerOuvert"
                          Dans le thisWorkBook de ton classeur >> Open tu met
                          Private Sub Workbook_Open()
                              testerOuvert
                          End Sub

                          Ca devrait aller aussi.
                          Si pas tu dis, j'expliquerais mieux avec un classeur "PERSO"
                          0
                          1. Modérateur
                            Je ne comprends pas bien cette partie :
                            Si pas de classeur "PERSO" le créer et sauver dans le répertoir (pour Excel2000) XLSTART
                            Cacher toute les feuilles.
                            Ce classeur serra toujours ouvert en même temps que les autres.
                            dans ThisWorkBook_Open de ton classeur

                            Private Sub Workbook_Open()
                            testerOuvert
                            End Sub
                            Peux tu m'expliquer comme à un novice stp. Merci d'avance.
                            J'ai cru comprendre que je devais ouvrir un nouveau fichier, l'enregistrer sous : perso.xls dans le répertoire XLSTART (qui se trouve ou???) Et ensuite, dans quel classeur insérer testerOuvert?
                            Merci
                            0
                            1. Contributeur
                              Une idée...
                              Si pas de classeur "PERSO" le créer et sauver dans le répertoir (pour Excel2000) XLSTART
                              Cacher toute les feuilles.
                              Ce classeur serra toujours ouvert en même temps que les autres.
                              dans ThisWorkBook_Open de ton classeur
                              Private Sub Workbook_Open()
                                  testerOuvert
                              End Sub


                              Dans un module de PERSO
                              Public Sub testerOuvert()
                              Static Nom As String
                                  Nom = ActiveWorkbook.Name
                              reco:
                                  If ActiveWorkbook.Name <> Nom Then
                                      Workbooks(Nom).Close
                                      Exit Sub
                                  End If
                                  DoEvents
                                  GoTo reco
                              End Sub

                              Ferme le 1er classeur ouvert si ont ouvre un autre.
                              J'ai tester et cela semble répondre à ce que tu cherche.
                              Tu dis.
                              A+
                              0
                              1. Modérateur
                                j'ai tenté ceci :

                                Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
                                If Workbook.Add Or Workbook.Open Then
                                Workbook("pointage").Close
                                End If
                                End Sub

                                mais excel ouvre une fenêtre d'erreur qui dit :

                                Microsoft Visual Basic

                                Erreur d'exécution '424' :
                                Objet requis

                                que faire?????
                                0
                                1. Modérateur
                                  Je cherche quelque chose de ce genre :
                                  If workbook.add or workbook.open then
                                  Activeworkbook.close
                                  end if
                                  Seulement je ne sais pas ou je dois mettre ce code pour qu'il soit actif tout le temps ni s'il fonctionne réellement...
                                  0
                                  1. Modérateur
                                    Salut,
                                    et merci déjà pour les pistes. le projet VBA est déjà protégé. Pour les feuilles c'est compliqué car le classeur comporte x feuilles... Il est appeler à "grossir" son nombre de feuilles au fur et à mesure de l'utilisation. Donc impossible de les protéger.......
                                    Je cherche juste à fermer mon classeur à l'ouverture d'un autre.
                                    0
                                    1. Contributeur
                                      Bonjour,
                                      Quand tu protège le classeur c'est le partage que tu verrouille.
                                      Pour une protection plus efficace vaudrait mieux verrouillé chaque feuille et aussi le code VBA
                                      A+
                                      0
                                      1. Modérateur
                                        Oui en fait, il fonctionne quelque soit mon mdp. Dans mon 1er classeur, j'ai des macros qui s'exécutent entre les pages. Elles commencent toutes par Workbook.Unprotect("toto") et se terminent également par Workbook.Protect("toto"). Cela suffit à protéger mon classeur... jusqu'à l'ouverture d'un second avec la macro : Workbook.Unprotect qui s'exécute sans problème et déverrouille mon classeur....
                                        0
                                        1. Modérateur
                                          Bonjour,

                                          Le Workbook.Unprotect fonctionne si on met le mot de passe qui va avec... A moins qu'il n'y ait une grosse faille de sécurité sur la version 97...
                                          As-tu essayé ?

                                          m@rina
                                          0

                                          Discussions similaires

                                          etiquette pour dos classeur

                                          2 réponses