Mise à jour des cellules renseignées d'après liste déroulante, si modif de cette list

white-spirit

XLDnaute Occasionnel
Bonsoir le Forum,

j'aimerais avoir vos avis concernant la solution pour le besoin suivant:

j'ai une liste de choix définie par la plage (R10:R15).

sur la plage (I10:I129), je renseigne chaque cellule avec l'une des données présentes dans la liste déroulante issue de (R10:R15).

Tout va bien, sauf qu'il arrive que je doive faire une modif de l'une des données de la liste de choix (ex: mettre au pluriel, ou autre). Evidemment pour que la cellule comprise dans (I10:I129), qui contient la valeur initiale se mette à jour, je dois intervenir et recliquer sur la bonne écriture.... Donc pourrais-je, via un évènement par exemple, rendre cette MaJ automatique ?

Merci de me dire si ceci vous inspire ...

Cordialement

@WS
 

st007

XLDnaute Barbatruc
Re : Mise à jour des cellules renseignées d'après liste déroulante, si modif de cette

Bonsoir,
issu d'un site culte

Si on modifie un item de la liste, les choix déjà faits dans les menus déroulants sont modifiés.

DVLiaison http://boisgontierjacques.free.fr/fichiers/DonneesValidation/dvliaison2

1ere méthode

Au moment du choix dans le menu, on écrit une formule qui pointe vers la cellule de la liste.



Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect([saisieChoix], Target) Is Nothing Then
Application.EnableEvents = False
p = Application.Match(Target, [Liste], 0)
Set mc = Worksheets("feuil2").[Liste].Cells(p, 1)
Target.Formula = "=Feuil2!" & mc.Address
Application.EnableEvents = True
End If
End Sub

2e méthode

Pour chaque item modifié dans la liste, on explore tous les choix déjà faits dans les menus

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect([Liste], Target) Is Nothing Then
Application.EnableEvents = False
valSaisie = Target.Value
Application.Undo
For Each c In Cells.SpecialCells(xlCellTypeAllValidation)
If c.Value = Target Then c.Value = valSaisie
Next
Target = valSaisie
Application.EnableEvents = True
End If
End Sub

Modification d'un item dans les menu déroulants

DVModifItem http://boisgontierjacques.free.fr/fichiers/DonneesValidation/DVModifieItem.xls

Sub ModifieItemListeValidation()
ancien = "kk"
nouveau = "pp"
For Each c In Cells.SpecialCells(xlCellTypeAllValidation)
If Left(c.Validation.Formula1, 1) <> "=" Then
temp = c.Validation.Formula1
temp = Replace(temp, ancien, nouveau)
temp = Replace(temp, ";", ",")
c.Validation.Delete
c.Validation.Add xlValidateList, Formula1:=temp
End If
Next c
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Mise à jour des cellules renseignées d'après liste déroulante, si modif de cette

Bonsoir le fil, bonsoir le forum,

Un peu tard mais tant pis, je propose quand même une solution avec les deux événementielles SelectionChange et Change. Le soucis c'est qu'il faut impérativement que la sélection soit ailleurs que dans la plage R5:R10 au départ, pour que la variable AV soit initialisée... J'ai même mis un fichier exemple puisque WS n'avait pas daigné le faire...
Le code :
Code:
Option Explicit
Private PLV As Range 'déclare la variable PLV (Plage de la Liste de Validation)
Private AV As String 'déclare la variable AV (Ancienne Valeur)


Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'au changement de sélection
Set PLV = Range("R5:R10") 'définit la plage PLV
If Application.Intersect(PLV, Target) Is Nothing Then Exit Sub 'si la cellule sélectionnée n'est pas dans la plage PLV, sort de la procédure
If Target.Cells.Count > 1 Then Exit Sub 'si le nombre de cellules sélectionnées est supérieur à 1, sort de la procédure
AV = CStr(Target.Value) 'définit l'ancienne valeur AV de la cellule sélectionnée
End Sub


Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans une cellule
Dim PLD As Range 'déclare la variable PLD (PLage des Données)
Dim R As Range 'déclare la variable R (Recherche)
Dim PA As String 'déclare la variable PA (Première Addresse)

If Application.Intersect(PLV, Target) Is Nothing Then Exit Sub 'si la cellule modifiée n'est pas dans la plage PLV, sort de la procédure
Set PLD = Range("I10:I29") 'définit la plage PLD
Set R = PLD.Find(AV, , xlValues, xlWhole) 'définit la recherche R (recherche l'ancienne valeur AV dans la plage PLD)
On Error Resume Next 'sinon ça plate à la ligne Loop... et je ne sais pas pourquoi ?
If Not R Is Nothing Then 'condition : si il existe au moins une occurrence trouvée
    PA = R.Address 'définit l'adresse de la première occurrence trouvée
    Do 'éxécute
        R.Value = Target.Value 'récupère la valeur de la cellule modifiée dans l'occurrence trouvée
        Set R = PLD.FindNext(R) 'redéfinit la recherche R (occurrence suivante)
    Loop While Not R Is Nothing And R.Address <> PA 'boucle tant qu'il existe de nouvelle occurrences ailleurs qu'en PA
End If 'fin de la condition
End Sub
Le fichier :
 

Pièces jointes

  • White Spirit_v01.xls
    41.5 KB · Affichages: 27

white-spirit

XLDnaute Occasionnel
Re : Mise à jour des cellules renseignées d'après liste déroulante, si modif de cette

Bonjour st007, bonjour Robert, bonjour le Forum,

merci à vous, st007 & Robert, de vous être intéressés à ce sujet.
Les solutions que vous avez chacun proposées fonctionnent.
J'ai finalement opté pour la solution de Robert, en y apportant la petite amélioration suivante:

- lorsque l'on supprime une donnée dans PLV, les cellules de PLD correspondantes s'effacent bien, mais si je ressaisis qq chose dans une cellule vide de PLV, alors TOUTES les cellules vides de PLD prennent cette nouvelle valeur... logique me direz-vous, c'est dans le code ! Mais qd je renseigne PLV, je ne souhaite pas que toutes les cells vides de PLD suivent ...
j'ai donc modifié le test de la variable R comme ceci:
" if Not R is Nothing and R<>"" Then...." et j'obtiens ce que je voulais, cad que les cells vides de PLD restent vides, et optionnables selon PLV.
Donc, merci de votre aide.

Robert, au sujet du fichier que je n'ai pas joint, vous avez totalement raison, mais vous savez certainement que les documents sur lesquels on travaille ne sont pas tjrs divulgables ... Cependant, oui, j'aurais pu faire un extrait ! Mille pardons !

Bien cordialement,

WS
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 213
Membres
103 158
dernier inscrit
laufin