Aller au contenu
Nathan Fauconnier, profil LinkedIn (nouvel onglet)

Protéger ses formules contre l’écrasement, sans mot de passe

Empêcher qu’une saisie écrase une formule dans un fichier partagé, sans protection de feuille ni mot de passe à gérer.

La démonstration en vidéo

Vidéo publiée sur LinkedIn, chargée seulement si vous cliquez dessus. Au clic, LinkedIn peut déposer des traceurs sur votre appareil : en savoir plus.

Thème
VBA
Niveau
Intermédiaire
Publiée le
Fonctions et notions
  • Workbook_SheetSelectionChange
  • HasFormula
  • Application.Undo
  • EnableEvents
Pour aller plus loin
Formation Macros VBA

L’explication

Comment faire, pas à pas

Dans un fichier partagé, les formules ne survivent jamais très longtemps : une saisie directe par-dessus, et le calcul est remplacé par une valeur figée. Le plus gênant est que rien ne le signale : le classeur continue d’afficher un nombre plausible.

La parade repose sur deux événements de classeur, et sur une subtilité de calendrier. Une fois la saisie faite, il est trop tard pour savoir ce que la cellule contenait : la formule a déjà disparu. Le test doit donc avoir lieu avant, au moment où l’utilisateur sélectionne la cellule.

C’est le rôle du premier événement : il parcourt la sélection et mémorise, dans un booléen, la présence d’au moins une formule, c’est ce que teste la propriété HasFormula. Le second événement se contente alors de lire ce booléen et d’annuler la saisie si nécessaire.

Les zones de saisie restent libres, les zones calculées deviennent intouchables, et personne n’a de mot de passe à gérer.

À savoir Le classeur doit être enregistré au format .xlsm, macros autorisées. La protection agit à la saisie, elle ne chiffre ni ne verrouille quoi que ce soit : c’est un garde-fou, pas un coffre-fort.

Le code VBA Dans le module ThisWorkbook : ce sont des événements de classeur, ils couvrent donc toutes les feuilles d’un coup.
Public booFormule_dans_cell     As Boolean

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
' 1) Pour détecter une plage de cellules contenant une FORMULE

    Dim n           As Long

    For n = 1 To Target.Cells.Count

        If Target.Cells(n).HasFormula Then
            booFormule_dans_cell = True
            Exit For
        Else
            booFormule_dans_cell = False
        End If

    Next n

End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' 2) Pour annuler l'édition d'une cellule contenant une FORMULE
'    (formule détectée dans la SelectionChange ci-dessus)

    If booFormule_dans_cell = True Then

        Application.EnableEvents = False
        Application.Undo 'Ctrl + Z sur la dernière action
        Application.EnableEvents = True
        MsgBox "Cette zone contient une formule et ne doit pas être éditée.", _
               vbExclamation, "Ne pas modifier"

    End If

End Sub

Pour aller plus loin

D’autres astuces à découvrir

Toutes les astuces Formation Macros VBA

Prendre contact

Vous souhaitez vous former ou former vos équipes ?

Votre contexte suffit pour démarrer : nombre de personnes concernées, outils en place, échéance. Je réponds avec une proposition de programme et un devis.

En présentiel Selon votre localisation
À distance Toute la France
Financement souhaité
Contact