Comment affecter le même Event d'une Class sur plusieurs éléments

Bonjour à tous ,

J'espère que l'un d'entre vous m'aidera à régler mon problème ou me donnera des pistes sur lesquelles avancées.

En vous remerciant par avance pour le temps que vous consacrerez à la résolution de celui-ci.

Je rencontre donc un problème concernant l'application d'un Event présent dans une Classe sur plusieurs éléments que je crée dynamique dans ma UserForm.

Voici une explication de mon programme en VBA :

J'ai une UserForm qui est composée d'une MultiPage et deux classes nommées respectivement Classe1 et Classe2.

Le code présent dans la UserForm me permet en cliquant sur un bouton présent sur la première page de ma MultiPage, de faire apparaître un nombre de TextBox égal au nombre rentré dans une TextBox elle aussi présente sur la page 1 (index=0) de ma MultiPage. Un nouveau bouton est aussi créé juste après la création des nouvelles TextBox. En cliquant sur ce nouveau bouton, je crée un nombre de nouvelles pages dans ma MultiPage égal au nombre rentré dans la première TextBox qui figure initialement sur ma page 1, et j'assigne chaque nom rentré dans les nouvelles TextBox à la page en lien.

Prenons un exemple pour illustrer tout ça. Si je rentre le nombre 2 dans la TextBox présente initialement sur la page 1 de ma MultiPage, et si je clique sur le premier bouton, je crée deux nouvelles TextBox et un nouveau bouton. Je rentre donc des noms dans les nouvelles TextBox, disons A et B, et en cliquant sur le nouveau bouton je vais créer une page nommée A et une autre B dans ma MultiPage.

A cela s'ajoute aussi la création d'une nouvelle MultiPage (appelons-la MP2) sur chacune des pages créées (A et B).

Si je regarde maintenant ma nouvelle page nommé A, en allant dessus, je vais tomber sur une nouvelle MultiPage avec plein de pages. En regardant uniquement la première page de la MP2 lié à A, je crée aussi 2 ComboBox dessus.

Ce que je suis entrain d'essayer de faire c'est de lier les 2 ComboBox sur chaque première page présente sur les nouvelles MultiPage. Ainsi, si je sélectionne le choix 1 dans ma première ComboBox j'obtiens des valeurs liées à ce choix dans la deuxième ComboBox et ainsi de suite.

Actuellement, j'arrive à avoir ce résultat mais il est appliqué uniquement sur la page nommé A (si on reprend notre exemple) et non sur la page B.

Voici ci-dessous une partie du code de mes deux classes permettant d'arriver à ce résultat. Ici la Classe1 qui permet d'affecter l'Event de la Classe2 sur chaque les ComboBox :

Option Explicit
Public WithEvents CmdEvents As MSForms.CommandButton
Public frm As Object
Dim comboxBoxArray() As New Classe2

Private Sub CmdEvents_Click() 'Il s'agit de l'event appliqué au deuxième bouton

    For i = 1 To nb_blocks 'nb_blocks represente le nombre rentré dans la première TextBox

        ReDim Preserve comboxBoxArray(1 To nb_blocks)
        Set comboxBoxArray(i).comboBoxEvents = frm.Controls("MP2" + CStr(i)).Pages(0).combobox1 
        Set comboxBoxArray(i).frm2 = frm

        Set combobox1 = Nothing

    Next i

End Sub

Comme vous le voyez, je boucle l'Event sur chaque première page de chaque MP2

Ici la Classe2 qui est appelée dans la Classe1 pour faire le lien entre les deux ComboBox :

Option Explicit
Public WithEvents comboBoxEvents As MSForms.ComboBox
Public frm2 As Object

Private Sub comboBoxEvents_Change()

    If frm2.combobox1.Text = "Water based fluids" Then

        frm2.combobox2.Clear

        For Each listA_ID In Ws2.Range("FluideEauGlacelf")
            With frm2.Controls("combobox2")
                .AddItem listA_ID.Value
            End With
        Next listA_ID

    ElseIf frm2.combobox1.Text = "Oil fluids" Then

        frm2.combobox2.Clear

        For Each listB_ID In Ws1.Range("FluideHuile")
            With frm2.Controls("combobox2")
                .AddItem listB_ID.Value
            End With
        Next listB_ID

    End If

End Sub

Malheureusement je ne peux toujours pas poster de photos donc si vous avez des questions sur le fonctionnement de mon progiciel je suis là pour y répondre !

Bonjour,

C'est difficile de voir ou l'erreur se situe sans voir le fichier.

Bonjour,

Je trouve votre construction de classes assez inhabituelle.

D'abord il serait approprié de nommer vos modules de classe (Classe1, Classe2) avec des noms parlants pour savoir ce qu'ils représentent exactement et à quoi ils servent.

Ensuite pour la gestion de vos événements d'après ce que vous indiquez, la logique aurait été d'avoir :

1- un module de classe "CmdButton" pour gérer les événements de plusieurs éléments liés à un CommandButton,

2- un module de classe "CbxList" pour gérer les événements de plusieurs éléments liés à une ComboBox

En tout cas, si on reprend votre logique ,pour déclencher les événements que vous avez définis dans votre UserForm, il faut assigner vos 2 variables objet : CmdEvents, comboBoxEvents aux contrôles correspondants :

