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 :

Contourner un Evenement_Change


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut Contourner un Evenement_Change
    Re-bonjour le forum,

    Afin de n'alimenter ma ComboBox que par des valeurs non nulles et sans doublons, j'ai décidé de créer une seconde ComboBox qui me sert de stockage temporaire afin de ne pas provoquer l'événement "T_Cons_CBP4_Change()".
    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
    Private Sub T_Cons_CBP4_Init()
        Dim i As Integer
     
        Set WbO = WbT.Sheets(1)
        Set t = WbO.ListObjects("t_bg")
     
        For i = 2 To t.DataBodyRange.Columns(12).Rows.Count
            T_Cons_CBTest = t.DataBodyRange(i, 12)
            If T_Cons_CBTest.ListIndex = -1 And t.DataBodyRange(i, 12).Value <> "" Then
                T_Cons_CBTest.AddItem t.DataBodyRange(i, 12).Value
            End If
        Next i
     
        T_Cons_CBP4.List = T_Cons_CBTest.List
    End Sub
    En effet, avant d'arriver à cette solution-ci, je suis passé par une ligne qui m'appelait "i" fois l'événement T_Cons_CBP4_Change() pour une simple raison, c'est que cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T_Cons_CBTest = t.DataBodyRange(i, 12)
    était écrite comme cela...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T_Cons_CBP4 = t.DataBodyRange(i, 12)
    Et donc à chaque boucle cela provoquait l'événement Change. J'avais essayé avec le Application.EnableEvents mais j'ai cru comprendre que ce dernier était lié à l'application en tant que telle et non pas au UserForm, et vu que le changement appliqué se situait sur le UserForm je me retrouvais dans la panade. J'ai donc trouvé cette solution pour éviter ce problème.

    Pourquoi ce post alors ?

    Je souhaiterai savoir s'il y a une manière plus subtile d'empêcher temporairement un événément_Change de s'effectuer.
    Passer par la ComboBox "virtuelle" ne me dérange pas, mais ça crée un objet inutile (même si .Visible = False , il existe tout de même)

    Merci à tous et bon après-midi

    PS : N'hésitez pas à commenter pour m'aider à optimiser les lignes si cela est possible. J'ai déjà déclaré en Public certaines variables, que je n'aurai plus qu'à "Set" lors de l'initialisation de mes procédures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Option Explicit
    Public WbT As ThisWorkbook
    Public WbO As Worksheet
    Public mondico As Object
    Public t As ListObject

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    On ne peut pas (à ma connaissance), "suspendre" l'évènement Change.
    Par contre, il est souvent possible de mettre une condition dans son code pour traiter ou non les instructions qu'il contient.

    Pour en dire plus, il faudrait au moins deux informations qui ne sont pas dans ta demande : le code de ton Change et la raison pour laquelle il est utilisé.

  3. #3
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Bonjour menhir,

    Voici le code en question - sur lequel je n'ai pas encore travaillé l'optimisation. Je fais dans l'ordre d'exécution de mon code, celui-ci est le prochain sur lequel je m'attarderai.

    Quant à son fonctionnement, il s'agit d'un filtre réalisé sur une base de données qui est située dans ce classeur. En fonction de la valeur saisie grâce à la liste déroulante, les valeurs d'une autre liste déroulante (dépendantes de la 1ère liste) seront automatiquement mises à jour.

    Dans l'idée :

    Marque Voiture
    Renault Mégane
    Renault Scénic
    Peugeot 3008
    Fiat Panda

    où Marque est la liste déroulante "supérieure" qui, en fonction de la marque sélectionnée, mettra à jour la liste déroulante des modèles.

    L'événement Change s'effectue donc à ce moment-là. J'ai choisi l'exemple des marques de voitures parce que je trouve ça plus parlant que de commencer à partir sur le sujet des lignes budgétaires et des codes familles x)

    J'ai par ailleurs un événement DropButtonClick, mais je reviendrai vers vous si je rencontre un problème dans son exécution.

    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
    Private Sub T_Cons_CBP4_Change()
        Dim CBR As Range, CellCBR As Range, CBS As Range, CellCBS As Range
        Dim derLig As Integer
        Dim WbO As Worksheet
     
        Set WbT = ThisWorkbook
        Set WbO = WbT.Sheets(1)
     
        derLig = WbO.Cells(WbO.Rows.Count, 1).End(xlUp).Row
     
        WbO.Range("A2").AutoFilter
     
        WbO.Range("A2").AutoFilter Field:=11, Criteria1:=T_Cons_CBP4.Value
     
        Set CBR = WbO.Range(WbO.Cells(2, 12), WbO.Cells(derLig, 12)).SpecialCells(xlCellTypeVisible)
        Set CBS = WbO.Range(WbO.Cells(2, 2), WbO.Cells(derLig, 2)).SpecialCells(xlCellTypeVisible)
     
        T_Cons_CBP5.Clear
        T_Cons_CBBG.Clear
     
        For Each CellCBR In CBR
            T_Cons_CBP5.Value = CellCBR.Value
            If T_Cons_CBP5.ListIndex = -1 Then T_Cons_CBP5.AddItem CellCBR.Value
        Next
        T_Cons_CBP5.Value = ""
        For Each CellCBS In CBS
            T_Cons_CBBG.AddItem CellCBS.Value
        Next
     
        T_Cons_CBP5.Enabled = True
    End Sub

  4. #4
    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 : 71
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Citation Envoyé par Menhir Voir le message
    On ne peut pas (à ma connaissance), "suspendre" l'évènement Change.
    Par contre, il est souvent possible de mettre une condition dans son code pour traiter ou non les instructions qu'il contient.
    Une solution simple consiste à déclarer une variable publique (booléen) dans une module standard et de la tester pour savoir si les évènements sont autorisés ou non.
    Ça n'empêche pas l'évènement de se produire. Par exemple dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public EventEnabled As Boolean
    Dans le formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub T_Cons_CBP4_Change()
      If EventEnabled Then
        'Code
        '...
      End If
    End Sub

Discussions similaires

  1. Objet requis: 'expXpath', contourner l'erreur
    Par totoche dans le forum ASP
    Réponses: 3
    Dernier message: 09/11/2006, 14h35
  2. Comment contourner l'erreur ?
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/07/2005, 10h21
  3. Réponses: 3
    Dernier message: 22/03/2005, 09h13
  4. Contourner un obstacle 2D
    Par coco dans le forum Intelligence artificielle
    Réponses: 3
    Dernier message: 20/11/2003, 08h51

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