Protection VBA avec mot de passe

Mick.24

XLDnaute Nouveau
Bonjour à vous tous passionné d'Excel,

Je suis (pour le moment) :) loin d'avoir votre niveau mais j'aimerais apprendre ce langage avec lequel tout devient possible sur Excel... J'entends le langage VBA...

Après de nombreuse recherches sur les forums je ne trouve réponse à ma question et à mon cas particulier.

Je vous explique le dilem: j'ai créé une trame avec une petite macro permettant de réaliser des calculs pour des analyses. On m'a aidé pour réaliser la macro qui permet le verrouillage de cette trame car je n'ai pas le niveau pour réaliser cela. Ca fonctionne parfaitement mais je voudrais interdire la modification de cellule verrouillée.
Actuellement mes cellules se verrouillent et se déverrouillent avec les différentes exécutions de macro mais il suffit de cliquer sur le bouton "ôter la protection" pour que toutes mes cellules soient accessibles... Je voudrais protéger cela par un mot de passe.
Je sais qu'il n'est pas possible d'utiliser la protection des feuilles excel "standard" et une protection par macro.
Je bloque donc à ce niveau...

J'ai joint le fichier en pièce jointe pour que cela soit plus clair pour vous.

Merci d'avance

Michael
 

Pièces jointes

  • Dosage.xlsm
    32.8 KB · Affichages: 70
G

Guest

Guest
Re : Protection VBA avec mot de passe

bonsoir et bienvenue sur le forum,

Si j'ai tout compris:
Code:
Public Sub Workbook_Open()
    'Déverrouillage de la feuille à l'ouverture du classeur
    With Sheets("Eurofins Potentio - Titrimétrie")
    .Protect Password:="toto", Contents:=True, UserInterfaceOnly:=True
    End With
    'Initialisation des verrouillages dynamiques
    Sheets("Eurofins Potentio - Titrimétrie").Range("F19:F39").Locked = True
    Sheets("Eurofins Potentio - Titrimétrie").Range("E17").Locked = True
        
    'Initialisation des cellules
    Worksheets("Eurofins Potentio - Titrimétrie").Range("J6").Value = "tel que"
    Worksheets("Eurofins Potentio - Titrimétrie").Range("C17").Value = "non"
    
    'Verrouillage de la feuille à l'ouverture du classeur
    With Sheets("Eurofins Potentio - Titrimétrie")
    .Protect Password:="toto", Contents:=True, UserInterfaceOnly:=True
    
    End With
    
End Sub
La feuille doit avoir été protégée par un mot de passe ("toto") avant de lancer la macro

Voir l'aide (F1) sur la methode .PRotect

A+
 

Mick.24

XLDnaute Nouveau
Re : Protection VBA avec mot de passe

Bonsoir Hasco et merci pour ta réponse rapide!

Non ce n'est pas tout à fait cela, je m'explique: l'utilisateur doit pouvoir accéder à la feuille (donc pas de verrouillage de macro par mot de passe au lancement) et aux cellules non verrouillées mais ne doit pas pouvoir ôter la protection de la macro en cliquant sur "ôter la protection de la feuille"...

Je ne sais pas si je suis très clair...

Il faut que la feuille s'ouvre (en lecture seule mais j'activerais cela par la suite) l'utilisateur saisit ses données et enregistre la trame avec "Enregistrer sous". Mais il doit pouvoir en aucun cas modifier les cellules verrouillées et là il le peux par le simple bouton "ôter la protection"...

Merci d'avance
 

ya_v_ka

XLDnaute Impliqué
Re : Protection VBA avec mot de passe

Hello

Si je comprends bien le problème, il suffirait d'utiliser la protection normale de feuille excel en y insérant un mot de passe. Las le problème ensuite est que la macro bloque sur les cellules protégées.

Si c'est bien cela, il suffit au début de chaque macro de déprotéger la feuille avec la macro "Sheets("xxx").UnProtect Password:="toto"" et à la fin de reprotéger avec "Sheets("xxx").Protect Password:="toto", Contents:=True, UserInterfaceOnly:=True"...

Et sinon il faudra être plus clair ;-)

Ya'v
 

Mick.24

XLDnaute Nouveau
Re : Protection VBA avec mot de passe

Bonjour,

Oui effectivement Ya'v c'est exactement cela mais pour moi cela était impossible... Tu ne peux faire cohabiter la protection "standard" d"une feuille Excel avec une protection macro non?

Alors j'ai essayé d'appliquer ta méthode mais j'ai une erreur que je n'arrive à trouver:

