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,

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.

Ah bon ? En théorie, le "BeforeSave" se déclenche quand tu cliques sur "Enregistrer" ou "Enregistrer sous" non ?
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...

2indicateur.xlsx (12.42 Ko)

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 !

Rechercher des sujets similaires à "probleme evenement beforesave"