Code verrouillage cellules sous excel

Résolu/Fermé
BOGI35 - 5 oct. 2010 à 21:22
BOGI35 Messages postés 1 Date d'inscription lundi 11 octobre 2010 Statut Membre Dernière intervention 11 octobre 2010 - 11 oct. 2010 à 20:13
Bonsoir,
J'ai créé un tableau excel permettant de saisir différent emplois du temps.
Celui ci contient des cellules verrouillées et des cellules non verrouillées ces dernières étant accessibles pour saisir les codes journées.
Je cherche maintenant un code qui verrouillerait automatiquement ces cellules afin d'interdire toute saisie après une date donnée.
Exemple: Pour le mois de septembre interdire toute saisie à partir d'une date indiquée dans une cellule (par ex: 05/10/2010).
Précision: Des macros permettent de sélectionner le mois désiré (masque les colonnes des autres mois) ce qui interdit l'utilisation d'un code comme celui qui suit qui semblait être une solution...mais pas malheureusement pas satisfaisante.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim colom As Integer
colom = Selection.Column
If 2 < colom And colom < 62 And Cells(2, 40) < Date Then
Range("BJ7").Select
MsgBox "Données déjà saisies"
ElseIf 2 < colom And colom < 34 And Cells(2, 9) < Date Then
Range("AH7").Select
MsgBox "Données déjà saisies"
End If
End Sub

Quelqu'un aurait il une solution ?

Avec mes remerciements anticipés.

Bonne soirée


BOGI35




















A voir également:

5 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
7 oct. 2010 à 22:59
Bonsoir,

Sans avoir un exemple de ton fichier il n'est pas possible de comprendre ce que cette macro doit réaliser !

Par contre elle présente une anomalie : Range("BJ7").Select ou selon le cas Range("AH7").Select provoquent l'évènement Worksheet_SelectionChange et donc le MsgBox suivant ne s'exécute pas !

Il faut désactiver les évènement pendant l'exécution :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim colom As Integer
    Application.EnableEvents = False
    colom = Selection.Column
    If 2 < colom And colom < 62 And Cells(2, 40) < Date Then
        Range("BJ7").Select
        MsgBox "Données déjà saisies"
    ElseIf 2 < colom And colom < 34 And Cells(2, 9) < Date Then
        Range("AH7").Select
        MsgBox "Données déjà saisies"
    End If
    Application.EnableEvents = True
End Sub

Cependant je ne comprend pas le but recherché :
- Dans l'énoncé du problème tu parle de « interdire toute saisie à partir d'une date indiquée dans une cellule » et dans la macro tu fait référence à deux cellules contenant des dates.
- En outre, je ne voit pas « ce qui interdit l'utilisation d'un code comme celui qui suit »

D'autre part ta macro est peu lisible :
- Elle n'est pas indentée ;
- Il est plus lisible d'utiliser soit que des Cells, soit que des Range , dans ce cas :
. - Cells(7, 62) est plus parlant que Range("BJ7") et,
. - Cells(7, 34) est plus parlant que Range("AH7") ;
- Les colonnes comprises entre 2 et 34 sont aussi comprises entre 2 et 62, il serait donc souhaitable d'inverser le IF et le ELSEIF.

Ce n'est pas indispensable, mais cela permet simplement une lecture plus facile par des personnes extérieures au projet.

Cordialement
0
Bonjour Patrice 33740,
Permets moi tout d'avoir de t'adresser mes remerciements pour l'intérêt que tu as bien voulu porter à ma question, effectivement pas trop claire!!! A vrai dire, je ne maîtrise pas excel (et bien entendu encore moins Visual Basic). Je tente de créer des fichiers à partir de ce que je peux lire dans les forums. Mon interprétation et la traduction des codes que je fais ne sont pas forcément appropriées (tu as sans doute pu le remarquer). Je compte mettre à profit mon futur temps libre (j'ai encore cette chance d'avoir bien vieilli) pour me perfectionner.
Ceci étant pour tenter une explication plus clair. Mon tableau est constitué de 2 onglets (1er semestre, 2ème semestre) dans lequel chaque mois est décrit (colonne pour les jours, lignes pour les noms des utilisateurs). Afin de simplifier son utilisation, j'ai créé des macros pour afficher les cellules du mois recherché (quelque chose de très simple, masque les colonnes des autres mois pour n'afficher que celui recherché). Chaque utilisateur renseigne son emploi du temps (prévisionnel ou réalisé) comme il le souhaite, cependant il n'est plus autoriser à y apporter de modification après une date donnée (exemple: Pour le mois de janvier, les cellules relatives à celui ci (C7:AG50) doivent être verrouillées pour interdire toute saisie après la date précisée en J2 (05/02/2011), pour le mois de février la date est en AO2, les cellules (AH7:BI100) devant être verrouillées à partir de cette date...et ainsi de suite pour chaque mois. Le souci que j'avais avec mon code: les macros pour appeler les mois ne fonctionnaient plus (logique puisque des colonnes étaient bloquées).

A défaut de suggestion, j'ai cherché une autre solution, en partant du principe que l'administrateur du fichier pouvait verrouiller lui même les cellules le jour venu. Ainsi, j'ai modifié le fichier (les références de cellules ont également changées par rapport à mon mail initial) et créé un code qui verrouille les cellules définies à partir d'un doubleclic sur la cellule dans laquelle la date est précisée. (Ne te moque pas !!!)


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Not Application.Intersect(Range("J2"), Target) Is Nothing Then
Sheets("1er semestre").Range("C7:AG100").Select
Selection.Locked = True
Selection.FormulaHidden = False
MsgBox "Les données du mois de Janvier sont désormais verrouillées"
ActiveSheet.Protect mdp
ActiveSheet.EnableSelection = xlUnlockedCells
End If
........................................

Bien entendu, seul cet administrateur est autorisé à le faire (protection par MdP).
Ainsi, les macros qui "appellent" les mois ne sont pas affectées et autre avantage, l'administrateur peut éventuellement modifier la date et déverrouiller les cellules en cas de besoin.

Voilà Patrice 33740. Par cette astuce, j'ai résolu mon problême

Je te remercie à nouveau pour ta disponibilité. Je vais continuer mon apprentissage et sans doute le compléter par une formation.


BOGI35
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
10 oct. 2010 à 16:39
Bon courage
Au plaisir de te retrouver sur ce forum
Patrice
0
Merci Patrice,
Sans doute aurai je encore l'occasion de revenir sur ce forum.
Dernière petite question.
Comment fait on pour ajouter le statut "Résolu"

Bonne soirée

BOGI35
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
10 oct. 2010 à 23:24
Bonsoir,

Pour pouvoir passer en Résolu tu dois t'inscrire sur CCM, ça prend 1 minute.
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 076
11 oct. 2010 à 09:39
Salut,

Pour passer ton statut en résolu, soit tu es membre comme le précise Patrice, ou tu le demande sur un post pour qu'on le fasse pour toi. Mais le plus simple est de t'inscrire comme membre, c'est rapide, gratuit et t'ouvre des possibilités comme les messages privés etc ...

Pour cette fois je passe ton statut en résolu
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BOGI35 Messages postés 1 Date d'inscription lundi 11 octobre 2010 Statut Membre Dernière intervention 11 octobre 2010
11 oct. 2010 à 20:13
Bonsoir Patrice 33740 et Mike-31
Remerciements pour vos réponses et intervention.
Suivant vos recommandations je suis désormais membre de CCM.

Bonne soirée,
Cordialement


BOGI35
0