VBA : subtilité inconnue et incompréhensible

Résolu/Fermé
zaXoular - Modifié par zaXoular le 21/10/2011 à 16:12
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 - 25 oct. 2011 à 17:17
Bonjour à tous !

J'essaye de développer une petit base de donnée en VBA sous Excel 2010 et je suis confronté au problème suivant :

Dans l'une des feuilles j'ai attribué à une cellule le nom : MDP

Lorsque que j'exécute le code suivant, tout fonctionne parfaitement :



     Private Sub Workbook_Open() 

          MsgBox "bonjour, le mot de passe est : " & Range("MDP").Value 
          ActiveSheet.Unprotect (Range("MDP").Value) 

     End Sub 

     Private Sub Workbook_BeforeClose(Cancel As Boolean) 

          Sheets("Feuil1").Select 
          ActiveSheet.Protect Password:=Range("MDP").Value 

     End Sub 




Par contre, ce même code dans un Private Sub Worksheet_Activate(), me donne une erreur 1004 de type : la méthode range de l'objet _worsheet a échouer....


     Private Sub Worksheet_Activate() 

           MsgBox "bonjour, le mot de passe est : " & Range("MDP").Value 
           ActiveSheet.Unprotect (Range("MDP").Value) 

     End Sub 



La macro bloque sur le range("MDP"). J'ai bien vérifier que l'étendue du nom était bien sur l'ensemble du classeur.

Je suis débutant en VBA et je ne comprend pas la subtilité entre les deux cas. Cela fait deux jours que j'écume les forum et que je reste sans réponse.
Je suis donc preneur de toutes information utiles pour mieux comprendre ce qui m'arrive :-)

Merci d'avance !

2 réponses

lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 21/10/2011 à 17:00
Bonjour,
Les transferts entre feuille ne sont pas si évident, essaye avec..
Private Sub Worksheet_Activate()  
dim MotPasse as variant 
           MotPasse = Sheets("LeNomDeLaFeuille").Range("MDP").Value  
           MsgBox "bonjour, le mot de passe est : " & MotPasse  
           ActiveSheet.Unprotect (MotPasse )  

End Sub 

A+
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
1
Bonjour et merci pour la réponse !

Effectivement j'ai du faire comme ça pour m'en sortir,

par contre je n'ai toujours pas compris pourquoi à l'intérieur d'une worksheets on ne peut pas pointer directement sur une variable déclarer au niveau global dans le classeur.

Je suppose que c'est là une preuve des subtilités du language VBA et des logiciels microsoft.

Encore Merci de votre aide....
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 25/10/2011 à 17:29
Re,
Tu confond variable globale et Nom de plage.
Une plage de cellule n'est accessible que dans la feuille où elle est située.
Sauf si tu nomme le chemin complet de la plage, c'est ce que je t'ai montrer.
Une Variable globale c'est dans un module général et doit être déclarée.
Public MaVariable As String
A+
EDIT :
Exemple :
Dans un module général tu met
    Public MotDePasse As String

et dans le Open..
Private Sub Workbook_Open()
    MotDePasse = Range("MDP").Value
    MsgBox "bonjour, le mot de passe est : " & MotDePasse
    ActiveSheet.Unprotect MotDePasse
End Sub

et dans les Activate des feuilles,
Private Sub Worksheet_Activate()
    MsgBox "bonjour, le mot de passe est : " & MotDePasse
    ActiveSheet.Unprotect MotDePasse
End Sub



Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
NOTE : Je ne répond pas aux MP pour les questions techniques.
0