Set  CmdEvents = CommandButton_i
Set  comboBoxEvents = Combobox_i

Merci pour vos réponses et désolé pour ma réponse tardive.

Je vais vous partager d'ici quelques jours un template de mon programme car je ne peux pas vous transmettre le véritable fichier (pour des raisons de confidentialité).

J'ai pris en compte vos remarques mais c'est un petit peu plus compliqué que ça... Enfin bref, je vous transmets ça le plus vite possible pour que vous y voyez plus claire !

Bonne journée,

Bonjour,

Comme prévu, je vous transmets un template de mon programme pour que vous y voyez plus clair. Je l'ai adapté de tel sorte à ce qu'il montre le problème de définition d'événements, qui est LE problème qui fait que mon programme de marche pas comme je le souhaite.

Voici les différentes étapes à suivre pour voir le problème :

  • Lancez la macro liée à l'UserForm1. Elle va s'ouvrir où vous devrez rentrer un nombre (mettez 2) et cliquer sur un bouton une fois le nombre rentré.
  • En cliquant sur le bouton vous allez voir apparaître deux nouvelles TextBox et un nouveau bouton. Rentrez des noms dans les TextBox, par exemple A dans la première et B dans la deuxième. En cliquant sur le nouveau bouton, cela va créer deux nouvelles pages sur la MultiPage présente dans l'UserForm avec les noms rentrés précédemment (A et B).
  • En allant sur la page A vous allez voir une nouvelle MultiPage. Sur la page 1 de cette nouvelle MultiPage vous avez une TextBox ainsi qu'un nouveau bouton. Rentrez un nombre (mettez 2) et cliquez sur le bouton.
Cela va créer un nombre de ligne de Controls égal au nombre rentré dans la TextBox. Parmis ces Controls vous avez une ComboBox ainsi que deux TextBox.
  • Rentrez des valeurs dans chacune de ces Controls.
  • Faites la même chose sur la page B.
  • En retournant sur la page A vous allez voir que la saisie faite précédemment sur la page A n'est plus présente, et qui plus est, il n'y a plus la liste des éléments dans les ComboBox.

Comme vous avez pu le constater les events de mes classes ne s'applique pas sur la page qui est active durant l'exécution mais sur toutes les pages.

J'aimerais donc trouver une syntaxe qui applique uniquement l'event sur la page active durant l'exécution.

Avez vous des idées ?

Merci !

26template.xlsm (31.52 Ko)

Bonjour,

les Events ne s'applique pas au multipage mais aux autres objets qu'ils soient dans un multipage ou non.

C'est à toi de baptiser tes objets de telle manière que tu saches à quelle page de quel multipage il appartiennent.

Tu peux numéroter de 100 à 199 ceux du multipage 1, de 200 à 299 ceux du multipage2... etc et garder les dizaines pour le N° de page de chacun...

Donc quand un évènement se déclencha s'il te renvoie 203 c'est que ça se passe sur la page0 du multipage2. A toi d'en déduire la suite...

A+

Merci pour votre réponse.

Je comprends qu'il y a une importance dans la nomination de chaque objets, je l'ai bien prise en compte.

Par contre je ne vois pas comment on peut dans une classe où on défini un événement, recueillir l'identité de l'événement pour l'appliquer aux bons objets.

Si je suis sur ma nouvelle page A de ma multipage 1 et si je clique sur sur le bouton de ma page 1 de ma multipage 2, je sais que son nom est 'Bouton_MultiPage1_newPage1_MultiPage2_Page1' par exemple. Ce qui m'intéresse ici c'est les indices pour savoir où se situe le bouton donc 1121. Je ne vois donc pas comment utiliser cette référence dans ma classe pour appliquer mon événement sur la multipage et la page concernée étant donné que eux aussi ont des indices lors de leur création.

L'idée étant d'avoir une structure du type dans ma classe :

Private Sub CmdEvents_Click()

'Etape 1 : On recueille le la référence du bouton qui est cliqué

'Etape 2 : On parcours chaque multipage et page associée pour trouver une correspondance avec la référence du bouton

'Etape 3 : Si on trouve une correspondance, on applique l'évenement uniquement sur la multipage et la page en question

End sub

C'est donc la définition en VBA de l'étape 1 qui me pose problème.

Merci beaucoup !

Bonjour,

Je pense que vous n'avez nul besoin d'un Event par page. J'ai révisé votre code dans ce sens et utilisé 2 modules de classe comme ils doivent l'être, c'est à dire en gérant les procédures événementielles dans le UserForm.

26template-1.xlsm (39.06 Ko)

Bonjour,

Je répond un peu tard, désolé.

Merci thev pour votre réponse je ne savais pas qu'on pouvais gérer les procédures de cette manière .

Dans mon cas je suis passé par l'utilisation du code suivant :

Dim NomBouton As String
    NomBouton = CmdEvents.Name

Cela me permet de recueillir le nom du bouton cliqué et de travailler avec les éléments et les pages associés à celui-ci.

Je mets en copie une version avec cette solution.

Merci encore et bonne journée !

Rechercher des sujets similaires à "comment affecter meme event class elements"