Cellule à liste déroulante conditionnée par cellule suivante Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Avatar du membre
leakim
Membre impliqué
Membre impliqué
Messages : 1'805
Appréciations reçues : 12
Inscrit le : 11 décembre 2012
Version d'Excel : 2010 - 2016 FR
Téléchargements : Mes applications

Message par leakim » 22 mars 2014, 13:38

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.PNG
Capturethisworkbook.PNG (19.95 Kio) Vu 328 fois
Tu copies ton code et tu le colles

Il me semble que cela le fait.

Moi aussi cela me confirmera

Leakim
On apprend par des essais/erreurs. L'erreur, serait de ne pas en faire... :noel:
Image
S
SimonB73
Jeune membre
Jeune membre
Messages : 13
Inscrit le : 19 mars 2014
Version d'Excel : 2010FR

Message par SimonB73 » 22 mars 2014, 13:58

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 () ?
Avatar du membre
Banzai64
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'712
Appréciations reçues : 4
Inscrit le : 21 novembre 2010
Version d'Excel : 2003 FR (learning 2010 - 2013)

Message par Banzai64 » 22 mars 2014, 14:26

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)
[surligner]Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)[/surligner]

    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
S
SimonB73
Jeune membre
Jeune membre
Messages : 13
Inscrit le : 19 mars 2014
Version d'Excel : 2010FR

Message par SimonB73 » 22 mars 2014, 15:36

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 ?
Avatar du membre
Banzai64
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'712
Appréciations reçues : 4
Inscrit le : 21 novembre 2010
Version d'Excel : 2003 FR (learning 2010 - 2013)

Message par Banzai64 » 22 mars 2014, 15:48

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
S
SimonB73
Jeune membre
Jeune membre
Messages : 13
Inscrit le : 19 mars 2014
Version d'Excel : 2010FR

Message par SimonB73 » 22 mars 2014, 15:56

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" ?
Tableau de service Réa modifié2.xlsm
(115.72 Kio) Téléchargé 11 fois
Avatar du membre
Banzai64
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'712
Appréciations reçues : 4
Inscrit le : 21 novembre 2010
Version d'Excel : 2003 FR (learning 2010 - 2013)

Message par Banzai64 » 22 mars 2014, 16:43

Bonjour

Je n'ai suivi ce post que de loin

A tester
SimonB73 Tableau de service Réa modifié2 V001.xlsm
(117.65 Kio) Téléchargé 21 fois
S
SimonB73
Jeune membre
Jeune membre
Messages : 13
Inscrit le : 19 mars 2014
Version d'Excel : 2010FR

Message par SimonB73 » 22 mars 2014, 17:15

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.
g
gmb
Fanatique d'Excel
Fanatique d'Excel
Messages : 12'669
Appréciations reçues : 346
Inscrit le : 4 avril 2013
Version d'Excel : 2016

Message par gmb » 22 mars 2014, 17:55

Bonjour

Joins ton fichier de février et je verrai comment y adapter la macro
Bye !
S
SimonB73
Jeune membre
Jeune membre
Messages : 13
Inscrit le : 19 mars 2014
Version d'Excel : 2010FR

Message par SimonB73 » 22 mars 2014, 19:42

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...
Tableau de service Réa modifié2.xlsm
(115.16 Kio) Téléchargé 16 fois
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message