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 :

gestion des évènements sur objets dynamiques


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 431
    Points : 209
    Points
    209
    Par défaut gestion des évènements sur objets dynamiques
    Bonjour à tous,
    je dispose d'un document Excel comportant une trentaine de colonnes et un bon milliers de lignes. On me demande de créer une interface simplifiée qui permette de filtrer mes données. En gros le principe doit être le même que celui d'excel, mais avec une interface.

    J'ai donc créé une form vierge sur laquelle je veux placer des menus déroulants de manière dynamique et les remplir avec les données unitaires de chaque colonne. L'initialisation marche trés bien, mais je bute sur la gestion des évènements. Je veux gérer l'évènement onchange auquel j'associerais le filtre de chaque colonne. J'ai identifié deux options:
    - je créé le code de mes évènements sur mon formulaire
    - je créé le code de mes évènements sur un module séparé
    Dans le 1er cas le projet plante à la fin de la création des n procédures correspondant à chaque colonne avec le message "automation error: the object invoked has disconnected frolm its clients"
    Dans le deuxième cas, le code se créé correctement (sauf si on sauvegarde le projet et qu'on le relance auquel cas il crashe car il copie deux fois le même code).

    Dans les deux cas, je n'arrive pas à associer mon menu déroulant et l'évènement onchange.

    Est-ce que quelqu'un à une idée?

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    Private Sub UserForm_Initialize()
        Dim wTab As Worksheet
        Dim rPlage As Range
        Dim rCell As Range
        Dim rValeur As Range
        Dim cMenusDeroulants As Collection
        Dim Menu As CMenus
        Dim iVal As Integer
        Dim iTop As Integer
        Dim iId As Integer
        Dim cbMenu As Object
        Dim lbLabel As Object
        Dim sCode As String
     
        'On Error Resume Next
     
        Set wTab = ThisWorkbook.Sheets("AVAILABLE")
        Set cMenusDeroulants = New Collection
     
        iTop = 10
        iId = 1
     
        For iVal = 1 To wTab.Range("IV2").End(xlToLeft).Column
            Set Menu = New CMenus
            With Menu
                .Name = wTab.Cells(2, iVal).Value
                .Left = 80
                .Top = iTop
                .ID = "cb" & iId
            End With
     
            iTop = iTop + 25
            iId = iId + 1
     
            cMenusDeroulants.Add Menu
        Next iVal
     
        Set Menu = New CMenus
     
        ' Création des combobox
        For Each Menu In cMenusDeroulants
            ' Création du combobox
            Set cbMenu = Me.Controls.Add("Forms.ComboBox.1", Menu.ID)
            With cbMenu
                .Top = Menu.Top
                .Left = Menu.Left
     
                sCode = ""
                sCode = sCode & "Private Sub " & Menu.ID & "_Change()" & vbCrLf & vbCrLf
                sCode = sCode & "    Msgbox" & """" & "Réussi" & vbCrLf & vbCrLf
                sCode = sCode & "End Sub" & Chr(13)
            End With
     
            With ThisWorkbook.VBProject.VBComponents("uStocks").CodeModule
                .InsertLines .CountOfLines + 1, sCode
            End With
     
            'Création du label associé
            Set lbLabel = Me.Controls.Add("Forms.Label.1", "lb" & Right(Menu.ID, Len(Menu.ID) - 2))
            With lbLabel
                .Caption = Menu.Name
                .Top = Menu.Top
                .Left = 5
            End With
     
            ' Création des données dans le combobox
            Set rPlage = wTab.Range(wTab.Cells(3, CInt(Right(Menu.ID, Len(Menu.ID) - 2))), wTab.Cells(wTab.UsedRange.Rows.Count, CInt(Right(Menu.ID, Len(Menu.ID) - 2))))
            Call FillCombobox(wTab, cbMenu, rPlage)
     
        Next Menu
    End Sub
    Rq: dans le code ci-dessus, j'utilise la classe CMenus qui gère les propriétés de chacun de mes menus déroulants: le libellé, l'id du menu, et l'emplacement sur le formulaire

  2. #2
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,
    ne serait-ce pas plus simple en utilisant le filtre élaboré ?
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  3. #3
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 431
    Points : 209
    Points
    209
    Par défaut
    Si tu parles de celui d'excel, la réponse est oui. Sauf que les utilisateurs du fichier ne comprennent rien à excel et ne veulent pas se lancer là dedans, donc je me retrouve à devoir coder ca....

    Je viens de voir la page de silkyroad, je vais y jeter un oeil
    http://silkyroad.developpez.com/VBA/VisualBasicEditor/


    Question subsidiaire: Comment modifier les filtres de mes menus déroulants de manière dynamique? Je m'explique. Quand l'utilisateur sélectionne une valeur du premier menu déroulant, tous les résultats montrés par les autres menus doivent être impactés. Comment gérer cette situation sans recharger les données à chaque fois?

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonsoir

    Dans le 1er cas le projet plante à la fin de la création des n procédures correspondant à chaque colonne avec le message "automation error: the object invoked has disconnected frolm its clients"
    Par expérience, il faut éviter placer la création de l'objet et l'ajout des codes dans une même boucle car VBA n'aime pas trop ça ... ;o)
    Réessaye en créant tous tes objets dans une première boucle, ensuite seulement tu ajoutes la partie de procédure pour créer dynamiquement les codes VBA.


    bonne soirée
    michel

  5. #5
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 431
    Points : 209
    Points
    209
    Par défaut
    Citation Envoyé par SilkyRoad Voir le message
    bonsoir



    Par expérience, il faut éviter placer la création de l'objet et l'ajout des codes dans une même boucle car VBA n'aime pas trop ça ... ;o)
    Réessaye en créant tous tes objets dans une première boucle, ensuite seulement tu ajoutes la partie de procédure pour créer dynamiquement les codes VBA.


    bonne soirée
    michel
    Hehe, merci.

    De toute facon, en suivant ton tuto je suis arrivé à gérer mes objets correctement. Je n'ai plus qu'à trier mes combobox et à trouver une solution pour mettre à jour le contenu de mes combobox selon les sélections que je fais.

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

Discussions similaires

  1. [XL-2010] Gestion d'évènements sur Checkbox Dynamique
    Par pinhut dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 16/06/2015, 17h52
  2. Gestion des id sur éléments dynamiques
    Par Manu0086 dans le forum Android
    Réponses: 4
    Dernier message: 25/01/2014, 10h20
  3. Gestion des évènements sur documents WORD
    Par kilicool dans le forum C#
    Réponses: 3
    Dernier message: 13/12/2011, 14h22
  4. [Débutant] Ajouter des évènements sur des objets dynamiques
    Par fdthierry dans le forum VB.NET
    Réponses: 6
    Dernier message: 30/09/2011, 17h30
  5. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 19h04

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