Bonjour à tous,
Contexte
Une colonne dont chaque cellule pointe sur une liste.
Objectif
Récupérer la valeur de la liste lorsque je sélectionne un nouvel item de la liste
Merci à tous pour votre aide?
Bonjour à tous,
Contexte
Une colonne dont chaque cellule pointe sur une liste.
Objectif
Récupérer la valeur de la liste lorsque je sélectionne un nouvel item de la liste
Merci à tous pour votre aide?
Bonjour
Essaye :
- d'être plus précis en ce qui concerne tenants et aboutissants
- de nous montrer le code au moins tenté
Merci de faire ce petit (vraiment petit) effort.
Ta demande n'est pour l'instant qu'un mini "cahier des charges" (de surcroît mal exposé).
Bonjour unparia
Considérons la cellule (A1) qui affiche la liste (Données->Validation données->options -> autoriser -> Liste)
- Ok
- NOk
- En attente
Je sélectionne le 1er item -> Ok
Puis sélectionne le 2ième item -> NOk
Sur l'événement Change je teste la cellule modifiée ici A1 et veut donc à la deuxième sélection récupérer Ok sachant que Target.value renvoie NOK
Merci pour ton aide
Réponse en anglais: http://stackoverflow.com/questions/4...l-in-excel-vba
Merci halaster08 mais c'est une véritable usine à gaz surtout si tu dois appliquer les méthodes proposées pour toutes les cellules de x colonnes.
Autrement dit, quand on utilise une liste dans les cellules, plus vraiment possible de récupérer l'ancienne valeur.
Un manque dans la gestion native des cellules avec une liste associée.
Mets donc en place une stratégie qui utilise les commentaires de tes cellules (stocke en commentaire la dernière valeur modifiée et retrouve-la ensuite).
Ceci dit : tu ne pourras (sans lourdeurs additionnelles) stocker et retrouver ainsi plus d'une valeur par cellule concernée.
Merci pour ton retour unparia
Mais comment fais tu pour récupérer dans value2 par exemple la dernière valeur de la cellule quand elle pointe sur une liste et que Target.value renvoie la valeur sélectionnée et non la valeur avant changement sachant que dans mon cas c'est pour toutes les cellules de plusieurs colonnes?
Je croyais que c'était clair
ce n'est pas au selectionChange, que tu constates la valeur à mettre en commentaire de la cellule, mais au Change de la cellule. Et tu lis et utilises ce commentaire au prochain selectionchange. Ce sera sa valeur précédente, non ?
Quel est donc ton problème avec cela ?![]()
unparia
Je ne comprends pas pourquoi tu me parles de l'événement selectionChange alors que dans le post #1, j'écris
Je sélectionne le 1er item -> Ok
Puis sélectionne le 2ième item -> NOk
Sur l'événement Change je teste la cellule modifiée ici A1 et veut donc à la deuxième sélection récupérer Ok sachant que Target.value renvoie NOK
Merci pour ton aide
Bonjour,
c'est ton souhait même qui génère ce que tu considères être une usine à gaz
car sans mécanique stratégique décomposée en deux ou trois temps, il est impossible de récupérer la précédente valeur de ta liste sur l'évènement Change. Il faut au mieux le coupler à l'évènement SelectionChange et deux ou trois variables je pense (stocker l'adresse, la précédente valeur, une valeur tampon si jamais tu ne modifies finalement pas la valeur de la liste où tu es positionné afin de ne pas écraser la pénultième valeur à tort)
si tu expliquais déjà la finalité de ce stockage, une solution pertinente pourrait être apportée, notamment au sujet de l'utilisation de la zone commentaire
par ailleurs, ça semble implicite mais il faut le confirmer, le stockage est bien isolé à chaque cellule ou c'est un pot commun (qui nécessiterait donc également de stocker la dernière liste de validation utilisée)
Erratum: Target.value donne la valeur saisie et non pas la valeur précédente. Dommage!
Merci joe, mais si je change la valeur de la cellule via la flèche de la liste, seul l'événement change est déclenché et dans ce cas je ne vois pas comment gérer l'ancienne valeur ?
Dois-je recommencer à exposer ce que j'ai déjà exposé ? C'est juste lassantmais si je change la valeur de la cellule via la flèche de la liste, seul l'événement change est déclenché et dans ce cas je ne vois pas comment gérer l'ancienne valeur![]()
Bonjour,
Avec tout cela, en respectant les règles du forum, on aurait au moins pu avoir un début d'ébauche d'essai d'embryon de bout de code, non?informer
Membre averti
Posteur de sources - 1 source postée 9 billets blog publiés sur Developpez 1 trophée reçu
Inscrit en janvier 2010
Messages 421
Points 340
@Unparia : Pourquoi privilégier le commentaire dans une cellule plutôt qu'une variable de type Static dans l'événement Change?
Si besoin de vérifier ces changements sur plusieurs cellules, j'utiliserai alors :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub Worksheet_Change(ByVal Target As Range) Static OldValue As String End Sub
- une Collection public dans un module standard
- Workbook_Open pour la remplir
- Worksheet_Change + On Error + Add + Remove pour gérer
Bonjour Franck
parce qu'il veut pouvoir ainsi traiter plusieurs cellules et que rien ne dit qu'il y re-rentre dans la foulée pour y retrouver l'ancienne valeurUnparia : Pourquoi privilégier le commentaire dans une cellule plutôt qu'une variable de type Static dans l'événement Change?
Et une variable static avec target ne concernera que la cellule en cours et se modifiera sans cesse.
Fais-y un tour : il n'en est pas l'auteur. Il n'y a pas de source, mais une espèce de pub pour un outil, payant de surcroît.Posteur de sources - 1 source postée(et dont le lien de téléchargement ne fonctionne pas).
Bonjour,
L'ancienne valeur s'obtient avec Application.Undo
Boisgontier
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect([A2:A65000], Target) Is Nothing And Target.Count = 1 Then Application.EnableEvents = False ValSaisie = Target Application.Undo ' Annule la saisie Target.Offset(0, 1) = Target ' on met à droite l'ancienne valeur Target = ValSaisie ' on restitue la valeur saisie Application.EnableEvents = True End If End Sub
http://boisgontierjacques.free.fr
Bonjour,
@boisgontierjacques :
Comme dit par unparia, s'il veut revenir plus tard, après moultes modifications, Application.Undo ne lui donnera pas l'ancienne valeur de la cellule, mais la dernière modifiée...
Voici comment je procéderai pour ne pas modifier d'éventuels commentaires :
3 modules sont utiles :
1- Module standard
2- Module ThisWorkbook
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Public Coll_Cells As New Collection Public RangeUtile As Range ' A ADAPTER : Public Const rngUtile As String = "A1:H5,F6:L6" Public Const Feuille As String = "Feuil2"
3- Module de la feuille concernée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Private Sub Workbook_Open() Dim C As Range With Sheets(Feuille) Set RangeUtile = .Range(rngUtile) End With For Each C In RangeUtile.Cells Coll_Cells.Add C.Value, C.Address Next C End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, RangeUtile) Is Nothing Then On Error Resume Next Coll_Cells.Add Target.Value, Target.Address If Err <> 0 Then MsgBox "Ancienne valeur : " & Coll_Cells(Target.Address) 'traitement Coll_Cells.Remove Target.Address Coll_Cells.Add Target.Value, Target.Address End If End If End Sub
Merci à tous pour votre aideet tout particulièrement à pijaku dont le code est
Par contre, comment gère-t-on l'ajout ou la suppression de lignes?![]()
Bonjour à tous,
Les événements type addRow/RemoveRow n'existant pas, il faut gérer la réinitialisation de la collection. J'ai trouvé cette méthode qui fonctionne bien source ici
Mais cela ne fonctionne pas si je fais un copier/coller en fin de la plage renseignée (UseRange) !
Avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Private Sub Worksheet_Change(ByVal Target As Range) Dim lNewRowCount As Long ActiveSheet.UsedRange lNewRowCount = ActiveSheet.UsedRange.Rows.Count If lOldRowCount = lNewRowCount Then ElseIf lOldRowCount > lNewRowCount Then MsgBox ("Row Deleted") lOldRowCount = lNewRowCount ElseIf lOldRowCount < lNewRowCount Then MsgBox ("Row Inserted") lOldRowCount = lNewRowCount End If End Sub
Et dans un module
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub Workbook_Open() ActiveSheet.UsedRange lOldRowCount = ActiveSheet.UsedRange.Rows.Count End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part Public lOldRowCount As Long
Merci pour toute aide
Pour traiter l'ajout par copier/coller en fin de zone UseRange, j'ai passé le code
Dans un module
Sous Workbook
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 Public Coll_Cells As New Collection Public lOldRowCount As Long Public RangeUtile As Range ' A ADAPTER : Public Const rngUtile As String = "AD1:AD564" Public Const Feuille As String = "MaPage" Public Function SetUseRange() Dim ItemColl As MaClasse Dim C As Range Set Coll_Cells = Nothing Set Coll_Cells = New Collection Set RangeUtile = Sheets(Feuille).Range(rngUtile) For Each C In RangeUtile Coll_Cells.Add C.Value, C.Address Next C ActiveSheet.UsedRange lOldRowCount = ActiveSheet.UsedRange.Rows.Count End Function
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Private Sub Workbook_Open() SetUseRange End Sub
Dans la page
Si vous avez mieux, je suis preneur !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False 'Trapp insert/delete row Dim lNewRowCount As Long ActiveSheet.UsedRange lNewRowCount = ActiveSheet.UsedRange.Rows.Count If lOldRowCount = lNewRowCount Then ElseIf lOldRowCount > lNewRowCount Then MsgBox ("Row Deleted") lOldRowCount = lNewRowCount ElseIf lOldRowCount < lNewRowCount Then MsgBox ("Row Inserted") lOldRowCount = lNewRowCount End If End sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) SetUseRange End Sub
Partager