Macro affichage valeur sous conditions

Bobo la fouine

XLDnaute Nouveau
Bonjour tout le monde !!

Je tiens tout d'abord à dire que je suis plus que débutant sous VBA (pour ne pas dire nul ^^).

J'expose mon souci :

Cellule Q5 : Oui ou Non (le choix est donné par une liste déroulante que j'ai déjà faite)
Cellule R5 : Si Q5 est Oui, je souhaite avoir le choix entre Oui ou Non à l'aide d'une liste déroulante (comme pour Q5). Si Q5 est Non, je souhaite qu'un "X" s'affiche automatiquement en R5.
Cellule S5 : Si R5 est Oui, je souhaite avoir le choix entre Oui ou Non à l'aide d'une liste déroulante. Si R5 est Non, je souhaite qu'un "X" s'affiche automatiquement en S5.
Cellule T5 : Si S5 est Oui, je souhaite avoir le choix entre Oui ou Non à l'aide d'une liste déroulante. Si S5 est Non, je souhaite qu'un "X" s'affiche automatiquement en T5.

X1:X3 : Cellules contenant Oui et Non et X pour ma liste déroulante



J'ai réussi à faire ceci comme macro pour l'instant (qui fonctionne pour mes colonnes Q et R) mais je n'arrive pas à le faire pour mes colonnes S et T.

Sub oui_non()
Dim i As Integer
i = 5
While i < 275
If (Cells(i, 17) = "Non") Then
Cells(i, 18) = "X"
Else
If (Cells(i, 17) = "Oui" And Cells(i, 18) = "X") Then
Cells(i, 18).Value = " "
End If
End If
i = i + 1
Wend
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call oui_non
End Sub


Pourriez-vous m'aider svp ??

Merci d'avance
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro affichage valeur sous conditions

Bonjour Bobo, bonjour le forum,

Tes explications sont claire mais avec un petit fichier exemple qui va bien ça serait encore beaucoup plus facile (et donc rapide) de t'aider...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro affichage valeur sous conditions

Bonjour Bobo, bonjour le forum,

Peut-être comme ça :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Or Target.Row < 4 Then Exit Sub 'si plusieurs cellules sélectionné ou si le changement à lieu dans une ligne inférieure à 4, sort e la procédure
Select Case Target.Column 'agit en fonction de la colonne de la cellule éditée
    Case 17 'cas 17 (colonne Q)
        Target.Offset(0, 1).Validation.Delete 'supprime la liste de validation de données en colonne R
        Target.Offset(0, 2).Validation.Delete 'supprime la liste de validation de données en colonne S
        Target.Offset(0, 3).Validation.Delete 'supprime la liste de validation de données en colonne T
        Target.Offset(0, 1).Resize(, 3).ClearContents 'efface le contenu des cellules des colonnes R à T
        Select Case Target.Value 'agit en fonction de la valeur de la cellule éditée
            Case "Oui" 'cas "Oui"
                With Target.Offset(0, 1).Validation 'prend en compte la validation de donnée de la cellule en colonne R
                    .Delete 'supprime une éventuelle validation existante
                    'ajoute les valeurs de la plage X1:X2 comme liste de validation de données
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$X$1:$X$2"
                End With 'fin de la prise en compte de la validation de donnée de la cellule en colonne R
            Case "Non" 'cas "Non"
                Target.Offset(0, 1).Value = "X" 'place "X" dans la cellule en colonne R
        End Select 'fin de l'action en fonction de la valeur de la cellule modifiée
    Case 18 'cas 18 (colonne R)
        Target.Offset(0, 1).Validation.Delete 'supprime la liste de validation de données en colonne S
        Target.Offset(0, 2).Validation.Delete 'supprime la liste de validation de données en colonne T
        Target.Offset(0, 1).Resize(, 2).ClearContents 'efface le contenu des cellules des colonnes S à T
        Select Case Target.Value 'agit en fonction de la valeur de la cellule éditée
            Case "Oui" 'cas "Oui"
                With Target.Offset(0, 1).Validation 'prend en compte la validation de donnée de la cellule en colonne S
                    .Delete 'supprime une éventuelle validation existante
                    'ajoute les valeurs de la plage X1:X2 comme liste de validation de données
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$X$1:$X$2"
                End With 'fin de la prise en compte de la validation de donnée de la cellule en colonne S
            Case "Non" 'cas "Non"
                Target.Offset(0, 1).Value = "X" 'place "X" dans la cellule en colonne S
        End Select 'fin de l'action en fonction de la valeur de la cellule modifiée
    Case 19 'cas 19 (colonne S)
        Target.Offset(0, 1).Validation.Delete 'supprime la liste de validation de données en colonne T
        Target.Offset(0, 1).ClearContents 'efface le contenu des cellules de la colonne T
        Select Case Target.Value 'agit en fonction de la valeur de la cellule éditée
            Case "Oui" 'cas "Oui"
                With Target.Offset(0, 1).Validation 'prend en compte la validation de donnée de la cellule en colonne T
                    .Delete 'supprime une éventuelle validation existante
                    'ajoute les valeurs de la plage X1:X2 comme liste de validation de données
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$X$1:$X$2"
                End With 'fin de la prise en compte de la validation de donnée de la cellule en colonne T
            Case "Non" 'cas "Non"
                Target.Offset(0, 1).Value = "X" 'place "X" dans la cellule en colonne T
        End Select 'fin de l'action en fonction de la valeur de la cellule modifiée
End Select 'fin de l'action en fonction de la colonne de la cellule modifiée
End Sub
 

Bobo la fouine

XLDnaute Nouveau
Re : Macro affichage valeur sous conditions

Merci Robert pour ta macro !!

Je l'ai copié dans mon fichier et celle-ci fonctionne parfaitement.

Il y a encore un petit problème mais c'est de ma faute car j'ai oublié de le préciser dans ma demande, et j'en suis désolé.

Lorsqu'un "X" s'affiche dans une case, les cases suivantes auront également le "X" qui s'affiche automatiquement.

On pourrait avoir par exemple (dans l'ordre des colonnes Q R S T) :
- Oui Non X X
- Non X X X

Désolé pour mon oubli...

Si tu pouvais régler ce détail, je t'en serai très reconnaissant

Merci d'avance
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro affichage valeur sous conditions

Bonjour Bobo, bonjour le forum,

Le code modifié :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Or Target.Row < 4 Then Exit Sub 'si plusieurs cellules sélectionné ou si le changement à lieu dans une ligne inférieure à 4, sort e la procédure
Select Case Target.Column 'agit en fonction de la colonne de la cellule éditée
    Case 17 'cas 17 (colonne Q)
        Target.Offset(0, 1).Validation.Delete 'supprime la liste de validation de données en colonne R
        Target.Offset(0, 2).Validation.Delete 'supprime la liste de validation de données en colonne S
        Target.Offset(0, 3).Validation.Delete 'supprime la liste de validation de données en colonne T
        Target.Offset(0, 1).Resize(, 3).ClearContents 'efface le contenu des cellules des colonnes R à T
        Select Case Target.Value 'agit en fonction de la valeur de la cellule éditée
            Case "Oui" 'cas "Oui"
                With Target.Offset(0, 1).Validation 'prend en compte la validation de donnée de la cellule en colonne R
                    .Delete 'supprime une éventuelle validation existante
                    'ajoute les valeurs de la plage X1:X2 comme liste de validation de données
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$X$1:$X$2"
                End With 'fin de la prise en compte de la validation de donnée de la cellule en colonne R
            Case "Non" 'cas "Non"
                Target.Offset(0, 1).Resize(, 3).Value = "X" 'place "X" dans les cellules des colonnes R à T
        End Select 'fin de l'action en fonction de la valeur de la cellule modifiée
    Case 18 'cas 18 (colonne R)
        Target.Offset(0, 1).Validation.Delete 'supprime la liste de validation de données en colonne S
        Target.Offset(0, 2).Validation.Delete 'supprime la liste de validation de données en colonne T
        Target.Offset(0, 1).Resize(, 2).ClearContents 'efface le contenu des cellules des colonnes S à T
        Select Case Target.Value 'agit en fonction de la valeur de la cellule éditée
            Case "Oui" 'cas "Oui"
                With Target.Offset(0, 1).Validation 'prend en compte la validation de donnée de la cellule en colonne S
                    .Delete 'supprime une éventuelle validation existante
                    'ajoute les valeurs de la plage X1:X2 comme liste de validation de données
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$X$1:$X$2"
                End With 'fin de la prise en compte de la validation de donnée de la cellule en colonne S
            Case "Non" 'cas "Non"
                Target.Offset(0, 1).Resize(, 2).Value = "X" 'place "X" dans les cellules des colonnes S à T
        End Select 'fin de l'action en fonction de la valeur de la cellule modifiée
    Case 19 'cas 19 (colonne S)
        Target.Offset(0, 1).Validation.Delete 'supprime la liste de validation de données en colonne T
        Target.Offset(0, 1).ClearContents 'efface le contenu des cellules de la colonne T
        Select Case Target.Value 'agit en fonction de la valeur de la cellule éditée
            Case "Oui" 'cas "Oui"
                With Target.Offset(0, 1).Validation 'prend en compte la validation de donnée de la cellule en colonne T
                    .Delete 'supprime une éventuelle validation existante
                    'ajoute les valeurs de la plage X1:X2 comme liste de validation de données
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=$X$1:$X$2"
                End With 'fin de la prise en compte de la validation de donnée de la cellule en colonne T
            Case "Non" 'cas "Non"
                Target.Offset(0, 1).Value = "X" 'place "X" dans la cellule en colonne T
        End Select 'fin de l'action en fonction de la valeur de la cellule modifiée
End Select 'fin de l'action en fonction de la colonne de la cellule modifiée
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 489
Messages
2 088 855
Membres
103 977
dernier inscrit
Hermet