IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupérer l'ancienne valeur d'une cellule liée une liste [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut Récupérer l'ancienne valeur d'une cellule liée une liste
    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?

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    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é).

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Bonjour unparia

    Considérons la cellule (A1) qui affiche la liste (Données->Validation données->options -> autoriser -> Liste)
    1. Ok
    2. NOk
    3. 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

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    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.

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    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.

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    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?

  8. #8
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    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 ?

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    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

  10. #10
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par informer Voir le message
    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.

    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)

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    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 ?

  12. #12
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    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 lassant

  13. #13
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    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
    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?

    @Unparia : Pourquoi privilégier le commentaire dans une cellule plutôt qu'une variable de type Static dans l'événement Change?
    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
    Si besoin de vérifier ces changements sur plusieurs cellules, j'utiliserai alors :
    1. une Collection public dans un module standard
    2. Workbook_Open pour la remplir
    3. Worksheet_Change + On Error + Add + Remove pour gérer

  14. #14
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour Franck
    Unparia : Pourquoi privilégier le commentaire dans une cellule plutôt qu'une variable de type Static dans l'événement Change?
    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 valeur
    Et une variable static avec target ne concernera que la cellule en cours et se modifiera sans cesse.

    Posteur de sources - 1 source postée
    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. (et dont le lien de téléchargement ne fonctionne pas).

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    L'ancienne valeur s'obtient avec Application.Undo

    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
    Boisgontier
    http://boisgontierjacques.free.fr
    Fichiers attachés Fichiers attachés

  16. #16
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    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
    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"
    2- Module ThisWorkbook
    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
    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
    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

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut Gestion à la suppression ou l'ajout de lignes?
    Merci à tous pour votre aide et tout particulièrement à pijaku dont le code est

    Par contre, comment gère-t-on l'ajout ou la suppression de lignes?

  18. #18
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut Comment gérer l'ajourt /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) !

    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
    Avec
    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
    Et dans un module

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public lOldRowCount As Long


    Merci pour toute aide

  19. #19
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Pour traiter l'ajout par copier/coller en fin de zone UseRange, j'ai passé le code


    Dans un module

    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
    Sous Workbook

    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

    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
    Si vous avez mieux, je suis preneur !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Obtenir le nom d'une cellule fusionnée à partir d'une cellule intérieure
    Par tmlpqsdpmdlc dans le forum Excel
    Réponses: 7
    Dernier message: 12/02/2016, 08h03
  2. Réponses: 3
    Dernier message: 10/10/2013, 11h11
  3. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  4. Réponses: 2
    Dernier message: 05/03/2010, 14h15
  5. Réponses: 3
    Dernier message: 03/11/2008, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo