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 :

Worksheet_change se déclenche plusieurs fois


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Par défaut Worksheet_change se déclenche plusieurs fois
    Bonjour,

    Le code suivant s'éxécute plusieurs fois d'affilée.
    Seuls les entiers entre 1 et 100 sont autorisés en colonne J par restriction de validation de donnée.
    Lorsque je saisis une valeur non autorisée dans la cellule, j'ai 2 solutions
    - soit J'annule et alors l'évènement worksheet_change est quand même lancé => problème car je copie une ligne à tord
    - soit je clic ré-essayer et mets une valeur entre 1 et 100 et alors la sub est lancée plusieurs fois, j'ai plusieurs fois mes msgbox et la ligne est copiée plusieurs fois


    Comprenez vous pourquoi ?
    Comment puis je faire pour que la sub ne soit effectuée qu'une fois et lorsque je rentre une valeur autorisée

    Merci d'avance



    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Private Sub worksheet_change(ByVal target As Range)
     
    Dim keycells As Range
    Dim i As Integer
    Dim CopyRange As Range
    Dim PasteRange As Range
     
    Dim lastrowjournal As Integer
     
     
    Application.EnableEvents = False
    MsgBox ("la feuille a bougé")
     
    If target.Count > 1 Then
    ' MsgBox (" target.count " & target.Count)
      Application.EnableEvents = True
      Exit Sub
    End If
     
     
    Set keycells = Range("J3:J10")
    If Not Application.Intersect(keycells, Range(target.Address)) Is Nothing Then
     
        MsgBox ("la colonne J  a bougé")
     
        For i = 3 To 10
            If Not Application.Intersect(Range("J" & i), Range(target.Address)) Is Nothing Then
                MsgBox ("la cellule J" & i & " a bougé")
                Set CopyRange = ThisWorkbook.ActiveSheet.Range("A" & i).Resize(1, 100)
                With ThisWorkbook.Sheets("journal")
                    lastrowjournal = ThisWorkbook.Sheets("journal").Cells(Rows.Count, "A").End(xlUp).Row
                    Set PasteRange = ThisWorkbook.Sheets("journal").Range(.Cells(lastrowjournal + 1, 1), .Cells(lastrowjournal + 1, 100))
                End With
                PasteRange.Value2 = CopyRange.Value2
            End If
        Next
    End If
     
    Application.EnableEvents = True
     
     
    End Sub
    Nom : capture.png
Affichages : 895
Taille : 46,2 Ko

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    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)
     Static Sortir As Boolean
    If Sortir Then Exit Sub
    Sortir = True
    'traitement
    Sortir = False
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Par défaut
    Bonjour,

    Je n'ai pas compris votre réponse.
    Sur quel critère devrais-je sortir de la sub ?

    merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    sur le critère qu'une cellule modifier dans worksheet_change rappel événements worksheet_change!

    Static Sortir As Boolean

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Par défaut
    Vous pensez que c'est une cellule modifiée dans worksheet_change qui rappelle la sub ?


    ok je vais essayer mais je pensais qu' Application.EnableEvents = False empéchait le rappel de la sub pendant l'éxécution de ladite sub.
    Au départ je n'avais pas mis Application.EnableEvents = False et le fait de modifier des cellules dans la feuille rappelait effectivement la sub. Mais depuis que je l'ai mis ca ne le fait plus.

    C'est seulement lorsqu'il y a intéraction avec l'activation verrouillée en integer que ca le fait.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Par défaut
    Cela ne marche pas avec le test booleen
    La sub est appelée plusieurs fois, mais pas par elle-même.

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Par défaut Suite et complément plusieurs déclenchements.
    Bonjour,

    Quelqu'un peut il me dire pourquoi l'évènement est joué plusieurs fois et comment l'empécher ?


    Nouveau test Code Simplifié :
    J'ai simplifié le code pour tester si la sub est appelée plusieurs fois lorsque les cellules ont une contrainte de validation de donnée.
    En effet, le message apparait plusieurs fois.

    J'ai testé avec la proposition de dysorthographie ci-dessous, avec ou sans Application Enableevents ..., Rien n'y fait. Le Msgbox apparait plusieurs fois



    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
    Private Sub worksheet_change(ByVal target As Range)
     
     
    Static Sortir As Boolean
    Application.EnableEvents = False
    'test effectué avec ou sans enable
    'test effectué avec ou sans la proposition d'utiliser Sortir en boolean
     
    If Sortir Then Exit Sub
     
    Sortir = True
    MsgBox ("la feuille a bougé")
    Sortir = False
     
    Application.EnableEvents = False
     
     
    End Sub
    Images attachées Images attachées  

  8. #8
    Membre expérimenté
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 146
    Par défaut
    Salut,

    Te dire pourquoi, je ne sais pas car pas testé...

    Par contre, voilà quelque chose qui peut t'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim keycells As Range
     
    Set keycells = Range("J2:J11")
    If Application.Intersect(keycells, Range(Target.Address)) Is Nothing Then Exit Sub
    If Not Target.Validation.Value Then
        Application.EnableEvents = False
        Application.Undo
        Application.EnableEvents = True
    End If
    Ce qui est intéressant, c'est qu'en décochant tout dans les onglets "Message de saisie" et "alerte d'erreur" de la validation de données, tu peux malgré tout, par le code, récupérer Vrai ou Faux si la donnée saisie est valide ou non, puis faire jouer le reste...

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Par défaut
    Oui, ça fonctionne effectivement.
    En virant les messages qui précisaient que la valeur n'est pas autorisée, je n'ai plus les appels multiples de la proc.
    Et pour compenser le traitement des valeurs non autorisées, je peux traiter moi même les actions/messages à mener selon la valeur vrai faux de Target.Validation.Value)

    Merci pour cette réponse très pertinente !

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/04/2010, 15h52
  2. [ADOQuery] Parametre utilisé plusieurs fois
    Par gibet_b dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/09/2004, 10h57
  3. Réponses: 4
    Dernier message: 02/09/2004, 21h43
  4. Réponses: 2
    Dernier message: 10/07/2004, 17h14
  5. [Servlet] Comment utilisé une servlet plusieurs fois ?
    Par gandalf_le_blanc dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 03/06/2004, 14h49

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