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 :

détection modification contenu cellules [XL-2000]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut détection modification contenu cellules
    Bonjour,

    je rencontre un problème pour détecter un événement.

    Ce que je cherche à faire: si une cellule entre A5 et N50 est modifiée, on actualise la date en L2. Quand je dis modifiée je veux bien dire que le texte d'une des cellules est modifié et non qu'une des cellules a été sélectionnée.

    Voici le code que j'ai écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Sub CM_Worksheet_Change(ByVal Target As Excel.Range)
    If InStr(1, "user manual,Model,Param,Actions", Target.Parent.Name) = 0 Then
            If Target.Column = ActiveSheet.Range("A:N").Column Then
                If Target.Row = ActiveSheet.Range("A5:N50").Row Then
                    ActiveSheet.Range("L2").Value = Date
               End If
            End If
    End If
    End Sub
    Mon problème: si le fichier s'ouvre sur la feuille, la date est actualisée, si n'importe quelle cellule de la feuille est sélectionnée, la date est également modifiée. Ce qui ne correspond donc pas à ce que je voudrais.

    Quelqu'un aurait-il une solution svp?

  2. #2
    Membre expérimenté Avatar de CODYCO
    Homme Profil pro
    Webplanneur
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut
    Essais avec ca (à adapter si besoin)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Plage As Range
     
    Set Plage = Range("A5:N50")
     
    If Application.Intersect(Target, Plage) Is Nothing Then
            MsgBox "Hors cible on ne fait rien."
    Else
            MsgBox "Dans la cible."
    End If
    End Sub

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut
    Bonjour CODYCO,

    je viens d'essayer en mettant "ActiveSheet.Range("L2").Value = Date" à la place de "MsgBox "Dans la cible."", mais:
    1. le message "MsgBox "Hors cible on ne fait rien."" apparait quelque soit la cellule sélectionnée
    2. il faut que je clique au moins 5 fois sur OK de la MsgBox pour que le message s'enlève
    3. Ca m'a actualisé la date sans qu'aucune cellule ait été modifiée.

    J'ai oublié de préciser que la plage A5:N50 contient plusieurs cellules (elles n'ont pas été fusionnées") je ne sais pas si ça a une importance...

  4. #4
    Membre expérimenté Avatar de CODYCO
    Homme Profil pro
    Webplanneur
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut
    Si tu veux ne rien faire quand la modification est en dehors de la zone enleve le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox "Hors cible on ne fait rien."
    Pour la date c'est normal qu'il te modifie la date puisque Date correspond à la date du jour si la velur de date doit etre différente tu dois la récupérer autrement.

    Je viens de tester juste avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("L2").Value = Date
    cela fonctionne bien il met la date du jour si c'est ce que tu veux...

    Code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Plage As Range
     
    Set Plage = Range("A5:N50")
     
    If Application.Intersect(Target, Plage) Is Nothing Then
            'Hors cible on ne fait rien.
    Else
     
            Range("L2").Value = Date
     
    End If
    End Sub

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 181
    Par défaut
    Bonjour à tous,

    A tester, basé en partie sur la réponse de Codyco :

    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
    Option Explicit
    Dim Plage As Range
    Dim Valeur
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Set Plage = Range("A5:N50")
    If Not Application.Intersect(Target, Plage) Is Nothing Then
            If Target.Value <> Valeur Then ActiveSheet.Range("L2").Value = Date
    End If
     
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
    Set Plage = Range("A5:N50")
    If Not Application.Intersect(Target, Plage) Is Nothing Then Valeur = Target.Value
     
    End Sub
    à installer dans la feuille souhaitée

  6. #6
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut
    Réponse à CODYCO:

    En effet je n'ai plus la MsgBox, mais dès qu'une cellule est sélectionnée la date est mise à jour. Or ce que j'aimerais c'est qu'elle ne soit modifiée que si le contenu d'une des cellules de la plage est mofidié.

    Réponse à HopPopPop:

    Alors j'ai inséré ton code dans mon module contenant déjà les Worksheet_Change et Worksheet_SelectionChange (de mon côté j'ai mis en Public). Cependant la date ne se met pas à jour...

    Je suis désolée de vous faire galérer mais c'est vraiment un casse tête cette histoire... En tout cas merci pour vos idées! Si vous en avez d'autres je suis preneuse! :p

  7. #7
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 181
    Par défaut
    Bonjour,

    Heu ? Le code fourni n'est pas à mettre dans un Module, mais sur la "feuille" en question. Si je me permets, la démarche est la suivante :

    Sur la fenêtre de l'explorateur de projet, sélectionner la feuille souhaitée dans le dossier "Microsoft Excel Objets" et cliquer sur l'outil "Afficher le code", puis y placer le code.

    D'ailleurs, ces évènements sont présents parmi d'autres.

    Bien cordialement.

  8. #8
    Membre expérimenté Avatar de CODYCO
    Homme Profil pro
    Webplanneur
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut
    Oui c'est certain que nous n'avions pas précisez ce détails qui nous paraissais évident puisqu'il concerne un évènement de la feuille...

    Le code que je t'ai fourni fonctionne chez moi...en le mettant dans la feuille et non un module...

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut
    Mon programme se présente sous la forme suivante:

    j'ai une feuille "Model" avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
        Call CM_Worksheet_Change(Target)
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
        Call CM_Worksheet_SelectionChange(Target)
    End Sub
    Ensuite je génère plusieurs feuilles qui sont des copies de ce modèle.

    J'ai également une macro contenant les:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Sub CM_Worksheet_Change(ByVal Target As Excel.Range)
    Public Sub CM_Worksheet_SelectionChange(ByVal Target As Excel.Range)
    et c'est là de dans que j'ai testé les codes. Je viens donc de réessayer le code de CODYCO en l'intégrant dans le code de la feuille de modèle mais ça ne marche toujours pas la date est mise à jour dès qu'une cellule est sélectionnée quelqu'elle soit...

    Je ne sais pas pourquoi c'est comme ça et si c'est bon mais je dois modifier un prog déjà existant et jusque là tout a marché normalement malgré ça...

  10. #10
    Membre expérimenté Avatar de CODYCO
    Homme Profil pro
    Webplanneur
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut
    Te conseille d'éléminer tout ca et de mettre un des deux codes que nous t'avons donné, la tu part dans tous les sens.

    Si tu veux tester créer une nouvelle feuille dans ton classeur (Feuil1) ensuite dans le projet vba tu fais double clic sur "Feuil1" pour aller dans le code de feuil1 et tu y met le code.

    Ca dois marché, apres je ne suis pas trop ton histoire de date quelle est la date avant et la date après? d'ou viennent elles?

  11. #11
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 181
    Par défaut
    Bonjour à tous,

    Je n'avais pas saisi cette nuance.
    Si vous voulez conserver les procédures communes appelées depuis les évènements d'une feuille "Model" ou autre (mais générée, à voir si le code d'appel dans cette nouvelle feuille se recopie), dans ce cas :

    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
    Option Explicit
    Public Plage As Range
    Public Valeur
     
    Public Sub CM_Worksheet_Change(ByVal Target As Excel.Range)
     
    Set Plage = Range("A5:N50")
    If Not Application.Intersect(Target, Plage) Is Nothing Then
            If Target.Value <> Valeur Then ActiveSheet.Range("L2").Value = Date
    End If
     
    End Sub
    Public Sub CM_Worksheet_SelectionChange(ByVal Target As Excel.Range)
     
    Set Plage = Range("A5:N50")
    If Not Application.Intersect(Target, Plage) Is Nothing Then Valeur = Target.Value
     
    End Sub
    C'est le code que j'avais proposé, mais avec les modifications suivantes:
    - elles prennent le nom de tes procédures ;
    - les variables sont déclarées en Public ;
    - elles sont placées dans un "Module".

    Bien cordialement.

  12. #12
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut
    En effet CODYCO, sur un nouveau classeur, en mettant ton code dans une feuille, ça marche! Donc je ne comprends pas pourquoi sur mon fichier ça bug...

    Par contre je ne peux pas tout enlever, comme je l'ai dit je dois refaire un prog donc je suis obligée de reprendre certaines parties... Ou alors je peux copier ce qui servait de macro dans chaque feuille?

    Y a t il une règle en ce qui concerne les "worksheet_change/selectionchange/etc..."?
    Est ce que je peux en avoir 1 pour chaque feuille de mon classeur que le code soit identique ou pas? et quelle est la différence entre Public et Private?

    Et mon histoire de date c'est tout simple. Je veux que la cellule L2 enregistre la date de la dernière modification de la feuille. Donc l'utilisateur a un classeur avec disons 10 feuilles. S'il regarde la 5ème sans la modifier, la date n'est pas changée. En revanche s'il souhaite modifier des données de la 6ème feuille, dans ce cas la date en L2 est mise à jour. Ceci permet de garder une trace de quand chaque feuille a été modifiée pour la dernière fois.

  13. #13
    Membre expérimenté Avatar de CODYCO
    Homme Profil pro
    Webplanneur
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut
    Oui tu peux mettre le meme code pour chacune des feuilles chaques code ne s'appliquera que sur la feuille concernée.

    Une variable public sera utilisable dans tous les modules et code de feuille pour cela le mieux étant de la déclarer dans le thisworkbook.

  14. #14
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut
    HopPopPop,

    je suis désolée, ça ne marche pas non plus...
    La date est mise à jour par une simple sélection et non une modification de contenu de cellule et surtout ça me génère une erreur:

    Erreur d'exécution '13': incompatibilité de type

    et il surligne en jaune: "If Target.Value <> Valeur Then"

    dans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set Plage = Range("A5:N50")
    If Not Application.Intersect(Target, Plage) Is Nothing Then
            If Target.Value <> Valeur Then ActiveSheet.Range("L2").Value = Date
    End If

  15. #15
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 181
    Par défaut
    Bonjour,

    Etrange ... Chez moi, ça fonctionne très bien.


    La variable "Valeur" est déclarée en Public dans le Module sans précision supplémentaire, autrement dit en Variant.

    Bien cordialement.

  16. #16
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Je prends le truc en cours de route, mais est-ce que tu as bien saisi la différence entre Worksheet_Change et Worksheet_SelectionChange. Car si tu mets le même code dans les 2 évènements, le comportement que tu décris est normal.
    Et sinon, je ne vois pas l'intérêt d'une variable globale, la passage de Target en paramètre était suffisant non ? Ou alors j'ai raté quelque chose.

  17. #17
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut
    Bonjour ZebreLoup,

    j'ai essayé de le mettre dans
    Worksheet_Change
    puis dans
    Worksheet_SelectionChange
    puis dans les deux
    puis la même chose avec mes CM_Worksheet_Change et CM_Worksheet_SelectionChange
    et...
    rien ne marche correctement!

  18. #18
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Alors Worksheet_SelectionChange se déclenche dès qu'on sélectionne une nouvelle cellule, donc a priori, cela ne t'intéresse pas, il faut l'oublier.
    C'est donc bien sur Worksheet_Change qu'il faut travailler (soit directement, soit en appelant une fonction d'un module, peu importe). Cette procédure doit se situer dans le code de le feuille sur laquelle l'évènement doit être détecté. Il est Private et Worksheet doit être remplacer par le nom effectif de la feuille. Mais le plus simple pour éviter toute erreur, c'est de laisser VBA créer la procédure tout seul en cliquant simplement au dessus du code. Il y a deux liste déroulantes. Tu choisis "Worksheet" à gauche et "Change" à droite. Soit il te créé une procédure vide si elle n'existe pas, soit il t'amène sur le code de cet évènement.

    Vu ce que tu évoques, il doit déjà y avoir des SelectionChange dans le code qu'il faudrait enlever. Après, le mieux serait de mettre des points d'arrêt sur ces procédures pour voir ce qui se passe.

  19. #19
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 16
    Par défaut
    Bonjour à tous,

    Grâce à CODYCO j'ai pu détecter d'où venait le bug:
    mes WorksheetChange et Worksheet_SelectionChange intervenaient sur les mêmes cellules!
    J'ai donc:
    - ajouté des conditions afin de préciser les plages de cellules qui concernaient chacun
    - ajouté le code proposé par CODYCO précédemment dans le Worksheet_Change

    Depuis tout fonctionne!

    Merci à tous pour votre aide!

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

Discussions similaires

  1. [LibreOffice][Tableur] Modif de macro suppression contenu cellule
    Par fransix dans le forum OpenOffice & LibreOffice
    Réponses: 5
    Dernier message: 05/12/2013, 14h45
  2. [XL-2007] Détection modification de cellule et copie de contenu de cellule + username
    Par Vitalic dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 27/12/2012, 15h09
  3. VBA -Détection de modification de cellule
    Par gwen.s dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/04/2010, 09h22
  4. Code de modification contenu Cellule apres recherche
    Par xeeel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/06/2009, 12h17
  5. modification contenu zone de liste deroulante
    Par Tierisa dans le forum Access
    Réponses: 12
    Dernier message: 23/09/2005, 00h06

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