Il n'existe pas que les protections de pages et de classeurs mais aussi la protection du projet VB du classeur qui peut être accessible uniquement par mot de passe et c'est cela que je cherche à modifier par le code. Ce n'est donc ni le classeur ni une sheet mais l'ensemble des modules, des formulaires etc.
Permet moi déjà de t'engueuler pour ne pas avoir eu la
présence d'esprit de nous donner le soft et sa version (VB6, VB.Net,
VBA97, VBA2003, ...) sous laquelle tu travailles et ce en deux
messages! Ce n'est pas à nous de la deviner... Bref, pense-y la
prochaine fois STP.
Sinon, execuse ma lenteur dans ma réponse mais souhaitant qu'elle soit
la plus précise possible et ayant eu quelques petits problèmes
techniques j'ai du prendre le temps de réinstaller mon Office. Et voici
donc un petit code explicatif appuyant mon premier message :
Public varEtat As Boolean
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If varEtat = False Then
ActiveSheet.Protect
varEtat = True
Else
'Autre référence
Worksheets("Feuil1").Unprotect
varEtat = False
End If
End Sub
Code à placer, bien entendu, dans "Feuil1" d'un classeur de test. Il est à noter qu'il a été fait en VBA 6 sous Office 2000 .
Attention : En VBA (tout comme en VB ou dans tout autre language) tu as des Instructions et des fonctions qui sont propres aux language utilisé. Tu peux également coder tes propres Fonctions et Procédures (les
Instructions étant le niveau le plus bas). Autrement dit, les fonction
internes ou utilisateur ainsi que les procédures utilisateurs sont des
successions d'instructions (des sous-programmes en quelque sorte!).
Toutes ces explications afin qu'on soit bien d'accord sur les termes à
employer. En VBA on utilise surtout des objets...
Les Objets : Comme tu dois déjà le savoir les objets ne sont constitués que de 3 genres de choses : Les Propriétés, les Methodes et les Evenements.
Les Propriétés sont les variables (publiques donc, externes) de l'objet. Autrement dit, ce sont les données de l'objet (qu'il stock et qu'il peut donc utiliser).
Les Méthodes sont les fonctions(/procédure) de l'objet. C'est à dire, des bouts de code actif (les bras de l'objet).
Les Evenements, je te laisse chercher...
Pardonne moi ce rapide petit cours "objet" si tu savais déjà tout ça...
Donc, pour en revenir à ton cas, tu n'appellerais pas une procédure
mais une méthode. Et, si elle est, comme tu dis, en "read-only" ce
n'est très certainement pas une méthode mais une propriété !!!
De plus, on ne sait pas exactement ce que tu cherches à faire. Est-ce
que tu veux proteger une feuille ou un classeur tout entier ou alors si
tu cherches à proteger seulement les macros. Enfin, si seulement tu
bosses bien sous Excel!!!
Workbook.vbproject.pretection me dit que, non seulement tu as
l'illusion qu'un jour la programmation se fasse en français (Pretection
VS Protect) mais qu'un plus tu ne cherches qu'a proteger tes macros VBA
(vbproject). Quelque chose me dit aussi que tu bosses en .Net et donc,
avec une des dernière version d'Office... Comme quoi, une simple ligne
de code peut en dire long!!!
Encore que... c'est à toi de me dire si je me trompe sur toute la ligne où s'il y a une once de vérité dans mes propos !
Comme dit précédemment, je n'ai que la version 2000 de office et ne
peut donc pas t'aider vraiment si tu as une version plus récente (même
si je peux quand même essayer! ;-). Dans ce cas, et si ton problème
n'est toujours pas résolu depuis le temps, c'est de consulter l'aide de
ton VBA afin de savoir, non pas qu'elle propriété, mais qu'elle méthode
il faut utiliser. Si les mecs de chez Microsoft ne sont pas trop nases,
il devrait toujours s'agir de .Protect et de .Unprotect comme inscrit dans mon code. Mais reste à savoir ce que tu veux
vraiment proteger car le code VBA (les macros) ne se protegent pas
exactement de la même manière que les feuilles. Mais là, seule l'aide
poura t'éclairer plus loin...
En esperant que toutes ces explications auront-pu te servir,
Enjoy
<hr size ="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse accéptée". )
Tout d'abord, étant donné que le forum s'appelle VBA et non VB je pensais bien être dans un forum VBA et je bosse moi aussi sous office 2000 (désolé du manque de précision).
Et, Je cherche bien à retirer la protection des macros et non des sheets (sous Excel)
En outre, l'objet relatif aux macros est le VBProject (projet de macros) et il ne dispose pas de méthodes .Protect ou .UnProtect mais d'une propriété .Protection qui permet de savoir s'il est protégé ou non.
Ce que je vais te dire ne vas sans doute pas te plaire mais l'aide du VBA explique tout ça mieux que moi!!!
Ton erreur est belle et bien de chercher du coté de vbproject qui,
comme tu l'as remarqué, n'a pas de méthodes, plutôt que du coté des
feuilles et du classeur. Car, en réalité, ce n'est pas les macros que
tu protège, mais les feuilles ou le classeur (cf. dans le menu Outil
-> Protection). N'oubli pas que le VBA sert d'abord et avant tout
d'interface entre le code et l'interface graphique utilisateur! Du
coup, lorsque tu cherches à faire un truc, il faut d'abord regarder
comment tu devrais le faire via l'interface user (si, bien entendu,
c'est réalisable par ce biais!).
Donc, en réalité il faut bien passer par la méthode protect qui a 2
syntaxes différentes selon l'objet. Voici un petit copier/coller de
l'aide :
"
Protège un graphique ou une feuille de calcul (syntaxe 1) ou encore
un classeur (syntaxe 2) afin d'empêcher toute modification.
expression Obligatoire. Expression qui renvoie un objet
Chart ou Worksheet (syntaxe 1) ou un objet Workbook (syntaxe 2).
"
Alors toute la question est : comment proteger le code du module
ThisWorkbook ou d'un module utilisateur puisque les protections se font
page par page !?
A mon avis, ça ne devrait pas poser trop de problèmes... Déjà, il n'y a
jamais grand chose a mettre dans le module ThisWorkbook, mais sinon je
pense qu'en faisant quelques tests on devrait arriver à la conclusion
que seul les propriétés de protection (ProtectContents,
ProtectScenarios, ...) peuvent nous assurer un bon resultat...
Je te laisse tester tout ça et si tu en arrive à une conclusion
satisfaisante, fait-la nous partager via un code ici ou via un petit
Tuto car la question est reccurente et l'aide du VBA peu explicite en
la matière d'accord [on compte sur toi ]
Enjoy
( Si une réponse vous convient, cliquez sur le bouton "Réponse accéptée". )