Protection classeur excel VBA

Résolu
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
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. m@rina Messages postés 27698 Date d'inscription   Statut Modérateur Dernière intervention   11 567
     
    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
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  7. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  8. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  9. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  10. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  11. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    il me dit :
    erreur de compilation dans le module caché thisworkbook.
    0
  12. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    en fait excel agit comme s'il ne connaissait pas la fonction testerOuvert. Il ne la trouve pas....
    0
  13. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  14. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  15. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  16. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  17. m@rina Messages postés 27698 Date d'inscription   Statut Modérateur Dernière intervention   11 567
     
    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
  18. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  19. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  20. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  21. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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