Bloquer saisie cellule avec condition

Bonjour à tous,

je travaille actuellement sur un planning pour le suivi de plusieurs chantiers.

J'ai besoin de votre aide sur une formule, je m'explique.

A gauche du tableau, je liste les chantiers avec leur code, leur nom etc ainsi que les sous-traitants intervenants sur un chantier (exemple ST1, ST2...).

Le gestionnaire positionnera les équipes (ST1, ST2...) sur le planning en inscrivant leur code. Exemple sur le 1er chantier, les équipes sont positionnées sur la semaine n°2 et 3.

Maintenant, si une personne veut positionner une équipe déjà occupée par un autre chantier, j'aimerai qu'il soit bloqué.

Exemple sur le 2eme chantier (ligne 15), il ne doit pas pouvoir positionner l'équipe ST1 sur la semaine n°2 car elle est déjà réservée.

Selon vous, comment puis-je bloquer la cellule en saisie dans ce cas là ?

Merci par avance pour votre aide. Je vous joins le fichier Excel.

Salut gvoisin,

- je vois que ST1 est prévu le 11, 14 et 15 : comment comprendre que ce ST est réservé TOUTE la semaine ?
- où as-tu une liste de ces ST ?
* soit on vérifie à l'encodage qu'un ST est déjà présent ce jour ;
* soit, on crée une liste de validation en fonction des ST déjà employés ce jour

Dans le cas d'un doublon, on ouvre une MsgBox, par exemple...


A+

Salut curulis57,

Tout d'abord merci de ton retour !

En effet, j'avais joint la mauvaise sauvegarde du fichier qui était prévu pour illustrer mon cas. Je joins le bon cette fois-ci.

Dans cette version, on voit bien que ST1 est réservé toute la semaine n°2. C'est le gestionnaire qui réservera les équipes en inscrivant leur code sur les jours souhaités.

Pour être précise, on doit avoir actuellement une 20ene de ST (Sous-traitant) avec à chaque fois plusieurs équipes. Si on créait une liste, il faudra qu'elle soit facilement modifiable par le gestionnaire sans devoir modifier des formules ou codages. Le but c'est qu'il soit autonome.

Ce que je me demandais => est ce possible de bloquer la cellule en saisie avec cette simple condition : si la valeur saisie existe déjà dans cette même colonne alors msgBox d'erreur ?

J'espère être clair... c'est ma première fois sur un forum ..

Salut gvoisin,

à tester...

- tu peux changer cellule par cellule ;
- tu peux sélectionner une cellule complétée et étendre la sélection sur plusieurs jours, histoire de ne pas recopier 10 X la même chose
Dans ce dernier cas, il y a contrôle du jour : si samedi ou dimanche = pas de recopie.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
If Selection.Count > 1 And Selection.Cells(1, 1) <> "" Then
    iRow = Selection.Row
    iCol = Selection.Column
    For x = iCol To iCol + Selection.Columns.Count - 1
        If Weekday(Range(fctCol(x) & 6), vbMonday) < 6 Then _
            Range(fctCol(x) & iRow) = Selection.Cells(1, 1): _
            If WorksheetFunction.CountIf(Range(fctCol(x) & 6).Resize(Range(fctCol(x) & Rows.Count).End(xlUp).Row), Range(fctCol(x) & iRow).Value) > 1 Then _
                Range(fctCol(x) & iRow) = "": _
                MsgBox "Cette équipe est déjà employée sur un autre chantier !", vbInformation + vbOKOnly, "FP IDF - Info"
    Next
End If
'
End Sub


A+

C'est magique !

Un grand merci Curulis57 !

Je te souhaite une bonne journée et à bientôt !

Bonjour Curulis57,

Puis-je te demander de me refaire ton codage mais sans cette condition "- tu peux sélectionner une cellule complétée et étendre la sélection sur plusieurs jours, histoire de ne pas recopier 10 X la même chose
Dans ce dernier cas, il y a contrôle du jour : si samedi ou dimanche = pas de recopie."

Lorsque je veux copier des cellules pour mes ST par exemple, cela fait interférence avec ton codage et bug.

Connaissant les utilisateurs, ils vont paniquer voyant le message de bug s'afficher....

Salut gvoisin,

de magique à emm... : quelle dégringolade !
- ALT F11 pour entrer dans l'éditeur VBA ;
- double-clic dans la petite fenêtre à gauche en haut sur l'intitulé de la feuille 'Planning' ;
- dans la grande fenêtre à droite où apparaît le code, repérer et sélectionner le code publié dans mon dernier post ;
- effacer cette sélection : ce n'est que du texte !
- enregistrer.

Que veux-tu dire par ?

Lorsque je veux copier des cellules pour mes ST

Dis-moi ce qu'ils font pour être si paniqués et je pourrai peut-être trouver une solution...


A+

Top, j'ai réussi youhou !

Je voulais dire que lorsque je voulais copier coller des codes ST dans la colonne E, j'avais un message d'erreur. Exemple copier la cellule E8 en E9.

Mais maintenant tout est ok, je peux faire des modifications à ma guise avant la colonne H et j'ai ton codage qui bloque les doubles saisies dans le planning.

Les utilisateurs auront un niveau débutant -10, un rien les font paniquer.

Encore merci !

Re-curulis57,

un utilisateur m'a fait part d'une demande :

Est-ce possible de rajouter une msgbox d'erreur lorsque le code saisi dans le planning n'est pas celui qui devrait être utilisé ?

Exemple en PJ : je saisis en L15 le code ST3A alors que le code à utiliser est le ST2A (référencé en F15)

Dans ce cas, j'aurai un message d'erreur : "Le code ST saisi est erroné".

Salut gvoisin,

