Problème avec l'évènement "BeforeSave"
Bonjour,
je souhaite protéger un fichier Excel contre les modifications par des personnes non autorisées,
j'utilise donc l'évènement "BeforeSave", qui m'ouvre un InputBox pour entrer le mot de passe.
Ceci fonctionne bien, toutefois il se passe quelquechose que j'aimerai éviter :
Si l'utilisateur veut fermer le fichier, l'évènement "BeforeSave" se déclenche s'il y a eu des modifications.
Jusque là, normal.
Mais si la personne ferme cette InputBox, ou si elle rentre un mot de passe erroné, le fichier est fermé et les modifications sont annulées.
J'aimerai dans ce cas afficher un message à l'utilisateur lui proposant de choisir entre "une nouvelle tentative", et "confirmer la fermeture du fichier sans enregistrement".
Voici le code actuel :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Reponse As Variant
Reponse = Application.InputBox("Entrez votre identifiant", "Autorisation", , , , , , 2)
If VarType(Reponse) = vbBoolean Then
Cancel = True
ElseIf StrComp(Reponse, "MDP") <> 0 Then
Cancel = True
MsgBox "identifiant érroné, veuillez réessayer !", vbOKOnly, "Erreur"
Else
End If
End Sub
Quelqu'un pourrait-il m'aider à coder l'apparition de ce nouveau Popup de choix ?
Bonjour piratman,
Ah bon ? En théorie, le "BeforeSave" se déclenche quand tu cliques sur "Enregistrer" ou "Enregistrer sous" non ?piratman a écrit :Si l'utilisateur veut fermer le fichier, l'évènement "BeforeSave" se déclenche s'il y a eu des modifications.
Jusque là, normal.
vba-new a écrit :Ah bon ? En théorie, le "BeforeSave" se déclenche quand tu cliques sur "Enregistrer" ou "Enregistrer sous" non ?
Bonjour,
eh bien il se déclenche aussi quand on ferme un fichier qui a eu des modifications, qui demande donc à être enregistré...
Re,
Fais des tests avec ça :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Reponse As Variant
Reponse = Application.InputBox("Entrez votre identifiant", "Autorisation", , , , , , 2)
If VarType(Reponse) = vbBoolean Then
Cancel = True
ElseIf StrComp(Reponse, "MDP") <> 0 Then
Do While StrComp(Reponse, "MDP") <> 0 And VarType(Reponse) <> vbBoolean
Cancel = True
MsgBox "identifiant érroné, veuillez réessayer !", vbOKOnly, "Erreur"
Reponse = Application.InputBox("1 : Une nouvelle tentative ?" & vbCrLf & "2 : Fermer le fichier sans enregistrer", "Choisir 1 ou 2", , , , , , 2)
Select Case Reponse
Case 1
Reponse = Application.InputBox("Entrez votre identifiant", "Autorisation", , , , , , 2)
Case 2
ThisWorkbook.Close SaveChanges:=False
Case False
Exit Sub
Case Else
MsgBox "Fallait choisir 1 ou 2 !", vbExclamation
End Select
Loop
End If
End Sub
Pas sûr que ça fasse tout ce que tu veux mais bon...
Merci pour l'aide, mais ce que je veux éviter, c'est que l'utilisateur voit toutes ses modifications perdues s'il clique "Annuler" de la 1° InputBox, or même avec ton code, c'est le cas.
J'ai tenté ceci de mon coté :
Dim Reponse As Variant
Reponse = Application.InputBox("Entrez votre identifiant", "Autorisation", , , , , , 2)
If VarType(Reponse) = vbBoolean Then
Reponse = MsgBox("Fichier non sauvegardé, Réessayer ?", vbYesNo)
If Reponse = vbYes Then ' L'utilisateur a choisi Oui.
Reponse = Application.InputBox("Entrez votre identifiant", "Autorisation", , , , , , 2)
' If VarType(Reponse) = vbBoolean Then MsgBox "Modifications perdues...", vbOKOnly
' Cancel = True
' ElseIf StrComp(Reponse, "MDP") <> 0 Then
' Cancel = True
' End If
Else ' L'utilisateur a choisi Non.
Cancel = True
End If
ElseIf StrComp(Reponse, "MDP") <> 0 Then
Reponse = MsgBox("Mot de passe érroné, Réessayer ?", vbYesNo)
If Reponse = vbYes Then ' L'utilisateur a choisi Oui.
Reponse = Application.InputBox("Entrez votre identifiant", "Autorisation", , , , , , 2)
' If VarType(Reponse) = vbBoolean Then MsgBox "Modifications perdues...", vbOKOnly
' Cancel = True
' ElseIf StrComp(Reponse, "MDP") <> 0 Then
' Cancel = True
' End If
Else ' L'utilisateur a choisi Non.
Cancel = True
End If
End If
End Sub
Mais je ne comprend pas, je fais une erreur de syntaxe, si j'enlève les commentaire (2x 5 lignes) Je ne peux enregistrer car j'ai un message "Erreur de compilation : Else sans If"
Je ne vois pas ce qu'il y a de pas bon dans ce code, quelqu'un pourrait m'aider ?
Me disait bien que j'avais pas tout compris !
Pour ton code, la ligne contenant le 3è If n'est pas bonne.
Plutôt que comme ça :
If VarType(Reponse) = vbBoolean Then MsgBox "Modifications perdues...", vbOKOnly
fais plutôt comme ça :
If VarType(Reponse) = vbBoolean Then
MsgBox "Modifications perdues...", vbOKOnly
Pour le 5è if de ton code également, pour l'instruction qui se trouve après le Then, mets-la à la ligne plutôt que sur la même.
Ah d'accord, je vais essayer ça.
Par contre, y a t'il une règle spéciale car il me semble avoir déja vu le THEN sur la même ligne que le IF...
Par exemple, un :
If a > 1 Then a = b: b = 0
équivaut à un :
If a > 1 Then
a = b
b = 0
End If
Donc si tu mets sur la même ligne, pas de end if.
Ah d'accord...
Ca doit paraitre évident pour la plupart d'entre vous, mais moi je viens d'apprendre quelquechose !