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 :

Exécution d'une macro lorsque deux plages de cellules de deux feuilles différentes sont modifiées [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Août 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 162
    Par défaut Exécution d'une macro lorsque deux plages de cellules de deux feuilles différentes sont modifiées
    Bonjour à tous !

    Je tente d'exécuter automatiquement ma macro lorsque mes deux conditions sont réalisées. Voici les deux conditions :
    1) Feuille 1 modifiée (ou au moins la plage Range("B3:AM3") qui correspond aux titres de mon tableau)
    2) Feuille 2 modifiée (ou au moins la plage Range("B3:AM3") qui correspond aux titres de mon tableau)

    Concrètement, je copie / colle deux tableaux différents dans les deux feuilles (1 et 2 donc.) et je lance ensuite la macro.
    Je souhaite m'épargner le temps de lancement de la macro en la lançant automatiquement lorsque je met à jour mes feuilles 1 et 2.

    J'ai d'abord cherché quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    '(This Workbook)
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Sheets("Feuil1").Range("B3:AM3"), Sheets("Feuill2").Range("B3:AM3")) Is Nothing Then
            Call Traitement
        End If
    End Sub
    Et malheureusement je me suis vite heurté à un problème : Je ne sais pas faire comprendre à Excel que je souhaite deux contions dans deux feuilles différentes.
    J'ai donc cherché une autre solution, à savoir, dans les feuilles de code des feuil1 et feuil2 :
    Feuil1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim x As Variant
        If Not Intersect(Target, Range("B3:AM3")) Is Nothing Then
            x = 1
                Else
                    x = 0
        End If
    End Sub
    Feuil2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim y As Variant
        If Not Intersect(Target, Range("B3:AM3")) Is Nothing Then
            y = 1
            Else
                y = 0
        End If
    End Sub
    Puis dans la feuille de code "This Workbook" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim x As Variant
    Dim y As Variant
        If x = 1 & y = 1 Then
            Traitement
        End If
    End Sub
    N'hésitez pas à me dire si ce n'est pas clair ^^
    Je n'arrive toujours pas à lancer ma macro de manière automatisée. Avez vous une idée/solution ?

    Stanler

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour Stanler,

    La solution des variables globales est censé fonctionner.
    Or, tu dois déclarer tes variables en tant que Public.

    Ainsi, dans un module standard, avec une petite Sub pour visualiser tes variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Option Explicit
     
    Public x
    Public y
     
    Sub affiche_var()
     
    MsgBox "Valeur de x : " & x & vbCrLf & "Valeur de y : " & y
     
    End Sub
    Tu peux même les initialiser dans ton Workbook :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Private Sub Workbook_Open()
     
    x = 0
    y = 0
     
    End Sub
    Et dans tes Worksheets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Explicit
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        x = 1
    End If
     
    End Sub
    Par contre, tu ne dois les remettre à 0 qu'après avoir lancer ta Sub "traitement".

    Voila, je pense que ça devrait marcher.

    Il y a surement plus simple. Un plus expert t'apportera peut-être une solution meilleure que la mienne.

    Cordialement,
    Kimy

  3. #3
    Membre éprouvé
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Août 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 162
    Par défaut
    Bonsoir Kimy,

    Merci pour ta réponse rapide, je vais tester ça et je reviens vers vous

    Edit :


    J'ai du passer à côté de quelque chose, je n'arrive toujours pas à lancer la macro.
    Hum, voilà le code de la feuil1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B3:AM3")) Is Nothing Then
        x = 1
    End If
    End Sub
    Feuil2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B3:AM3")) Is Nothing Then
        y = 1
    End If
    End Sub
    Feuil This Workbook :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Option Explicit
    Private Sub Workbook_Open()
    x = 0
    y = 0
    End Sub
    Private Sub Worksheet_Change(ByVal Target As Range)
        If x = 1 & y = 1 Then
            Traitement
        End If
    End Sub
    J'ai également créer un module avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Option Explicit
    Public x
    Public y
    Sub affiche_var()
    MsgBox "Valeur de x : " & x & vbCrLf & "Valeur de y : " & y
    End Sub
    J'imagine que mon problème vient de la feuille de code "ThisWorkbook", mais je n'arrive pas à déceler ce qui ne va pas dans ce code.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonsoir,

    A mettre dans le module du classeur uniquement :
    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
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
        If Intersect(Target, Sh.Range("B3:AM3")) Is Nothing Then Exit Sub
     
        If Sh.Name = "Feuil1" Then ModifSurFe1 = True
        If Sh.Name = "Feuil2" Then ModifSurFe2 = True
     
        If ModifSurFe1 = ModifSurFe2 = True Then Traitement Sh '<appel de la Sub "Traitement" pour le test !
     
    End Sub
     
    Sub Traitement(Fe As Worksheet)
     
        MsgBox "Modifications sur la feuille '" & Fe.Name & "' !"
     
        'remet à False après traitement
        ModifSurFe1 = False: ModifSurFe2 = False
     
    End Sub
    A mettre en tête d'un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public ModifSurFe1 As Boolean
    Public ModifSurFe2 As Boolean

  5. #5
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour Stanler, Theze,

    Theze utilise quelque chose de plus générique et plus pertinent. Comme nous te l'avons montré les variables doivent être déclarées en tant que Public.

    Pour rester sur la manière dont tu procèdes, dans ton Workbook change essaye plutot If x = 1 and y = 1 Then.
    De plus, je pense que tu dois plutôt mettre le lancement de ta Sub "traitement" dans les Worksheets plutôt que dans le Workbook.

    Mais tout en possible tant que tu appelles correctement l'événement. As-tu placé un point d'arrêt pour savoir si tu rentres bien dans ta condition ?

    Cordialement,
    Kimy

  6. #6
    Membre éprouvé
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Août 2014
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2014
    Messages : 162
    Par défaut Merci!
    Bonjour,

    Merci beaucoup pour votre aide ! La solution de Theze fonctionne parfaitement, j'ai juste eu besoin d'adapter les noms de feuilles et de Sub_blablabla()

    Merci encore !

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

Discussions similaires

  1. [XL-2003] Exécution d'une macro lors de la modification d'une plage de cellules
    Par martinmacfly dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 08/01/2010, 10h51
  2. Exécution d'une macro seulement lorsque la page est fini d'être affichée
    Par Dr_shaman dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/04/2009, 13h26
  3. [EXCEL] interrompre l'exécution d'une macro
    Par ustilago dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/10/2006, 10h24
  4. [VBA-E]Exécution d'une macro en arrière-plan
    Par Mirx1 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 25/04/2006, 23h13
  5. Allongement d'uin temps d'exécution d'une macro
    Par avanrill dans le forum Access
    Réponses: 2
    Dernier message: 06/03/2006, 19h29

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