Protection classeur excel VBA

Résolu/Fermé
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 25 févr. 2009 à 12:48
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 26 févr. 2009 à 09:57
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.
A voir également:

20 réponses

m@rina Messages postés 20027 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 18 avril 2024 11 269
25 févr. 2009 à 13:13
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
25 févr. 2009 à 13:17
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
25 févr. 2009 à 13:28
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
25 févr. 2009 à 13:32
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
25 févr. 2009 à 13:37
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
25 févr. 2009 à 14:17
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
25 févr. 2009 à 14:35
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
25 févr. 2009 à 16:03
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
25 févr. 2009 à 16:27
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
25 févr. 2009 à 16:32
il me dit :
erreur de compilation dans le module caché thisworkbook.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
25 févr. 2009 à 16:39
en fait excel agit comme s'il ne connaissait pas la fonction testerOuvert. Il ne la trouve pas....
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
25 févr. 2009 à 16:45
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
25 févr. 2009 à 16:45
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
25 févr. 2009 à 16:55
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
25 févr. 2009 à 17:05
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
m@rina Messages postés 20027 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 18 avril 2024 11 269
26 févr. 2009 à 00:09
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
26 févr. 2009 à 08:33
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
26 févr. 2009 à 09:54
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
26 févr. 2009 à 09:57
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
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 211
26 févr. 2009 à 07:39
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