Cellule à liste déroulante conditionnée par cellule suivante
Bonjour à tous,
Je cherche à créer un tableau de service qui doit donner les présences "P", contre-visites "CV" et gardes "G" et doit pouvoir être partagé entre différents praticiens et modifié plusieurs fois par mois.
J'ai donc créé le-dit tableau (ci-joint) avec des listes déroulantes où chacun rentre son emploi du temps et mis des conditions :
Si le praticien est de garde "G", alors il est automatiquement de contre-visite le soir de sa garde ("CV" sur la case précédente) et automatiquement en repos de sécurité ("RS" le lendemain, case suivante). Avant la validation définitive du tableau de service, chaque praticien peut entrer ses disponibilités pour la contre-visite (CV) via le menu déroulant, par les items "OUI" ou "NON".
Donc, les cellules "CV" ont une double entrée : soit via le menu déroulant, soit conditionnée par la valeur de la case suivante.
Le problème survient quand il y a une modification :
Si une case CV est modifiée à partir du menu déroulant, la formule conditionnée par la garde de la case suivante est perdue : la formule type =SI(E22 ="G";"CV";"") est écrasée par la valeur rentrée via le menu déroulant.
J'ai donc 2 questions pour lesquelles, après avoir appelé des amis, supplié les secrétaires et parcourus plusieurs forums je ne trouve pas de solutions :
Est-il possible de créer dans la case CV : Une condition "Forte" : si la valeur de la case suivante est "G", alors cette case est automatiquement "CV", si la valeur est vide, alors un choix via le menu déroulant est possible avec les items "CV", "OUI" et "NON".
Comment faire pour que la formule rentrée (=SI(E22 ="G";"CV";"")) ne soit pas écrasée si on rentre une valeur via un menu déroulant et sous à nouveau conditionnée par la valeur de la case suivante si la case "CV" contient à nouveau une valeur "nulle" via le menu déroulant.
Désolé pour ces explications un peu laborieuses, j'espère que vous saurez y voir clair et m'aider !
Merci d'avance
Bonjour et bienvenues sur le forum
J’ai, je crois, résolu ton problème avec des macros événementielles mais il y a un « hic »
Ma solution ne marche qu’avec Excel 2003 (mon ancienne version). Avec Excel 2013, Excel décroche et se ferme. Va savoir pourquoi !
Avec Excel 2010, ta version d’après l’indication du forum, je ne sais pas mais je crains fort que ce soit comme avec 2013.
En revanche, si cela peut te convenir, vu que tu n’as apparemment pas eu d’autres propositions, j’ai fait une version où il te faudra valider ta feuille en cliquant sur un bouton quand l’opérateur aura modifié le planning.
Hélas, ce serait mieux avec une validation automatique après chaque saisie…
Ci-joint donc les 3 versions à tester :
*V Excel 2003
*V Excel 2013 à tester avec Excel 2010
*V Bouton
Merci de me dire si l’une d’entre elles te convient.
Bye !
Bonjour,
Beau boulot !!!
Je te confirme en 2010 il y a un bug lorsque l'on choisit "vide" et que la macro se lance pour remettre la formule.
Ta version bouton est extra !
Chapeau bas !
Leakim
Bonjour le forum
Bonjour leakim
Merci leakim ! Je n'en demandais pas tant !
Et si tu as ne serait-ce qu'un début d'explication sur le bug , cela m'intéresse .
Merci encore !
Bonjour Gmb,
Merci beaucoup pour tes propositions.
Comme tu le pressentais, les versions 2003 et 2013 ne fonctionnent malheureusement pas avec 2010, je n'ai donc pas pu les tester.
Je te remercie néanmoins pour le temps que tu as passé dessus.
Pour la version "Bouton" par contre, je ne comprends pas bien le système et sur ma version, je ne vois pas de changement : la formule SI est écrasée après une entrée via le menu déroulant. Du coup, je ne comprends pas bien l'effet de la case "Valider". Est-ce que tu peux me donner plus d'infos ?
Merci encore pour ton aide
Bonjour
@ gmb
As tu essayé d'encadrer ta macro par la suppression/remise des événements ?
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Set Sel = Range("D6")
For t = 0 To 22 Step 16
For k = 0 To 38 Step 19
For i = 6 To 16 Step 2
For j = 4 To 16 Step 3
Set Sel = Union(Sel, Cells(i + t, j + k))
Next j
Next i
Next k
Next t
If Not Intersect(Target.Offset(0, -1), Sel) Is Nothing Then
If Target.Value = "G" Then
Target.Offset(0, -1).Value = "CV"
End If
ElseIf Not Intersect(Target, Sel) Is Nothing Then
If Target.Offset(0, 1).Value = "" And Target.Value = "" Then
Target.Value = "=IF(RC[1] =""G"",""CV"","""")"
ElseIf Target.Offset(0, 1).Value = "G" Then
Target.Value = "CV"
End If
End If
Set Sel = Nothing
Application.EnableEvents = True
End Sub
Bonjour
@Banzaï :
Je viens d'essayer et cela a l'air de marcher. Je te remercie infiniment car j'ai eu plusieurs fois ce problème sans pouvoir le résoudre. Grace à toi, c'est maintenant fait. Merci encore.
@Simon
Dans la version « Bouton », bien sûr la formule est écrasée quand tu entres une formule. Mais le rôle du bouton « Valider » est justement de la remettre partout où une saisie l’a enlevée.
Mais, grâce à Banzaï, la nouvelle version que je te joins te fera les modifications au fur et à mesure de tes saisies, comme tu le souhaites.
Wow ! Génial !
Merci à tous les 2, vous êtes des pros, nous allons gagner énormément de temps, nous et les secrétaires grâce à votre expertise !
Hum ! Désolé pour la question de néophyte qui va suivre....
J'ai voulu coller le mois de janvier pour faire Février et les suivants, mais je perds la macro magique que vous avez développée. Je fouille le forum et l'aide en ligne, mais rien ne ressort.
Comment faire une copie en gardant la macro d'une feuille à une autre ?
Merci d'avance !
Que c'est compliqué Excel quand on n'a jamais eu de formation !
Quitte à abuser, je voudrais pouvoir appliquer la même macro sur le tableau sur une autre cellule :
La case activité de jour "J" est liée à l'activité de nuit "N". J'ai donc rentré la formule =SI(E6="G";"RS";"P"). Mais j'ai le même problème que pour la case CV liée à la case G : Si on fait une entrée via le menu déroulant, la formule s'efface.
J'ai bien essayé de décrypter la macro sus mentionnée, mais vraiment, mais alors, vraiment, c'est au délà de toutes mes compétences. Malheureusement, l'hôpital ou je travaille ne nous fournira pas d'aide pour développer notre tableau de service, aussi je me permet de faire à nouveau appel aux passionnés.
Très humblement et avec (à nouveau) tous mes remerciements !
Je dois faire une mauvaise manip :
Quand je vais sur l'onglet "ThisWorkbook", j'ai déjà le même code enregistré.
Mais par contre, je me demande, ne faudrait-il pas que la phrase : Private Sub Worksheet_Change soit remplacée par Private Sub ThisWorkbook Change ? Si c'est le cas, que faut-il mettre entre () ?
Bonjour
Pour compléter ce que t'as indiqué leakim
Tu fais une copie du code qui est dans le module de la feuille
Tu supprimes le code qui est placé dans le module de la feuille
Tu colles la copie du code dans le module ThisWorkbook
Tu changes l'entête de la macro
Option Explicit
Dim i, j, k, t
Dim Sel As Range
'Private Sub Worksheet_Change(ByVal Target As Range)
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
Set Sel = Range("D6")
For t = 0 To 22 Step 16
For k = 0 To 38 Step 19
For i = 6 To 16 Step 2
For j = 4 To 16 Step 3
Set Sel = Union(Sel, Cells(i + t, j + k))
Next j
Next i
Next k
Next t
If Not Intersect(Target.Offset(0, -1), Sel) Is Nothing Then
If Target.Value = "G" Then
Target.Offset(0, -1).Value = "CV"
End If
ElseIf Not Intersect(Target, Sel) Is Nothing Then
If Target.Offset(0, 1).Value = "" And Target.Value = "" Then
Target.Value = "=IF(RC[1] =""G"",""CV"","""")"
ElseIf Target.Offset(0, 1).Value = "G" Then
Target.Value = "CV"
End If
End If
Set Sel = Nothing
Application.EnableEvents = True
End Sub
Parfait, ça marche !
Du coup, je me suis lancé pour le même problème concernant les cases J et G en modifiant le code de macro (un peu à tâtons) et en le collant à la suite, mais visiblement, ce n'est pas comme çà qu'il faut fonctionner : J'ai le message d'erreur Erreur de compilation Nom ambigu détecté : Workbook_SheetChange
Est-ce que ça veut dire qu'on ne peut pas coller 2 macros les unes à la suite des autres ? Ou qu'il y a une syntaxe particulière à respecter ?
Est-ce que j'abuse avec mes questions ?
J'ai rentré ce code directement à la suite :
Option Explicit
Dim i, j, k, t
Dim Sel As Range
'Private Sub Worksheet_Change(ByVal Target As Range)
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
Set Sel = Range("F6")
For t = 0 To 22 Step 16
For k = 0 To 38 Step 19
For i = 6 To 16 Step 2
For j = 4 To 16 Step 3
Set Sel = Union(Sel, Cells(i + t, j + k))
Next j
Next i
Next k
Next t
If Not Intersect(Target.Offset(0, 1), Sel) Is Nothing Then
If Target.Value = "G" Then
Target.Offset(0, 1).Value = "RS"
End If
ElseIf Not Intersect(Target, Sel) Is Nothing Then
If Target.Offset(0, -1).Value = "" And Target.Value = "" Then
Target.Value = "=IF(RC[1] =""P"",""RS"",""CA"",""""RTT"",""CF"","OFF"",""CM"","""")"
ElseIf Target.Offset(0, -1).Value = "G" Then
Target.Value = "RS"
End If
End If
Set Sel = Nothing
Application.EnableEvents = True
End Sub
C'est pas bon ?
Bonjour
Chaque procédure évènementielle doit être unique
Il faut mixer (inclure) le code de la seconde dans la première
Expliques
Target.Value = "=IF(RC[1] =""P"",""RS"",""CA"",""""RTT"",""CF"","OFF"",""CM"","""")"
Joins ton fichier
En fait, je voulais donc créer la même condition pour les cases suivantes :
Si un praticien est de Garde "G", le lendemain il est en Repos de Sécurité "RS", avec donc la fonction SI.
Mais si, pour une raison ou une autre, le planning est modifié, et que l'activité de jour J est modifiée par le menu déroulant (avec les options "P" présent, "CA" congés annuels,...), alors la formule liant la case avec l'activité de garde est perdue.
Je voudrais donc conserver la fonction SI dans la case de jour J si on ne rentre aucune donnée dans la case précédente. C'est exactement la même chose que dans le cas précédent, sauf que c'est avec la cellule précédente et pas la suivante, et que le menu déroulant comporte dans cette case les choix "P" "RS" "CA" "RTT" "CF" "OFF" "CM" et "vide"
Ci-joint le fichier
Je crois que je ne suis pas loin de trouver en tâtonnant...
Voici le code que j'ai rentré :
Option Explicit
Dim i, j, k, t
Dim Sel As Range
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
Set Sel = Range("D6")
For t = 0 To 22 Step 16
For k = 0 To 38 Step 19
For i = 6 To 16 Step 2
For j = 4 To 16 Step 3
Set Sel = Union(Sel, Cells(i + t, j + k))
Next j
Next i
Next k
Next t
If Not Intersect(Target.Offset(0, -1), Sel) Is Nothing Then
If Target.Value = "G" Then
Target.Offset(0, -1).Value = "CV"
End If
ElseIf Not Intersect(Target, Sel) Is Nothing Then
If Target.Offset(0, 1).Value = "" And Target.Value = "" Then
Target.Value = "=IF(RC[1] =""G"",""CV"","""")"
ElseIf Target.Offset(0, 1).Value = "G" Then
Target.Value = "CV"
End If
End If
Set Sel = Nothing
Application.EnableEvents = True
Application.EnableEvents = False
Set Sel = Range("F6")
For t = 0 To 22 Step 16
For k = 0 To 38 Step 19
For i = 6 To 16 Step 2
For j = 4 To 16 Step 3
Set Sel = Union(Sel, Cells(i + t, j + k))
Next j
Next i
Next k
Next t
If Not Intersect(Target.Offset(0, -1), Sel) Is Nothing Then
If Target.Value = "G" Then
Target.Offset(0, 1).Value = "RS"
End If
ElseIf Not Intersect(Target, Sel) Is Nothing Then
If Target.Offset(0, -1).Value = "" And Target.Value = "" Then
Target.Value = "=IF(RC[1] =""G"",""RS"",""P"")"
ElseIf Target.Offset(0, -1).Value = "G" Then
Target.Value = "RS"
End If
End If
Set Sel = Nothing
Application.EnableEvents = True
End Sub
Quelle ligne dois-je modifier pour que la valeur par défaut soit "P" dans la case Jour si la case de la veille n'est pas "G"
De la même façon, quelle ligne modifier pour que la valeur par défaut de la case CV soit "vide" si la case suivante n'est pas "G" ?
Bonjour
Je n'ai suivi ce post que de loin
A tester
Merci Banzaï, c'est quasi-parfait !
Le seul hic, c'est que je perds la formule =SI(E6 = "G";"RS";"P") si je rentre une donnée via le menu déroulant dans la case jour J.
Je voudrais que la formule reste conditionnée si la valeur rentrée via le menu déroulant est "P", c'est ce que je cherchais à faire en ajoutant et modifiant la macro que tu as proposé plus tôt.
J'avais réussi à coder la fonction mais elle ne concernait que la cellule F6 et pas les autres. Évidement, j'ai tout perdu par mégarde, erreur de débutant.
Pour le reste, c'est nickel, merci encore.
Bonjour
Joins ton fichier de février et je verrai comment y adapter la macro
Bye !
Bonjour Gmb,
Je joins le fichier avec février et mars... j'ai du coup pas encore fait les autres !
Le problème du report d'un mois à l'autre est résolu, mais là, je ne sais pas si tu as lu tout le fil de la discussion, j'essaie de régler un problème similaire via une autre macro (mais je débute !)
En clair, je voudrais que les toutes cases de jour J gardent la fonction =SI(E6 = "G";"RS";"P") si leur valeur est "P" ou "vide", même quand elles sont modifiées via le menu déroulant. Le miroir du problème précédent réglé par votre macro magique, puisque la case CV garde une fonction similaire quand la valeur rentrée via le menu déroulant est "vide".
Je ne sais pas si je dois brûler des cierges sur l'autel de Saint Excel ou quoi !
Avec, encore et toujours, mes remerciements par avance...