Code:
Public Sub Worksheet_Change(ByVal Target As Range)
    'Gestion évènement echantillon
    If Not Intersect([J6:J7], Target) Is Nothing Then
        Dim echantillon As String
        
        'Verrouillage de la feuille
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Unprotect Password:="toto", Contents:=False, UserInterfaceOnly:=True
        End With
        
        echantillon = Worksheets("Eurofins Potentio - Titrimétrie").Range("J6").Value
        
        fonction1 = gestion_echantillon(echantillon)
        
        'Deverrouillage de la feuille
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Protect Password:="toto", Contents:=True, UserInterfaceOnly:=True
        End With
    
    End If
    
    'Gestion évènement utilisation d'un banc
    If Not Intersect([C17:C18], Target) Is Nothing Then
        Dim utilisation As String
        
        'Verrouillage de la feuille
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Unprotect Password:="toto", Contents:=False, UserInterfaceOnly:=True
        End With
        utilisation = Worksheets("Eurofins Potentio - Titrimétrie").Range("C17").Value
        
        fonction2 = gestion_utilisation(utilisation)
        
        'Deverrouillage de la feuille
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Protect Password:="toto", Contents:=True, UserInterfaceOnly:=True
        End With
    End If
    
    'Gestion évènement nombre de titrant
    If Not Intersect([B9:C10], Target) Is Nothing Then
        Dim titrant As String
        
        'Verrouillage de la feuille
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Unprotect Password:="toto", Contents:=False, UserInterfaceOnly:=True
        End With
        titrant = Worksheets("Eurofins Potentio - Titrimétrie").Range("B9").Value
        
        fonction3 = gestion_titrant(titrant)
       
       'Deverrouillage de la feuille
       With Sheets("Eurofins Potentio - Titrimétrie")
        .Protect Password:="toto", Contents:=True, UserInterfaceOnly:=True
        End With
    End If
    
End Sub

Merci d'avance et excusez mon faible niveau

Michael
 

ya_v_ka

XLDnaute Impliqué
Re : Protection VBA avec mot de passe

Hello

Pour le peu que j'y connaisse y'a pas de raison que ça coince sur la protection/déprotection.

Juste les remarques "verrouillage de la feuille" et "déverrouillage de la feuille" qui sont inversées, mais les codes sont bien placés.

Tu gagnes un peu sur 1 seule ligne de code à éliminer le "with" : Sheets("Eurofins Potentio - Titrimétrie").Protect Password..."

Sinon pour le souci, je n'ai pas le niveau pour comprendre... désolé !

Bonne continuation

Ya'v
 

dea4an

XLDnaute Nouveau
Re : Protection VBA avec mot de passe

Bonjour,

Moi pour protéger la feuille je ferrais: Sheets("Eurofins Potentio - Titrimétrie").protect ("toto")

et pour déprotéger la feuille : Sheets("Eurofins Potentio - Titrimétrie").Unprotect ("toto")

Là ça devrait fonctionner sans problème...

Espérant avoir répondu à ton problème.

Bon courage

Arnaud
 

Mick.24

XLDnaute Nouveau
Re : Protection VBA avec mot de passe

Bonjour merci à vous deux pour vos précieux conseils car grâce à vous j'ai enfin réussi à faire fonctionner ma trame!!

Effectivement dea4an ta formulation fonctionne bien.

Je vous recopie le code qui fonctionne enfin pour aider les futurs demandeurs :)

Pour l'ouverture du classeur:
Code:
Public Sub Workbook_Open()

    'Déverrouillage de la feuille à l'ouverture du classeur
    With Sheets("Eurofins Potentio - Titrimétrie")
    .Unprotect "Eurofins"
    End With

    'Initialisation des verrouillages dynamiques
    Sheets("Eurofins Potentio - Titrimétrie").Range("F19:F39").Locked = True
    Sheets("Eurofins Potentio - Titrimétrie").Range("E17").Locked = True
        
    'Initialisation des cellules
    Worksheets("Eurofins Potentio - Titrimétrie").Range("J6").Value = "tel que"
    Worksheets("Eurofins Potentio - Titrimétrie").Range("C17").Value = "non"
    
    'Verrouillage de la feuille Excel avec mot de passe
    With Sheets("Eurofins Potentio - Titrimétrie")
    .Protect "Eurofins", True, True, True
    End With
    
End Sub

