VBA · intermédiaire
Empêcher la suppression de colonnes sans protéger la feuille
Protéger la structure d’un tableau partagé, sans mot de passe à conserver ni à transmettre.
- Workbook_SheetChange
- UsedRange.Columns.Count
- Application.Undo
Empêcher qu’une saisie écrase une formule dans un fichier partagé, sans protection de feuille ni mot de passe à gérer.
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.
L’explication
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.
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
VBA · intermédiaire
Protéger la structure d’un tableau partagé, sans mot de passe à conserver ni à transmettre.
VBA · intermédiaire
Un TCD ne se met pas à jour tout seul. Il suffit d’oublier un clic pour présenter des chiffres périmés.
VBA · débutant
Une ligne de VBA ouvre un nouveau message avec le classeur en pièce jointe, sans avoir à le fermer.
Prendre contact
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.