Contexte
Pour bénéficier de la création dynamique des lignes et colonnes d'un tableau structuré, il est impossible de protéger la feuille parente de celui-ci.
Dans cette contribution je vous propose une procédure événementielle Worksheet_SelectionChange qui empêche la sélection de toute cellule contenant une formule, évitant ainsi à l'utilisateur d'effacer par mégarde une formule lors de l'encodage.
Pour fonctionner
- un seul tableau dans la feuille parente (ListObject(1))
- le tableau doit commencer en cellule A1
- Créer une cellule nommée IsTest (voir ci-dessous)
Fonctionnalités
- Si aucune ligne n'est présente dans le tableau (DataBodyRange = Nothing), la première ligne est insérée dès que l'on sélectionne une cellule de la ligne vide du tableau ou la ligne de titre.
- En se déplaçant à l'aide de la touche Tab ou Return, une ligne est automatiquement insérée dès que l'on atteint la dernière ligne, dernière colonne autorisée (contenant une constante)
- La sélection d'une cellule non autorisée (contenant une formule) provoque la sélection de la cellule suivante et va à la ligne suivante si la ou les cellules non autorisées se trouve en dernière colonne de la ligne
- Important : La procédure prévoit la possibilité d'effectuer une maintenance.
Il y a donc lieu de créer une cellule nommée IsTest (A placer par exemple dans une feuille "paramètre" et qui si elle contient la valeur VRAI (pour la version française pou TRUE pour version anglaise) permettra de sélectionner les cellules contenant une formule. Dans le cas contraire (en mode production), il y a lieu qu'elle contienne FAUX (FALSE) ou qu'elle soit vide
Illustration
Dans l'illustration ci-dessous (Exemple du classeur à télécharger), les colonnes A, C, E et F contiennent une formule et il est donc impossible de sélectionner une cellule de l'une d'elles.
Code de la procédure
Liens
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' Evite la sélection des cellules contenant une formule dans un Tableau structuré ' et insère une ligne lorsque l'on atteint la dernière colonne de la dernière ligne ' Le tableau traité doit être seul sur la feuille ' Afin de pouvoir effectuer la maintenance ' Une cellule nommée "IsTest" doit être crée contenant soit VRAI (vers FR) soit FAUX (ou vide) ' Si VRAI la procédure est désactivée ' Author : Philippe Tulliez http://www.MagicOffice.be ' Dim oLst As ListObject Dim LastRow As Long Set oLst = Me.ListObjects(1) With oLst If .ShowTotals Then LastRow = .TotalsRowRange.Row If Target.Row <> LastRow Then If Not Application.Intersect(Target, .Range) Is Nothing Then If ThisWorkbook.Names("istest").RefersToRange.Value Then Exit Sub If .DataBodyRange Is Nothing Then .ListRows.Add .DataBodyRange.Cells(1, 1).Select Else If Target.HasFormula Then If .DataBodyRange.Columns.Count = Target.Column Then If .DataBodyRange.Rows.Count = Target.Row - 1 Then .ListRows.Add Target.Offset(1, -(.DataBodyRange.Columns.Count - 1)).Select Else Target.Offset(ColumnOffset:=1).Select End If End If End If End If End If End With Set oLst = Nothing End Sub
Je renvoie vers ces tutoriels pour apprendre la manière de gérer les tableaux structurés et comprendre les événements.
- Apprendre à utiliser les tableaux structurés Excel : création, manipulations et avantages(1)
- Les évènements dans la feuille de calcul Excel
Test
Malgré le soin apporté à la programmation de cette procédure et les multiples tests réalisés, il est possible qu'il subsiste une erreur qui m'aurait échappé. N'hésitez pas à m'en faire part.
Vos remarques et réactions sont les bienvenues.
Classeur
Un classeur est disponible en téléchargement avec un petit exemple
Important : Avant d'utiliser le classeur, il y a lieur de faire un Copier/Collage Spécial-Valeur sur la plage C2:C11 de la feuille nommée Stock. Merci à Curt de m'avoir signalé le problème.
Partager