par , 13/08/2021 à 18h54 (7889 Affichages)
Préambule
Si les avantages d'utiliser les tableaux structurés ne sont plus à démontrer, il n'en reste pas moins qu'il y a à mon avis un inconvénient majeur c'est l'impossibilité qu'il y a de protéger les cellules contenant des formules sans perdre la création dynamique des lignes du tableau et la propagation des formules et autres fonctionnalités telles que Validation de données et Mise en forme conditionnelle
Il est dommage que les développeurs de Microsoft n'aient pas prévu un bouton d'option à cocher permettant de Verrouiller / déverrouiller l'accès aux cellules contenant des formules
Ayant dû à maintes reprises intervenir pour des clients ayant écrasé par mégarde une formule ou même la valeur d'une cellule des titres entrainant ainsi des erreurs lors des recherches sur ces tableaux, j'ai implanté il y a quelques années une procédure empêchant cette erreur de manipulation.
En mars 2019, j'avais déjà publié une contribution à ce sujet et titré Empêcher la sélection d'une cellule contenant une formule dans un ListObject mais je l'ai allégée en simulant simplement la touche Tab et en incluant la ligne des titres dans les cellules à verrouiller.
J'aurais donc pu titrer ce billet Empêcher la sélection d'une cellule d'un tableau structuré qui contient une formule OU une cellule de la ligne des titres
A signaler : Même si je le trouve mineur, il y a un inconvénient qui doit être mentionné.
Si une formule se trouve en dernière colonne et que nous sommes à la dernière ligne, le fait de simuler la touche Tab va activer la création d'une nouvelle ligne.
Code de la procédure
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Function BypassLockedCell(oTable As ListObject, Optional IsInTest As Boolean = True)
' Empèche la sélection des cellules contenant une formule ou un titre
' Emulation de la touche Tab pour les cellules contenant les formules et sélection de la première cellule des données (DataBodyRange)
' si la sélection se fait sur la ligne des titres
'
' Author : Philippe Tulliez (www.magicoffice.be)
' Version : 1.1
' Arguments
' oTable (LisObject) Table à traiter
' [IsInTest] (Boolean) (d:True) si Vrai la procédure n'agit pas
If Not IsInTest Then
With oTable
If Not Application.Intersect(Selection, .HeaderRowRange) Is Nothing Then
.DataBodyRange.Cells(1, 1).Select
Else
If Selection.HasFormula Then Application.SendKeys "{TAB}"
End If
End With
End If
End Function |
Code de la procédure événementielle qui l'invoque
Afin que cette fonctionnalité soit accessible sur l'ensemble des tableaux du classeur, j'utilise la procédure événementielle Workbook_SheetSelectionChange présente dans le module ThisWorkbook
Le deuxième argument IsInTest sert à la maintenance du classeur.
Je l'ai alimenté ici par une constante de type booléen nommée InTest et déclarée en tête de module mais en production, j'utilise un propriété du classeur (membre de la collection CustomProperties).
1 2 3 4 5 6 7 8 9 10 11
| Option Explicit
Const InTest As Boolean = False
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim oList As ListObject
Set oList = Target.ListObject
If Not oList Is Nothing Then
BypassLockedCell oList, IsInTest:=InTest
End If
Set oList = Nothing
End Sub |