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 :

Lancer une macro suite à la modification d'une cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut Lancer une macro suite à la modification d'une cellule
    Bonjour,

    Je souhaiterais copier de manière automatique toute une plage de données dès que celle ci est mise à jour

    Dans mon fichier excel j'ai

    - un onglet appelé Export qui recoit des données de manières régulières et automatiques provenant d'un logiciel externe qui vient écrire dans cet onglet
    - un onglet appelé Recap où je souhaite remettre en forme ces données

    Dans cet onglet Recap j'ai une formule en B1 qui compte le nombre de colonnes non vides dans mon onglet Export
    Je souhaiterais que dès que sa valeur change les données présentes dans l'onglet Export soient copiées dans mon onglet Recap

    J'ai crée une macro dans le workbook en public, appellée Copie_Valeurs qui copie les données d'un onglet à l'autre et elle marche.
    Maintenant j'aimerais la lancer de manière automatique dès que la cellule B1 est incrémentée mais ce que j'ai écrit ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
      Application.EnableEvents = False
      If Target.Address <> "$B$1" Then Exit Sub
      Call Copie_valeurs
    End Sub
    Merci d'avance de votre aide

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    si, elle a marché la première fois mais elle ne pouvait la seconde fois vu l'erreur de conception du code
    car les évènements n'y sont pas réactivés avant la fin de la procédure ‼ A corriger, enregistrer, fermer Excel et réouvrir …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Bonjour,

    J'ai suivi vos conseils j'ai modifié le code de la manière suivante pour réactiver l'évènement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        If Target.Address <> "$B$1" Then Exit Sub
        Call Copie_valeurs
        Application.EnableEvents = True
    End Sub
    Malheureusement ce n'est toujours pas bon. C'est sans doute une erreur et un problème futile pour vous mais je n'ai pas les bases et malgré mes recherches je ne trouve pas de formation s'adressant aux tout débutants

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 684
    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 684
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        If Target.Address <> "$B$1" Then Exit Sub
    Bonjour,

    J'ai tronqué ton code pour bien te montrer l'erreur, si tu fait un changement ailleurs qu'en B1 alors tu quittes la sub sans réactiver les évènements. Du coup plus rien ne se déclenche.
    Donc soit tu réactive les évènements avant le exit sub, soit tu déplace la désactivation.

  5. #5
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 143
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 143
    Par défaut
    Bonjour,


    Citation Envoyé par emjidé Voir le message
    J'ai suivi vos conseils j'ai modifié le code de la manière suivante pour réactiver l'évènement
    Malheureusement ce n'est toujours pas bon
    il ne faut pas enlever les événements systématiquement sinon cela ne fonctionne qu'une fois effectivement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address <> "$B$1" Then Exit Sub
         Application.EnableEvents = False
         Call Copie_valeurs
        Application.EnableEvents = True
    End Sub

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Merci Halaster08 j'ai suivi vos conseils j'ai modifié le code en conséquence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        If Target.Address = "$B$1" Then
        Call Copie_valeurs
        Application.EnableEvents = True
        End If
    End Sub
    J'ai vu ensuite également la réponse de Anasecu qui a l'air de fonctionner de la même façon.

    Cependant peu importe le code si B1 se met automatiquement à jour de par ma formule => les valeurs ne sont pas copiées, elles sont copiées uniquement si je viens modifier manuellement la valeur de B1. Quelqu'un pourrait me guider sur la manière à adopter pour que si ma formule donne un résultat différent en B1 => la copie se lance ?

    D'après les recherches que j'avais effectué on pouvait le faire avec Worksheet_change ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 684
    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 684
    Par défaut
    Tu as fait la même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       Application.EnableEvents = False
        If Target.Address = "$B$1" Then
        Call Copie_valeurs
        Application.EnableEvents = True
        End If
    La réactivation est dans le if alors que la désactivation ne l'ai pas, donc la désactivation a toujours lieu mais si la condition n'est pas vérifiée alors la réactivation n'aura pas lieu.

    Dans le code d'anasecu, soit on désactive puis réactive soit on ne fait rien, donc ça marche.

    Cependant peu importe le code si B1 se met automatiquement à jour de par ma formule => les valeurs ne sont pas copiées, elles sont copiées uniquement si je viens modifier manuellement la valeur de B1. Quelqu'un pourrait me guider sur la manière à adopter pour que si ma formule donne un résultat différent en B1 => la copie se lance ?
    Je n'ai jamais fait, je crois avoir lu que c'est pas simple, ce qui est sur c'est que la question a déjà été posé, en cherchant bien tu devrais pouvoir trouver la réponse.

  8. #8
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 143
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 143
    Par défaut
    Bonjour,

    Citation Envoyé par emjidé Voir le message
    Cependant peu importe le code
    J'ai bien l'impression que tu ne fais guère attention au code et tu vas vers de grosses désillusions mais c'est ton problème : si tu n'es pas précis VBA ne va faire la précision de lui-même.

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Je débute dans VBA et à mon niveau je ne voyais aucune différence à l'usage.

    La programmation en VBA est pour l'instant pour moi abstraite et j'ai beau chercher à me former quand tu pars de zéro j'ai rien trouvé qui aide à "vulgariser" ce type de programmation simplement

    Je ne demande qu'à apprendre et progresser

  10. #10
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 684
    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 684
    Par défaut
    Si tu veux te former, il y a une section tutoriel bien remplie:

    Des exemples généralistes:
    https://www.developpez.net/forums/d1...ion-vba-excel/
    http://bidou.developpez.com/article/VBA/

    Sur les évènements comme worksheet_change: http://silkyroad.developpez.com/VBA/EvenementsFeuille/

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    J'ai suivi vos conseils hier soir j'ai potassé les différents liens + d'autres que j'avais trouvé, il y a des choses que je comprends mieux même si je pars de très loin.

    Halaster08 disait que c'était compliqué de faire marcher le worksheet change sur une mise à jour de formule calculée j'ai cherché mais je n'ai rien trouvé, du moins j'ai peur que vu mon niveau comme je ne comprends pas tout je ne m'en sorte pas et je préfère y aller pas à pas.

    Au final dans mon onglet Export, j'ai une cellule qui va rester constante en A1 et parmis les autres certaines vont changer au fur et à mesure de l'export. Du coup j'ai changé l'évènement de la façon suivante et je l'ai placé dans l'onglet Export

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$A$1" Then
       Application.EnableEvents = False
       Call Copie_valeurs
       Application.EnableEvents = True
    End If
    End Sub
    De ce que j'ai saisi le code Application.EnableEvents = False sert à déscativér les evènements et c'est conseillé lorsqu'on lance une macro de copier coller car ça évite les boucles infinies

    Mais je reviens toujours au même moment elle ne marche qu'une seule fois

    J'ai essayé aussi en sortant le Application.EnableEvents = True de la boucle IF pour que avant de sortir de l'évènement quoi qu'il arrive la gestion des évènements soit réactivée mais rien n'y fait

  12. #12
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 143
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 143
    Par défaut
    Bonjour,

    Citation Envoyé par emjidé Voir le message
    Halaster08 disait que c'était compliqué de faire marcher le worksheet change sur une mise à jour de formule calculée
    Je dirais même que cette procédure n'est pas faite pour cela puisque c'est une saisie sur la cellule qui la déclenche.
    C'est bien pour cela que tu n'a pas d'itération car tu ne peux obtenir son déclenchement qu'en simulant la modification de sa formule (F2+Entrée)

    Si tu veux utiliser une mise à jour de formule calculée l'événement à utiliser est donc Worksheet_Calculate

    "Cet événement se produit après le recalcul de la feuille de calcul, pour l'objet Worksheet."
    Elle te signale seulement que la feuille a été calculée et c'est à toi de vérifier par une sauvegarde préalable si ta cellule concernée a changé de valeur.
    Ce n'est pas spécialement compliqué, il suffit de bien définir la procédure à effectuer.

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2018
    Messages : 12
    Par défaut
    Je l'avais envisagé également sauf que il est spécifié sur http://silkyroad.developpez.com/VBA/EvenementsFeuille/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Worksheet_Calculate()
    Cet évènement est déclenché lors du recalcul (validation ou mise à jour des formules) dans la feuille, uniquement si l'option de calcul automatique n'est pas activée.
    Menu Outils
    Options
    Onglet "Calcul"
    Option "Sur ordre".

    Pour l'instant je passe par le biais d'un timer qui se déclenche toutes les X secondes à défaut de le faire marcher comme je souhaitais

  14. #14
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 143
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 143
    Par défaut
    Bonsoir,

    Citation Envoyé par emjidé/silkyroad/ Voir le message
    Cet évènement est déclenché lors du recalcul (validation ou mise à jour des formules) dans la feuille, uniquement si l'option de calcul automatique n'est pas activée.
    Eh bien c'est une erreur manifeste de l'auteur : tu peux essayer quand tu veux ! ;-)
    Si le calcul automatique n'est pas activé, comment veux-tu que l'événement se déclenche ?
    Si tu es en calcul manuel, c'est toi qui appuies sur F9 donc tu n'as pas besoin de l'événement.

    Il ne faut pas toujours croire sans contrôle ce qui est écrit ! ;-)
    D'ailleurs si tu regardes le site qui fait référence tu verras qu'il n'est nullement question d'un calcul désactivé
    https://msdn.microsoft.com/fr-fr/vba...te-event-excel

Discussions similaires

  1. [XL-2010] Exécuter une macro suite à des modifications de contenus de cellules
    Par poqcdlm dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/11/2014, 18h12
  2. [XL-2010] Reprise d'une macro 1 après exécution d'une macro 2 appelée par la macro 1
    Par julio44 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/07/2014, 13h32
  3. [XL-2007] Lancer une macro suite à un changement de valeur de cellule
    Par jnauche dans le forum Excel
    Réponses: 1
    Dernier message: 21/03/2014, 18h38
  4. declencher une macro suite a une modification d une feuille Excel
    Par chamus dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 11/01/2007, 10h50
  5. Modification d'une combo suite à la saisi dans un champ texte
    Par GabriHell dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/05/2006, 18h48

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