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
    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
    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. 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
          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. 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
              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. 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
                  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
                    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
                      il me dit :
                      erreur de compilation dans le module caché thisworkbook.
                      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
                          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. 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
                              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
                                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
                                  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. 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
                                      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
                                        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
                                          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

                                          Discussions similaires

                                          etiquette pour dos classeur

                                          2 réponses