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éclencher ue code de Private Sub Worksheet_Change(ByVal Target As Range) [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut Déclencher ue code de Private Sub Worksheet_Change(ByVal Target As Range)
    Bonjour,

    y-a-t-il un moyen de déclencher le code Worksheet_Change depuis une autre macro

    J'ai une macro Worksheet_Change d'une feuille "f1" dans laquelle je veux déclencher le code Worksheet_Change de la feuille "f2" qui se déclenche lui même quand la cellule A1 de "f2" est modifiée

    Pour cela je simule dans le code de "f1" une modification de "f2" par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f2.Range("A100") =  f2.Range("A1")   '  Je copie A1 dans une cellule temporaire A100
     f2.Range("A1") = ""   ' j'efface A1 pour provoquer un changement
     f2.Range("A1") = f2.Range("A100")  ' je restitue A1 à partir de la copie de A100
    Cela marche bien, mais cette séquence est dans une boucle (A1 à A50) et prend beaucoup de temps

    Je pense qu'il doit y a voir un moyen de déclencher le code Worksheet_Change de la feuille "f2" directement sans avoir à faire ces "move" successifs
    Il ne savait pas que c'était impossible, donc il l' a fait...

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 762
    Points : 28 621
    Points
    28 621
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le but d'une procédure événementielle est de se déclencher lorsqu'un événement se produit et pas de le provoquer par appel.
    Si vous expliquiez le but recherché, il y a certainement une autre solution.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,
    Citation Envoyé par retraite83 Voir le message
    y-a-t-il un moyen de déclencher le code Worksheet_Change depuis une autre macro.
    Pour déclencher l'évènement, c'est tout simple : il suffit donc d'écrire dans la feuille concernée (c'est ce qui déclenche l'évènement).

    Mais ce n'est peut-être pas ce que tu voudrais faire ...
    Peut-être voudrais-tu exécuter le code depuis une macro sans déclencher l'évènement : dans ce cas c'est l'architecture de ton code qu'il faut revoir :

    Dans le module de la feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Change(ByVal Target As Range)
      Call monModule.maMacro
    End Sub
    Dans un module standard (ici nommé monModule) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub maMacro()
      ' ici le code qui était dans _change :
      ' ...
    End Sub
    Dans le module de ta macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub taMacro()
      ' ...
      Call monModule.maMacro
      ' ...
    End Sub
    Pour moi, le code d'une macro Worksheet_Change ne doit jamais provoquer d'évènement dans une autre feuille.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  4. #4
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    Merci je vais regarder
    pour expliquer mon besoin :

    j'ai dans la feuille f2 un code Worksheet_Change(ByVal Target As Range) qui déclenche une mise en page dans une feuille f3 en anglais par défaut (EN)

    dans la feuille f1 l'utilisateur peut choisir la langue (FR ou EN)

    Quand l'utilisateur change la langue, il sélectionne FR pour le français et je veux que dans f3 la mise en page soit en français, donc je voudrai déclencher Worksheet_Change(ByVal Target As Range) de f2

    Idem s'il revient en EN
    Il ne savait pas que c'était impossible, donc il l' a fait...

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 762
    Points : 28 621
    Points
    28 621
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    L'exemple dans cette contribution, titrée Etiquettes de colonnes mutltilingues pour tableaux structurés vous inspirera sans doute.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 233
    Points : 462
    Points
    462
    Par défaut
    #3
    Pour déclencher l'évènement, c'est tout simple : il suffit donc d'écrire dans la feuille concernée (c'est ce qui déclenche l'évènement).
    c'est ce que je fais mais c'est long
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f2.Range("A100") =  f2.Range("A1")   '  Je copie A1 dans une cellule temporaire A100
     f2.Range("A1") = ""   ' j'efface A1 pour provoquer un changement
     f2.Range("A1") = f2.Range("A100")  ' je restitue A1 à partir de la copie de A100
    #5
    Merci Philippe, il va me falloir un petit moment pour digérer et comprendre votre solution...
    Il ne savait pas que c'était impossible, donc il l' a fait...

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Citation Envoyé par retraite83 Voir le message
    c'est ce que je fais mais c'est long
    N'y aurait-t'il pas un problème de récursivité ?
    (i;e. : la procédure de l'évènement change ne déclenche-t'elle l'événement ?)
    Penser à Application.EnableEvents = False avec un gestionnaire d'erreur indispensable dans ce cas.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  8. #8
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    Bonjour,
    1. tu déclare la méthode en public
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Public Sub Worksheet_Change(ByVal Target As Range)
    2. tu l'appel comme suis
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      F2.Worksheet_Change F2.Range("A1")

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/11/2015, 19h41
  2. [XL-2007] Ajouter une "Target" à Private Sub Worksheet_Change(ByVal Target As Range)
    Par 'OTM' dans le forum Macros et VBA Excel
    Réponses: 36
    Dernier message: 19/12/2014, 14h21
  3. [Toutes versions] Private Sub Worksheet_Change(ByVal Target As Range) et protection
    Par Giantrick dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/01/2013, 10h21
  4. [XL-2007] petit soucis avec un Private Sub Worksheet_Change(ByVal Target As Range)
    Par dris974 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/03/2011, 12h57

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