Avis sur code pour mot de passe

Bonjour le forum,

J’ai un classeur qui comporte de nombreuses feuilles toutes protégées par le même mot de passe.

Pour l’instant, le mot de passe est inscrit « en dur » dans les différents codes et modules.

Je souhaite que ce mot de passe soit défini une seule fois et que sa portée concerne entièrement et uniquement ce classeur.

J’ai cherché (comme dans la chanson de l’eurovision) et j’ai trouvé (toujours dans cette même chanson) de (trop ?) nombreuses informations que j’ai essayé de condenser.

Cela donne un tout petit code qui à priori fonctionne, mais je souhaiterai savoir si toutes les instructions sont obligatoires et correctes.

J’ai donc créé un module, car d’après ce que j’ai lu, il est obligatoire que le code se trouve dans module

Option Private Module

Public pasw As String

Sub ModePa()

pasw = "CmonderniermotJP"

End Sub

La 1ere ligne, je l’ai trouvée sur une page de Microsoft, mais elle se réfère à une ancienne version d’excel qui ne bénéficie plus de mises à jour. Le « Option Private Module » ferait que la portée soit dans le classeur entier. Mais bon comme l’information date, est-elle toujours encore nécessaire ?

La 2e ligne est la déclaration « Publique » de la variable qui doit être inscrite avant la procédure.

A l’ouverture du classeur, j’ai mis l’instruction call ModePa dans ThisWorkbook pour initialiser la variable pasw.

Y a-t-il des améliorations à apporter ou faudrait-il utiliser une autre méthode ?

Je remercie par avance toute personne qui aura réussi à me lire jusque-là.

Sur le fichier joint, les 2 CheckBox en Feuil2 m’ont juste servis à savoir si la valeur était bien transmise.

Cordialement

Joseph

25essai.xlsm (24.14 Ko)

Bonjour,

En utilisant l'Option Private Module, tu fais de ton module un module privé dont le contenu n'est directement accessible qu'à partir de procédures du même module.

En déclarant à la suite ta variable pasw comme publique, tu manifestes l'intention qu'elle soit accessible de l'extérieur du module dans lequel elle est déclarée.

En effet les variables sont privées par défaut (si déclarées avec Dim elles ne seront accessibles qu'à partir du module où elles sont, inutiles de mettre Private pour qu'elles le soient, mais il faut utiliser Public pour les rendre publiques).

A l'inverse, les procédures (Sub, Function...) sont publiques par défaut (donc avec Sub inutile d'indiquer Public, mais si on veut restreindre son accès, il faut mettre Private Sub).

Ta procédure ModePa, publique, appelée à l'ouverture (inutile d'appeler une proc. avec Call, Call n'a pour effet que d'obliger à mettre les arguments entre parenthèses, comme s'il s'agissait d'une fonction, alors que sans Call on ne doit pas...), pourra donc initialiser ta variable pasw, puisqu'elle se trouve dans le même module).

Il peut paraître contradictoire de déclarer une variable publique dans un module privé, mais la contradiction n'est qu'apparente.

Si tu appelles ta variable à partir d'un autre module, quel qu'il soit, la mention de son nom : pasw ne sera pas reconnue ! Cependant la variable étant publique, elle demeure accessible de l'extérieur, à condition de l'appeler en indiquant le module dans lequel elle se trouve : Module1.pasw identifiera ta variable et te permettra de récupérer sa valeur.

Cette obligation peut constituer une sécurité d'accès rendant improbable qu'elle soit appelée par inadvertance... Mais si tu ne souhaites pas l'appeler de cette façon, tu supprimes l'Option Private Module et ta variable répondra d'emblée à son seul nom : pasw !

Cordialement.

NB - Normalement, il faut donc aussi appeler : Module1.ModePa...

Mais à l'expérience, sur ton fichier, l'initialisation se fait et la variable répond dans tous les cas ! L'option Private Module est donc sans effet... !?

