Tout d'abord merci à tous en cette fin d'année pour les nombreuses réponses que j'ai pu trouver ici.
Mais voilà une petite question que je n'ai pas réussi à solutionner :
j'ai un fichier que je vais partager avec mes collègues.
J'ai verrouiller la plupart des cellules, à l'exception bien sûr de celles qui doivent être renseignées.
Jusque là pas de problème.
je cherche maintenant à pouvoir laisser disponible à la sélection (pas à la modification) certaines cellules, et seulement certaines.
Dans le fichier en question, en pièce jointe, j'ai déverrouillé la seconde feuille pour plus de compréhension, la première feuille est verrouillée et je souhaiterai que soit disponible à la sélection par tous les cellules J48 et N55 par exemple.
Les cellules sélectionnable sont sans doute J48 et M55 (N55 est vide).
Un essai dans le fichier joint.
Sur chaque feuille, ne pas verrouiller J48 et M55 puis protéger la feuille
Dans le module de code de ThisWorkbook, saisir le code suivant dans la procédure évènementielle Workbook_SheetChange.
VB:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Sh.Range("J48,M55"), Target) Is Nothing Then Application.Undo
Application.EnableEvents = True
End Sub
Les modifications des cellules J48 ou M55 sont automatiquement annulées mais elles restent sélectionnables. La seconde feuille a été protégée avec le mot de passe vide.
Je pense avoir trouver une solution. Je ne sais pas si elle te conviendra.
En fait tu protèges toute ta feuille sauf les cellules que tu souhaites laisser consultables.
Ensuite, tu sélectionnes toutes les cellules consultables et tu vas dans l'onglet Données/Validation de données. Tu choisis l'option personnalisée. Dans la partie formule, tu tapes: ="azerty" ou un autre mot qui ne sera jamais utiliser par l'utilisateur.
J'espère que ca t'aidera. Bonne fin de journée et bonne année
merci pour cette réponse rapide. c'est exactement ce que je veux.
Par contre, je suis vraiment une buse en VBA, je tente de reproduire ce que vous avez fait sur la première feuille mais n'y arrive pas.
Quelques petites questions pour m'aider à mieux comprendre :
comment a été insérer ThisWorkBook ?
Est-il lié seulement à la deuxième feuille, ou est-il lié à l'ensemble du fichier avec une subtilité de langage que je ne comprends pas qui le rends valable seulement pour la seconde feuille ?
(...) Est-il lié seulement à la deuxième feuille, ou est-il lié à l'ensemble du fichier avec une subtilité de langage que je ne comprends pas qui le rends valable seulement pour la seconde feuille ?
(...)
ThisWorkbook désigne le classeur où se trouve la macro. Un certain nombre d'évènements sont gérés au niveau du classeur.
Par exemple un des plus célèbres est l'évènement ouverture du classeur qui, quand il est détecté, exécute le code de la procédure Workbook_Open() comme son nom l'indique (si on y a mis du code) .
Il existe d'autres évènements comme la détection de changement valeur au sein d'une d'une feuille. Dans ce cas, on exécute la procédure: Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Contrairement à la précédente, on voit que cette procédure passe deux paramètres qu'on peut utiliser dans le code qu'on y programme.
Sh désigne la feuille au sein de laquelle des cellules ont été modifiées
Target contient l'ensemble des cellules qui ont été modifiées au sein de la feuille Sh (souvent une seule cellule)
Cet évènement se produit pour toutes les feuilles du classeur. Ce sont les paramètres Sh et Target qui permettent de savoir de quelle feuille il s'agit et quelles cellules ont été modifiées. Il faut néanmoins pour chaque feuille ne pas protéger les cellules J48 et M55 avant de protéger de la feuille elle-même.
C'est cet évènement qui a été utilisé pour le code. Il est donc valable pour toutes les feuilles du classeur.
Cliquer droit sur le nom d'un onglet (peu importe lequel) et choisir le menu "Visualiser le code". On peut aussi utiliser la combinaison des touches Alt+F11. L'environnement VBE s'ouvre.
Dans le panneau de projet (généralement à gauche) repérer le nom de votre classeur (si ce panneau n'apparait pas, sélectionner le menu "Affichage/Explorateur de projet" pour le faire apparaître)
Développer, si ce n'est pas déjà fait, l'arborescence de votre classeur jusqu'à voir le terme ThisWorkbook.
Double-cliquer sur ThisWorkbook. La fenêtre pour le code (correspondant à ThisWorkbook) va s'ouvrir.
Cette fenêtre possède deux listes déroulantes vers le haut de la fenêtre. Une liste (à gauche) qui contient (Général) et une autre (à droite) qui contient (Déclarations)
Dans la liste qui contient (Général), sélectionner Workbook
Effacer ce qui est dans la fenêtre (par défaut il s'agit du code à exécuter quand le classeur s'ouvre mais nous n'utilisons pas cet évènement)
Coller dans cette fenêtre, le code qui suit:
VB:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Sh.Range("J48,M55"), Target) Is Nothing Then Application.Undo
Application.EnableEvents = True
End Sub
Enregistrer votre fichier sous le format .xlsm
Le fichier joint comporte une feuille supplémentaire "Toto" pour montrer que le code est valable pour toutes les feuilles du classeur.
Nota: Quand on protège la feuille, il faut bien entendu, cocher l'option autoriser la sélection des cellules déverrouillées.