et pour les macros de la feuille excel:
Code:
Public Sub Worksheet_Change(ByVal Target As Range)
    'Gestion évènement echantillon
    If Not Intersect([J6:J7], Target) Is Nothing Then
        Dim echantillon As String
        
        'Déverrouillage de la feuille Excel
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Unprotect "Eurofins"
        End With
        
        echantillon = Worksheets("Eurofins Potentio - Titrimétrie").Range("J6").Value
        
        fonction1 = gestion_echantillon(echantillon)
        
        'Verrouillage de la feuille Excel avec mot de passe
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Protect "Eurofins", True, True, True
        End With
    
    End If
    
    'Gestion évènement utilisation d'un banc
    If Not Intersect([C17:C18], Target) Is Nothing Then
        Dim utilisation As String
        
        'Déverrouillage de la feuille Excel
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Unprotect "Eurofins"
        End With
        utilisation = Worksheets("Eurofins Potentio - Titrimétrie").Range("C17").Value
        
        fonction2 = gestion_utilisation(utilisation)
        
        'Verrouillage de la feuille Excel avec mot de passe
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Protect "Eurofins", True, True, True
        End With
    End If
    
    'Gestion évènement nombre de titrant
    If Not Intersect([B9:C10], Target) Is Nothing Then
        Dim titrant As String
        
        'Déverrouillage de la feuille Excel
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Unprotect "Eurofins"
        End With
        titrant = Worksheets("Eurofins Potentio - Titrimétrie").Range("B9").Value
        
        fonction3 = gestion_titrant(titrant)
       
       'Verrouillage de la feuille Excel avec mot de passe
        With Sheets("Eurofins Potentio - Titrimétrie")
        .Protect "Eurofins", True, True, True
        End With
    End If
    
End Sub

Merci encore et bonne journée
 

ya_v_ka

XLDnaute Impliqué
Re : Protection VBA avec mot de passe

Bonjour tous

Je propose d'inverser l'utilisation des "With"... C'est à dire de l'utiliser lorsqu'il y a plusieurs codes qui se suivent pour la même feuille et de l'éliminer lorsqu'il n'y a qu'une ligne de code :

Code:
Public Sub Workbook_Open()

    'Déverrouillage de la feuille à l'ouverture du classeur
    With Sheets("Eurofins Potentio - Titrimétrie")
        .Unprotect "Eurofins"

    'Initialisation des verrouillages dynamiques
        .Range("F19:F39").Locked = True
        .Range("E17").Locked = True
        
    'Initialisation des cellules
        .Range("J6").Value = "tel que"
        .Range("C17").Value = "non"
    
    'Verrouillage de la feuille Excel avec mot de passe
        .Protect "Eurofins", True, True, True
    End With
    
End Sub


Code:
Public Sub Worksheet_Change(ByVal Target As Range)
    'Gestion évènement echantillon
    If Not Intersect([J6:J7], Target) Is Nothing Then
        Dim echantillon As String
        
        'Déverrouillage de la feuille Excel
        Sheets("Eurofins Potentio - Titrimétrie").Unprotect "Eurofins"
        
        echantillon = Worksheets("Eurofins Potentio - Titrimétrie").Range("J6").Value
        
        fonction1 = gestion_echantillon(echantillon)
        
        'Verrouillage de la feuille Excel avec mot de passe
        Sheets("Eurofins Potentio - Titrimétrie").Protect "Eurofins", True, True, True
    
    End If
    
    'Gestion évènement utilisation d'un banc
    If Not Intersect([C17:C18], Target) Is Nothing Then
        Dim utilisation As String
        
        'Déverrouillage de la feuille Excel
        Sheets("Eurofins Potentio - Titrimétrie").Unprotect "Eurofins"
       
        utilisation = Worksheets("Eurofins Potentio - Titrimétrie").Range("C17").Value
        
        fonction2 = gestion_utilisation(utilisation)
        
        'Verrouillage de la feuille Excel avec mot de passe
        Sheets("Eurofins Potentio - Titrimétrie").Protect "Eurofins", True, True, True
       
    End If
    
    'Gestion évènement nombre de titrant
    If Not Intersect([B9:C10], Target) Is Nothing Then
        Dim titrant As String
        
        'Déverrouillage de la feuille Excel
        Sheets("Eurofins Potentio - Titrimétrie").Unprotect "Eurofins"
       
        titrant = Worksheets("Eurofins Potentio - Titrimétrie").Range("B9").Value
        
        fonction3 = gestion_titrant(titrant)
       
       'Verrouillage de la feuille Excel avec mot de passe
        Sheets("Eurofins Potentio - Titrimétrie").Protect "Eurofins", True, True, True
       
    End If
    
End Sub

Fait à la volée sans tester...

Ya'v
 

Statistiques des forums

Discussions
312 225
Messages
2 086 411
Membres
103 201
dernier inscrit
centrale vet