Toutefois note les indications ci-dessus, si à un moment cela ne répond pas (si VBA applique l'option), tu sauras quoi faire...

edit : Au temps pour moi ! après vérification dans l'Aide, c'est au niveau du projet que cette option a un effet, donc aucun problème d'accès à l'intérieur du même classeur. Les restrictions joueront par contre d'un classeur à l'autre...

Bonjour Joseph, MFerrand !

Pas besoin de variable et de modules...

Je te donne un truc que j'utilise fréquemment.

Dans un classeur vierge tu lances cette macro.

Sub Macro1()
    ActiveWorkbook.Names.Add Name:="PSW", RefersTo:="galopin"
    ActiveWorkbook.Names("PSW").Visible = False
End Sub

Ensuite tu supprimes la macro...

Ensuite tu fais tes Protect/Unprotect de la manière suivante :

Sub testProtect()
ActiveSheet.Protect [PSW]
End Sub
Sub testUnProtect()
ActiveSheet.Unprotect [PSW]
End Sub

Je ne me rappelle plus si tu utilises UserInterfaceOnly, mébon... c'est pareil.

Bien sur au niveau de la feuille si tu veux déprotéger manuellement le mot de passe reste "galopin" !

A+

Bonjour MFerrand, Galopin, le forum,

Déjà un grand merci pour vous être penchés sur ma question.

Je vais vous répondre par ordre d’apparition à l’écran :

MFerrand, merci pour cette abondance de renseignements. Mais après une bonne dizaine de relectures, je ne suis pas vraiment sûr d’avoir tout compris (mais ça, ça vient de moi).

J’ai donc remplacé le « Call ModePa » par « ModePa » dans ThisWorkbook

Tu as également confirmé ma demande concernant « Option Private Module ». Cette instruction fait que la portée de la variable publique pasw déclarée AVANT la procédure ModePa() se fait bien dans tout le classeur aussi bien les modules que les procédures, mais uniquement dans le classeur.

Ce qui est somme toute le résultat recherché !

Bon, après je reste dans le flou pour les différences entre les modules et les procédures hors module, mais ce n’était pas l’objet de ma question.

Galopin, que dire, que dire. J’ai l’impression d’avoir fait un pas de l’autre côté de la force !

On crée une macro, on la supprime et paf il y a un mot de passe !

C’est Excel option magie et je deviens Joseph POTTER face au professeur DUMBLEDORE.

On peut aussi protéger comme cela ? : with sheet(feuille)

.Unprotect [PSW]

End with

Je suppose que les [] sont obligatoires.

Les Sub testProtect()et Sub testUnProtect()faut-il les mettre aussi dans un module avec « Option Private Module » avant ?

Ça me fait penser à quelque chose comme passer par le gestionnaire de noms, non ?

Avec sûrement une ou des différence(s) ?

Merci

Cordialement

Joseph

Bonjour,

Mes propos (avec rectifications) n'étaient de ce fait pas complètement limpides, mais tu en as saisi l'essentiel, notamment du point de vue pratique.

L'Option Private Module est relativement indifférente dans ton cas mais rien ne t'empêche de la conserver...

Toutefois, en ce qui concerne la solution Galopin ( ), elle t'introduit un mot de passe en tant que constante nommée (dans le gestionnaire de noms en effet) en utilisant une macro temporaire. Il n'y aura donc plus de macro destinée à initialiser un mot de passe par la suite ! Il est enregistré à titre définitif avec le classeur.

Seul inconvénient, il est visible dans le gestionnaire de noms (dans ta méthode précédente, il était visible dans le code). Ceci dit, un mot de passe de protection de feuille est essentiellement destiné à éviter les fausses manoeuvres...

La notation : [PSW], nom entre crochets est une notation compacte appelant le nom dans le classeur et qui donc renverra la valeur attachée au nom, soit le mot de passe. Ton utilisation est donc correcte...

Cordialement.

bonjour,

Ça me fait penser à quelque chose comme passer par le gestionnaire de noms

Absolument.

Sauf qu'après il te faut quand même passer par un brin de macro pour rendre ce nom invisible.

[Ferrand] => Sinon, ça serait sans intérêt s'il était visible dans le Gestionnaire de Noms !

Après pour la manière d'utiliser le mot de passe je t'ai fait 2 Sub pour les besoins de la démo, mais en fait tu n'as pas besoin de Sub particulière tu peux utiliser les instructions dans tes macros habituelles de ta manière habituelle.

ActiveSheet.Protect [PWD]
Sheets("blabla").Protect [PWD]
Feuil1.Protect 'si on utilise les CodeName...

Là je ne peux pas t'être d'une grande aide car il y a tellement de manière de faire qu'on pourrait en faire un livre...

On peut aussi utiliser une macro unique (à paramètre) qui protège et déprotège :

Sub WsP(Optional i)
If IsMissing(i) Then
ActiveSheet.Protect [PSW]
Else
ActiveSheet.UnProtect [PSW]
End If
End Sub

Pour tester :

Sub test()
WsP 0 'protège
End sub
ou :
Sub test()
Wsp 'déprotège
End sub

Là encore seule la ligne de commande est utile.

La Sub WsP() peut bien sur recevoir tout les paramètres habituel de Protect (DrawingObjects, UserInterfaceOnly,...)

La Sub WsP() peut elle même être masquée (intégrée dans ton perso.xlam... (alors là ça devient très fort car non seulement [PSW] est invisible mais il n'y a plus aucun moyen de connaître cette "clef" (puisque elle est contenu dans le perso) qui est censé être masqué...)

De plus, dans ce cas, le même [PSW] s'applique à tous les classeurs même s'ils ont un contenu différent :

Si le contenu de [PSW] dans classeur1 est "galopin"

Si le contenu de [PSW] dans classeur2 est "joseph"

Le même [PSW] dans ton perso.xlam va travailler avec les mots de passe respectifs à chaque classeur sans que jamais ce nom masqué ne soit cité dans ton code !

Dans cette version, on peut même rajouter un deuxième paramètre qui spécifie le nom de la feuille concernée : C'est vrai que Activesheet du coup ça devient presque trivial... (code sur demande...)

Après Private ou pas c'est sans intérêt...

A+

[Ferrand] => Sinon, ça serait sans intérêt s'il était visible dans le Gestionnaire de Noms !

Il est vrai qu'un objet Name a une propriété Visible...

Et excuses pour n'avoir lu qu'en diagonales ! (Je fatigue un peu je crois ! )

Bonne journée.

Bonjour,

Je vois que vous rehaussez le niveau.

Toutefois, je touche déjà le plafond avec la tête, et si le niveau se rehausse encore, je risque fort de terminer écrasé comme une m.... sur ledit plafond ! Ce qui ferait tache.

Attention donc...

MFerrand, merci pour tes commentaires.

J'ai cependant décelé la ligne suivante chez galopin.

ActiveWorkbook.Names("PSW").Visible = False

Le mot de passe serait donc dans le gestionnaire des noms, mais caché me semble t'il.

Ceci dit, un mot de passe de protection de feuille est essentiellement destiné à éviter les fausses manoeuvres...

Tout a fait. C'est pour éviter qu'une formule ne soit supprimée, modifiée par erreur, etc.

De plus, au fil de mes recherches sur les mots de passe, je me suis aperçu en lisant les commentaires des uns et des autres, que je dois vraiment être le seul à ne pas savoir comment retrouver un mot de passe, tellement ça a l'air facile pour tout le monde !

Galopin, et si je voulais changer le mot de passe, il suffit de refaire la même macro en mettant par exemple

ActiveWorkbook.Names. Name:="PSW", RefersTo:="joseph" au lieu de galopin ?

Bon, pour la suite, perso.xlam, j'en ai entendu parler, mais je ne dois pas en avoir un je pense. Tu me connais !

Le classeur dont je parle est sur mon PC dont je suis le seul utilisateur.

Les autres personnes utilisant ce classeur sont chez elles. Il faudrait donc faire un perso.xlam (c'est ça?) chez chacune d'elle ce qui est exclu.

MAIS, le perso.xlam, c'est fichtrement tentant d'essayer, juste pour voir !

alors là ça devient très fort

eh oui, moi aussi je voudrais devenir très fort ! (un jour) + savoir comment mettre une sympathique animation sous mon message...

Un grand merci à vous deux

Joseph

J'ai cependant décelé la ligne suivante chez galopin.

Tu as bien décelé ! C'est moi qui avait omis de la lire !

Pour changer :

ActiveWorkbook.Names("PSW").RefersTo = "joseph"

Comment mettre une animation... :

cliquer sur : Voir plus de smileys (à droite sous les smileys "courants"

Tu veux tester un perso.xlam ?

Tu colles cette macro dans un classeur vide (dans un module Standart (Module1))

Coller cette macro :

Sub WsP(Ws$, Optional i)
If IsMissing(i) Then
   Worksheets(Ws).Protect [PSW]
Else
Worksheets(Ws).Unprotect [PSW]
   End If
End Sub

A partir du menu VBA tu fais Enregistrer

Tu vas avoir la boite de dialogue Enregistrer sous qui va s'ouvrir...

Tout en bas de cette boite de dialogue tu as un champ "Type" :

Choisir (vers le bas de la liste) "macro complémentaire Excel (*.xlam)"

...puis dans le champ au dessus "Nom du fichier" tu remplace ce qui est proposé par Perso.xlam

Puis valider pour enregistrer.

Fermer Excel

Rouvrir Excel

Dans l'onglet Développeur cliquer sur Complément

Cocher Perso et valider

La macro est désormais disponible pour tous les classeurs.

Pour tester dans un classeur définir un [PSW]

puis exécuter les macros suivantes :

Sub protège()

WsP "Feuil1" 'ligne de commande à glisser dans tes macros pour protéger "Feuil1"

End Sub

Sub déprotège()

WsP "Feuil1", 0 'ligne de commande à glisser dans tes macros pour déprotéger "Feuil1"

End Sub

Tu peux définir autant de [PSW] que tu veux dans autant de classeur que tu veux la Sub WsP apliquera le [PSW] respectif de chacun.

Là encore je t'ai mis 2 Sub "Test" mais seule la ligne de commande est intéressante.

La sub WsP est paramétrée pour attendre un "Nom de Feuille" + le paramètre 0 (zéro) pour déprotéger.

Ainsi plus besoin de Sélecter les feuilles que tu veux Protéger ou non...

Nota :

Si toutefois tu dois modifier la macro ou en rajouter une autre que tu veux mettre dans ton perso.xlam

Il suffit d'aller dans ton VBA Project : Là tu vois ton perso.xlam.

En cliquant dessus en dépliant le Module1, tu vois ta macro, tu peux aussi la modifier ou en rajouter.

Dans ce cas, rappelle toi bien :

Si tu décides de modifier ton perso.xlam tu dois absolument sauvegarder ton perso.xlam DANS VBA pendant qu'il est actif.

Sinon tes modifications seront perdues : Si tu passes sur un autre projet et que tu quittes Excel en oubliant de revenir sur ton perso.xlam, aucun message ne te demandera si tu désires sauvegarder les modifications :

Le programmeur est censé savoir ce qu'il a à faire... VBA ne te demandera pas si t'es un bleu !

Tips :

Si tu à oublié la valeur de [PSW] d'un classeur... Pour le retrouver :

Dans la fenêtre d'exécution de VBA entrer

?[PSW]

A+

Si je veux

Tu veux tester un perso.xlam ?

Ah ben oui, je veux bien.

Je n'ai pas eu le temps de regarder encore, mais je ne dois pas avoir un tel classeur.

Merci

Revoir ma réponse précédente : J'ai édité le tuto...

A+

Merci galopin.

Eh bien, yapluka comme qui dirait...

Une fois de plus, je repart avec bien plus que je n'espérais !

Merci beaucoup

Amicalement

Joseph

Rechercher des sujets similaires à "avis code mot passe"