Macro mot de passe
Bonjour,
Ci dessous une macro pour protéger une ligne si la colonne 5 du tableau est "V" (fichier joint)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim oList As ListObject
Set oList = Target.ListObject
If Not oList Is Nothing And Target.Count = 1 Then
lig = Target.Row - 4
If oList.Range(lig, 5) = "V" Then
Target.Offset(, -1).Select
End If
End If
Set oList = Nothing
End Sub
Pour approfondir, est il possible qu'il demande un code "1234" par exemple pour modifier la ligne?
Vous comprenez mon idée?
Merci
Bonjour PIERRO1234, le forum,
Comme déjà souligné dans un de tes précédents posts, il ne s'agit pas d'une protection....tu décales seulement la sélection en colonne C.
Un essai pour répondre à ta demande en conservant ton mode de fonctionnement:
Un clic sur le bouton demande un mot de passe (mdp)
--->si mot de passe correct: on désactive l'évènement de la feuille
--->sinon on quitte la procédure
Un second clic sur le bouton réactive l'évènement.
Cordialement,
Merci,
Je comprends que cela décale la cellule mais ne la protège pas.
Mais comment protéger un tableau et pouvoir:
1/ trier et filtrer les colonne
2/ proteger uniquement les lignes dont la colonne 5 contient"V"
Merci
[quote=xorsankukai post_id=868068 time=1588943080 user_id=30818]
Bonjour PIERRO1234, le forum,
Comme déjà souligné dans un de tes précédents posts, il ne s'agit pas d'une protection....tu décales seulement la sélection en colonne C.
Un essai pour répondre à ta demande en conservant ton mode de fonctionnement:
Un clic sur le bouton demande un mot de passe (mdp)
--->si mot de passe correct: on désactive l'évènement de la feuille
--->sinon on quitte la procédure
Un second clic sur le bouton réactive l'évènement.
Copie de Personnel-2.xlsm
Cordialement,
Bonjour xorsankukai,
Je te remercie, c'est exactement ce principe que je voulais,
Super!!!!
Rebonjour xorsankukai ,
ci-dessous le code pour le verrouiller:
Private Sub CommandButton1_Click()
End Sub
Private Sub ToggleButton1_Click()
Dim MotDePasse As String
If ToggleButton1 = True Then
MotDePasse = InputBox("Saisir le mot de passe ?", "Titre")
If MotDePasse <> "a" Then
ToggleButton1 = False
MsgBox "Mot de passe incorrect": Exit Sub
Else
ToggleButton1.Caption = "Verrouiller"
ToggleButton1.BackColor = vbRed
Application.EnableEvents = False ' => désactive les événements
End If
Else
ToggleButton1.Caption = "Déverrouiller"
ToggleButton1.BackColor = vbGreen
Application.EnableEvents = True
End If
End Sub
Est il possible de verrouiller la feuille en cas de fermeture du fichier (je me place dans le cas ou on a déverrouillé et fermé le fichier sans verrouiller).
Merci
je joins le fichier "MACRO MOT PASSE POUR MODIFIER LIGNE STATUT V2"
Merci
Re,
Un essai.....je ne sais pas si c'est la bonne façon de faire, mais ça semble fonctionner.
Dans le module Thisworbook:
Private Sub Workbook_Open()
Sheets("Feuil1").OLEObjects("ToggleButton1").Object = False
Sheets("Feuil1").OLEObjects("ToggleButton1").Object.Caption = "Déverrouiller"
Sheets("Feuil1").OLEObjects("ToggleButton1").Object.BackColor = vbGreen
Application.EnableEvents = True
End Sub
A chaque ouverture du classeur, on réactive les évènements et on renomme le bouton "Déverrouiller" avec couleur verte.
EDIT: code simplifié qui semble fonctionner également....
Private Sub Workbook_Open()
Sheets("Feuil1").ToggleButton1 = False
Sheets("Feuil1").ToggleButton1.Caption = "Déverrouiller"
Sheets("Feuil1").ToggleButton1.BackColor = vbGreen
Application.EnableEvents = True
End Sub
Cordialement,
Re,
Un essai.....je ne sais pas si c'est la bonne façon de faire, mais ça semble fonctionner.
Dans le module Thisworbook:
Private Sub Workbook_Open() Sheets("Feuil1").OLEObjects("ToggleButton1").Object = False Sheets("Feuil1").OLEObjects("ToggleButton1").Object.Caption = "Déverrouiller" Sheets("Feuil1").OLEObjects("ToggleButton1").Object.BackColor = vbGreen Application.EnableEvents = True End Sub
A chaque ouverture du classeur, on réactive les évènements et on renomme le bouton "Déverrouiller" avec couleur verte.
MACRO MOT PASSE POUR MODIFIER LIGNE STATUT V2.xlsm
EDIT: code simplifié qui semble fonctionner également....
Private Sub Workbook_Open() Sheets("Feuil1").ToggleButton1 = False Sheets("Feuil1").ToggleButton1.Caption = "Déverrouiller" Sheets("Feuil1").ToggleButton1.BackColor = vbGreen Application.EnableEvents = True End Sub
Cordialement,
Une question stp: est il possible de le faire en worksheet au lieu de worbook?
Merci
Bonjour PIERRO1234, le forum,
Une question stp: est il possible de le faire en worksheet au lieu de worbook?
A tester:
- J'ai remplacer le bouton à bascule par un bouton classique
Private Sub CommandButton1_Click()
If CommandButton1.Caption = "Deverrouiller" Then
MotDePasse = InputBox("Saisir le mot de passe ?", "Titre")
If MotDePasse <> "a" Then
MsgBox "Mot de passe incorrect": Exit Sub
Else
CommandButton1.Caption = "Verrouiller"
CommandButton1.BackColor = vbRed
End If
Else
CommandButton1.Caption = "Deverrouiller"
CommandButton1.BackColor = vbGreen
End If
End Sub
- L'évènement" Worksheet_SelectionChange" n'est actif que si le bouton se nomme "Deverrouiller".
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim oList As ListObject
If Sheets("Feuil1").CommandButton1.Caption = "Deverrouiller" Then
Set oList = Target.ListObject
If Not oList Is Nothing And Target.Count = 1 Then
lig = Target.Row - 4
If oList.Range(lig, 5) = "V" Then
Target.Offset(, -1).Select
End If
End If
Set oList = Nothing
End If
End Sub
- Lorsque tu quittes la feuille "Feuil1", le bouton se nomme "Deverrouiller" (couleur verte), impossible de modifier les lignes contenant V en colonne H.
Private Sub Worksheet_Deactivate()
Sheets("Feuil1").CommandButton1.Caption = "Deverrouiller"
Sheets("Feuil1").CommandButton1.BackColor = vbGreen
End Sub
- Si tu fermes le classeur sans avoir quitter la feuille "Feuil1" et sans avoir "Verrouiller", on "Verrouille" à l'ouverture du classeur:
Private Sub Workbook_Open()
With Sheets("Feuil1")
.CommandButton1.Caption = "Deverrouiller"
.CommandButton1.BackColor = vbGreen
End With
End Sub
Cordialement,
Bonjour xorsankukai,
Merci pour le temps passé et les détails, très clair.
Une question stp: tu as écrit:
Private Sub Workbook_Open()
With Sheets("Feuil1")
.CommandButton1.Caption = "Deverrouiller"
.CommandButton1.BackColor = vbGreen
End With
End Sub
Je comprends que c'est lié à "l'ouverture du fichier"; est il possible de passer par une macro du style "l'ouverture de la feuille" afin de mettre cette partie de la macro dans la feuille? sinon c'est pas grave!
En tous cas merci bien pour les explications; je ne connais rien aux macros!!!!
Re,
Merci pour ton retour,
est il possible de passer par une macro du style "l'ouverture de la feuille"
Dans mon post précédent , j'utilisais l'évènement "Deactivate " de la feuille (lorsqu'on quitte la feuille), si tu veux l'inverse, donc à l'activation de la feuille:
Private Sub Worksheet_Activate()
Sheets("Feuil1").CommandButton1.Caption = "Deverrouiller"
Sheets("Feuil1").CommandButton1.BackColor = vbGreen
End Sub
Le code dans
ne sert plus à rien, on peut le supprimer...Private Sub Workbook_Open()
Testes le fichier joint....
Cordialement,
Merci,
Private Sub Worksheet_Activate()
Sheets("Feuil1").CommandButton1.Caption = "Deverrouiller"
Sheets("Feuil1").CommandButton1.BackColor = vbGreen
End Sub
Peux tu vérifier stp; la feuille s'ouvre sur "verrouiller" si on l'a ferme avec "verrouiller" !
Re,
Effectivement, si tu "déverrouille" ta feuille puis que tu fermes ton classeur, elle reste donc "déverrouillée".Si tu changes de feuille et que tu reviens dessus, elle est réactivée donc "reverrouillée".
C'est bien pour cette raison que j'utilisais
pour forcer le "Verrouillage" à l'ouverture (on peut le faire à la fermeture, si tu préfères).Private Sub Workbook_Open()
Private Sub Workbook_BeforeClose(Cancel As Boolean)
With Sheets("Feuil1")
.CommandButton1.Caption = "Deverrouiller"
.CommandButton1.BackColor = vbGreen
End With
End Sub
Cordialement,
Ok,
Je comprends,
Question pour un novice: que ce soit :
Private Sub Workbook_BeforeClose(Cancel As Boolean) OU Private Sub Workbook_Open(),
Le résultat est le meme? il va verrouiller avant fermeture ou avant ouverture? n'est ce pas?
Re,
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Exécute la macro à partir du moment où tu demandes la fermeture (fais le test, tu demandes la fermeture puis tu annules, la macro est quand même éxécutée).
Private Sub Workbook_Open()
Exécute la macro uniquement à l'ouverture du fichier.
Donc oui, le résultat est similaire,dans les 2 cas on "Verrouille",
https://www.excel-pratique.com/fr/vba/evenements_classeur
https://www.excel-pratique.com/fr/vba/evenements_feuille
Cordialement,
Grand merci pour la pédagogie!!!!
Re,
Effectivement, si tu "déverrouille" ta feuille puis que tu fermes ton classeur, elle reste donc "déverrouillée".Si tu changes de feuille et que tu reviens dessus, elle est réactivée donc "reverrouillée".
C'est bien pour cette raison que j'utilisais
pour forcer le "Verrouillage" à l'ouverture (on peut le faire à la fermeture, si tu préfères).Private Sub Workbook_Open()
Private Sub Workbook_BeforeClose(Cancel As Boolean) With Sheets("Feuil1") .CommandButton1.Caption = "Deverrouiller" .CommandButton1.BackColor = vbGreen End With End Sub
MACRO MOT PASSE POUR MODIFIER LIGNE STATUT V4.xlsm
Cordialement,
Bonjour,
Comment faire pour modifier la macro suivante
lig = Target.Row - 4
If oList.Range(lig, 5) = "V" Then
Target.Offset(, -1).Select
End If
End If
Set oList = Nothing
End If
End Sub
Afin que ce soit le tableau qui soit référencé du style List.Object(1) et donc de ne pas obliger de mettre ce tableau à partir de la ligne 4 (lig = Target.Row - 4)
Merci
Bonjour PIERRO1234, le forum,
Je ne maitrise pas trop les Listobjects...mais en fouinant un peu et en essayant d'adapter le code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim oList As ListObject
If Sheets("Feuil1").CommandButton1.Caption = "Deverrouiller" Then
Set oList = Target.ListObject
If Not oList Is Nothing And Target.Count = 1 Then
With Sheets("Feuil1").ListObjects("Tableau1")
If .Active And ActiveCell.Row <= .DataBodyRange.Row + .DataBodyRange.Rows.Count - 1 Then _
lig = ActiveCell.Row - .Range.Row + 1
End With
'Lig = Target.Row - 4
If oList.Range(lig, 5) = "V" Then
Target.Offset(, -1).Select
End If
End If
Set oList = Nothing
End If
End Sub
Cela semble fonctionner....
Cordialement,
Rebonjour et merci !
Peut on pour le tableau (ListObjects("Tableau1")) interdire :
de rajouter ou supprimer une colonne du tableau
de déplacer une colonne du tableau
de modifier les titres du tableau
Merci