J'ai besoin de votre aide pour améliorer un code que j'utilise actuellement.
Pour citer ma source, il s'agit d'un code que j'ai trouvé dans un tutoriel sur le site votre assistante.net
Ce code permet de réinitialiser plusieurs listes déroulantes si on modifie la valeur d'une liste :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Reference As Range
Set Reference = Intersect(Target, Range("C:C"))
If Reference Is Nothing Then Exit Sub
For Each Reference In Reference
Range("D" & Reference.Row).Value = ""
Range("E" & Reference.Row).Value = ""
Range("F" & Reference.Row).Value = ""
Next
End Sub
Pour traduire le code ci-dessus avec mes mots de novice :
Si on change la valeur d'une liste déroulante d'une cellule situé en colonne C, les cellules de la même ligne situées en colonne D, E et F se vident.
Ce code est appliqué à l'onglet Mouvement du fichier joint en exemple.
Je souhaiterai intégrer à ce code une ou plusieurs conditions supplémentaires.
- Si on change la valeur d'une liste déroulante d'une cellule situé en colonne D, les cellules de la même ligne situées en colonne E et F se vident.
- Si on change la valeur d'une liste déroulante d'une cellule situé en colonne E, la cellule de la même ligne située en colonne F se vide.
J'ai essayé de compléter ce code en tâtonnant, soit en rajoutant une condition "If", soit en rajoutant une nouvelle boucle "For", mais malheureusement mes compétences en VBA sont limitées.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Reference As Range
Set Reference = Intersect(Target, Range("C:C,D:D,E:E"))
If Reference Is Nothing Then Exit Sub
Application.EnableEvents = False
For Each Reference In Reference
If Not Intersect(Reference, Range("C:C")) Is Nothing Then
Range("D" & Reference.Row).Value = ""
Range("E" & Reference.Row).Value = ""
Range("F" & Reference.Row).Value = ""
ElseIf Not Intersect(Reference, Range("D:D")) Is Nothing Then
Range("E" & Reference.Row).Value = ""
Range("F" & Reference.Row).Value = ""
ElseIf Not Intersect(Reference, Range("E:E")) Is Nothing Then...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Reference As Range
Set Reference = Intersect(Target, Range("C:C,D:D,E:E"))
If Reference Is Nothing Then Exit Sub
Application.EnableEvents = False
For Each Reference In Reference
If Not Intersect(Reference, Range("C:C")) Is Nothing Then
Range("D" & Reference.Row).Value = ""
Range("E" & Reference.Row).Value = ""
Range("F" & Reference.Row).Value = ""
ElseIf Not Intersect(Reference, Range("D:D")) Is Nothing Then
Range("E" & Reference.Row).Value = ""
Range("F" & Reference.Row).Value = ""
ElseIf Not Intersect(Reference, Range("E:E")) Is Nothing Then
Range("F" & Reference.Row).Value = ""
End If
Next
Application.EnableEvents = True
End Sub
Je vous sollicite à nouveau car j'ai un petit soucis lorsque je souhaite supprimer une ligne du tableau.
En effet quand je supprime une ligne, le code VBA intervient sur la ligne inférieure et les valeurs des cellules se vident.
Je ne sais pas si c'est normal et si il existe une solution.
J'ai joint le nouveau fichier si mes explications ne sont pas très claires.
Par exemple, je suis en cellule A8, clique droit, Supprimer ligne du tableau.
Quand je fais cette manipulation les cellules en colonnes D,E et F de la ligne 9 se vident.
Effectivement, quand une ligne est effacée, l'action est interceptée par l'évènement _Change et comme ça impacte les cellules de la colonne C, le code s'exécute sur la ligne qui s'est décalée vers le haut. Je ne vois pas trop comment contourner ce problème. De plus, en supprimant une ligne, ça décale tes formules et elles retournent une erreur, ça te fait un deuxième problème.