Mise a jour automatique de valeurs d'une liste deroulante

Bonjour

J'ai une liste de noms dans range (R8:R17)

Dans la colonne C , à partir de C3 jusqu'à C200 j'ai une liste de choix déroulante qui est tirée de la lste d'origine ci-dessus.

Je voudrais que si je change un ou plusieurs noms de la liste d'origine, les choix déjà validés dans la colonne C s'actualisent aussi..

La macro suivante fonctionne presque, excepté quand j'écris une valeur dans la colonne K ou une autre, alors cette même valeur (mot) s'incrit dans toutes les cellules vides de la colonne C alors qu'aucune valeur n'y a été choisie dans la liste déroulante.

Je cherche à corriger la macro afin que seules les valeurs choisies dans la colonne C se mettent à jour en fonction du changement dans la liste d'origine (R8:R17).

Si quelqu'un sait comment faire cela...

Application.EnableEvents = False

Dim zone As Range

Set zone = Range("R8:R17")

Set zonetest = Range("C3:C200")

t = Target

Application.Undo

tOr = ActiveCell.Value

For Each c In zonetest

If c.Value = Target Then

c.Value = t

End If

Next c

ActiveCell = t

Application.EnableEvents = True

Bonjour,

Tu commences à être un habitué du forum, donc ce n'est pas la première fois qu'on doit te le dire, ce serait bien de joindre un fichier à ta requête

Sinon on va difficilement pouvoir te dépanner

Bonjour,

Je pense que le problème vient de la dénomination de la macro. Pouvez-vous nous donner le code en entier depuis Sub... à End Sub? Et avec le fichier ce serait encore mieux

Cindy

Vous avez raison!

Désolé ...

Voici le fichier. Voyez la macro qui se trouve dans le code de l'onglet "general"

voici le code en auestionM

Private Sub Worksheet_Change(ByVal Target As Range)

' If Not Intersect(Target, Range("D1")) Is Nothing Then

' Range("W9:W11").ClearContents

' End If

ActiveSheet.Unprotect "obrat"

'UPDATE CHOICES IF LIST OF ROOMS CHANGED

Application.EnableEvents = False

Dim zone As Range

Set zone = Range("R8:R17")

Set zonetest = Range("C3:C500")

t = Target

Application.Undo

tOr = ActiveCell.Value

For Each c In zonetest

If c.Value = Target Then

c.Value = t

End If

Next c

ActiveCell = t

Application.EnableEvents = True

'AUTOMATICALLY FIT WITDH OF COLUMNS r +c

Application.ScreenUpdating = False

TCol = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)

FTCol = UBound(TCol)

With Sheets("general")

.Columns("R").AutoFit

For Point = 0 To FTCol

If .Columns(TCol(Point)).ColumnWidth < 10.5 Then

.Columns(TCol(Point)).ColumnWidth = 10.5

End If

Next Point

End With

Application.ScreenUpdating = True

Application.ScreenUpdating = False

TCol = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)

FTCol = UBound(TCol)

With Sheets("general")

.Columns("C").AutoFit

For Point = 0 To FTCol

If .Columns(TCol(Point)).ColumnWidth < 10 Then

.Columns(TCol(Point)).ColumnWidth = 10

End If

Next Point

End With

Application.ScreenUpdating = True

ActiveSheet.Range("a1").Select

ActiveSheet.Protect "obrat", True, True

End Sub

'Sub Evenement()

' Application.EnableEvents = True

'End Sub

4rooming-list.xlsm (256.93 Ko)

Je pense qu'il vous faut ajouter un :

If Target.Column = 18 then

au début pour que la macro s'effectue seulement quand vous apportez une modification d'une case de la colonne R.

Cindy

merci Cindy!

J'ai rajouté cette ligne au début et en effet ça a réglé le problème à moitié.

Mais quand je change une valeur de la liste d'origine R8:R17, la même valeur dans la colonne C ne change pas ...

Ah, c'est beaucoup plus simple avec le fichier, merci de l'avoir mis!

Du coup je te propose ce code:

    If Not Intersect(Target, zone) Is Nothing Then
    temp = Target
    Application.Undo
        While Not zonetest.Find(Target, lookat:=xlWhole) Is Nothing
            Cells(zonetest.Find(Target, lookat:=xlWhole).Row, "c") = temp
        Wend
    End If
    Target = temp

Et le fichier en retour:

Maintenant, si tu changes un code, ça le change également dans la liste!

Attention par contre, tu devrais vérifier que le nouveau code n'existe pas déjà dans la liste, histoire que tu n'aies pas de doublons...

maintenant la valeur dans la colonen C disparait quand je choisis un choix dans la liste deroulante

L'autre soucis c'est qu'avec cette fonction Worksheet_Change, le Target désigne la nouvelle case donc avec la nouvelle valeur. Il n'est pas possible de retrouver si facilement l'ancienne valeur.

Vous mettez :

t = Target --> nouvelle valeur de la cellule

If c.Value = Target Then --> c.Value ne peut pas être égal à la nouvelle valeur de la cellule

c.Value = t --> comme t=Target, ça ne change rien

Je n'ai pas trouvé comment récupérer cette ancienne valeur de cellule.

Le plus simple serait dans une partie du fichier de créer 2 cases : "Valeur à modifier" et "Nouvelle valeur" puis d'exécuter la macro en prenant ces 2 valeurs.

Cindy

Bonjour CindyD,

@CindyD : ce n'est pas un soucis de faire ça, il utilise application.undo pour retrouver l'ancienne valeur

@ericw : petite erreur de ma part, j'avais mis

Target = temp

en dehors du if... Du coup le cellule retrouvait son ancienne valeur (une valeur vide donc).

Voici une correction:

genial!!

ca fonctionne!!

MERCI!!!!!

Ah oui je n'avais pas fait attention au "Undo". Bonne idée!

Cindy

Merci

Rechercher des sujets similaires à "mise jour automatique valeurs liste deroulante"