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 !

Bonjour,

Il me semble que pour faire en sorte que ta macro s'applique à l'ensemble de ton classeur il faut que tu places ton code dans "thisworkbook"

capturethisworkbook

Tu copies ton code et tu le colles

Il me semble que cela le fait.

Moi aussi cela me confirmera

Leakim

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...

Rechercher des sujets similaires à "liste deroulante conditionnee suivante"