pas vu de PJ...
Sur quelle base puis-je vérifier la validité d'une entrée ? ST1, ST2A : vient d'où ce "A" ? ... Sur ton fichier, je vois [F15] devrait contenir une date...

Explications, please !
Une solution serait de proposer tes STxx via une liste de validation dynamique en fonction de tes critères... à bien m'expliquer...


A+

Il me dit que mon fichier est trop lourd pour le mettre en PJ

Je regarde comment le réduire et je te le transmets

Salut gvoisin,

histoire de retrouver la magie, avec cette modif', tu peux réintégrer la macro de recopie sur plusieurs colonnes...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
If Selection.Count > 1 And Selection.Cells(1, 1) <> "" And Selection.Cells(1, 1).Row > 6 And Selection.Cells(1, 1).Column > 8 Then
    iRow = Selection.Row
    iCol = Selection.Column
    For x = iCol To iCol + Selection.Columns.Count - 1
        If Weekday(Range(fctCol(x) & 6), vbMonday) < 6 Then _
            Range(fctCol(x) & iRow) = Selection.Cells(1, 1): _
            If WorksheetFunction.CountIf(Range(fctCol(x) & 6).Resize(Range(fctCol(x) & Rows.Count).End(xlUp).Row), Range(fctCol(x) & iRow).Value) > 1 Then _
                Range(fctCol(x) & iRow) = "": _
                MsgBox "Cette équipe est déjà employée sur un autre chantier !", vbInformation + vbOKOnly, "FP IDF - Info"
    Next
End If
'
End Sub

... puisque la recopie n'est autorisée QUE si la première cellule - Cells(1,1) - de la sélection est située dans l'agenda proprement dit.

 And Selection.Cells(1, 1).Row > 6 And Selection.Cells(1, 1).Column > 8 

Comme tu connais l'éditeur VBA sur le bout des doigts, maintenant , tu pourras la recoller... non ?


A+

Bonjour Curulis57,

Je viens enfin de trouver comment réduire mon fichier pour pouvoir le télécharger !

J'ai essayé de copier ton codage et l'insérer mais je n'avais plus de blocage au moment de la double saisie d'un code sur la même colonne.

Cette dernière version illustrera mieux ma demande.

Comme j'expliquais précédemment, le but est de rajouter un blocage lorsque l'utilisateur saisit par exemple en L15 le code ST3A alors que le code à utiliser cf cellule F15 est le ST2A.

Décidément je galère cette semaine.

Voilà la bonne version en PJ.

Salut gvoisin,

ton fichier avec quelques améliorations :
- ton nouveau blocage comme demandé ;
- j'ai remis la multi-copie avec ciblage dans l'agenda ;
- le code ST s'inscrit automatiquement en sélectionnant la cellule OU s'efface si déjà affiché (en cas d'erreur) ;
- la multi-copie s'applique aussi pour une correction et donc, peut effacer la sélection ;
- à l'ouverture du fichier, l'agenda se cale sur le lundi de la semaine en cours
- un clic-droit sur [F6] colore cette cellule de rouge ou noir.
* ROUGE = la macro ne t'avertit pas qu'il y a doublon entre ST. Je suppose qu'à un moment, en connaissant le fonctionnement des macros, tu comprendras ce qu'il se passe sans avoir non-stop ces avertissements !
* NOIR = MsgBox d'avertissement à chaque doublon ST

Le fichier ne voulant pas se charger, voici les codes.

EDIT "Petit" détail : tout fichier contenant des macros doit être enregistré au format XLSM !!

À coller dans 'ThisWorkbook'

Private Sub Workbook_Open()
'
Worksheets("Planning").Activate
If Year(CDate(Range("I6").Value)) = Year(Date) Then _
    ActiveWindow.ScrollColumn = 8 + (DateDiff("d", DateSerial(Year(Date) - 1, 12, 31), Date) - (Weekday(Date, vbMonday) - 1))
'
End Sub

Á coller dans 'Planning' en lieu et place des précédents

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
'
If Not Intersect(Target, Range("F6")) Is Nothing Then _
    Cancel = True: _
    Target.Font.Color = IIf(Target.Font.Color = RGB(255, 0, 0), RGB(0, 0, 0), RGB(255, 0, 0))
'
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
'
If Target.Column > 8 And Target.Row > 6 And Target <> "" Then _
    If WorksheetFunction.CountIf(Range(fctCol(Target.Column) & 6).Resize(Range(fctCol(Target.Column) & Rows.Count).End(xlUp).Row), Target) > 1 Then _
        Target = "": _
        If Range("F6").Font.Color = RGB(0, 0, 0) Then _
            MsgBox "Cette équipe est déjà employée sur un autre chantier !", vbInformation + vbOKOnly, "FP IDF - Info"
'
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Dim iRow%, iCol%
'
iRow = Selection.Row
iCol = Selection.Column
If Selection.Cells(1, 1).Row > 6 And Selection.Cells(1, 1).Column > 8 Then
    If Selection.Count = 1 Then
        If Range("E" & iRow).Value <> "" Then Target = IIf(Target = "", Range("F" & iRow).Value, "")
    Else
        For x = iCol To iCol + Selection.Columns.Count - 1
            If Weekday(Range(fctCol(x) & 6), vbMonday) < 6 Then Range(fctCol(x) & iRow) = Selection.Cells(1, 1)
        Next
    End If
End If
'
End Sub

Public Function fctCol(ByVal iCol%) As String
'
fctCol = Split(Columns(iCol).Address(ColumnAbsolute:=False), ":")(1)
'
End Function


A+

Le fichier...

Merci curulis57 ! C'est parfait !

Rechercher des sujets similaires à "bloquer saisie condition"