VBA controls trop nombreux pour leurs evenements

francoisC

XLDnaute Junior
Bonjour et merci pour votre attention
J'ai joint un classeur qui sera surement plus clair que ma demande; Laquelle est :
J'ai plusieurs dizaines de controls que j'ai créés et pour lesquels un ou des événement sont liés (exLBJ1_clic jusqu'à LBJ30_clic etc.) C'est beaucoup lourd (même si je l'ai fait).
La question est comment rendre le programme plus leger (on m'a parlé des modules de classe).
Merci encore pour votre aide.
 

Pièces jointes

  • équipes 2016 6.xlsm
    215.8 KB · Affichages: 79

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir francoisC,

Un exemple d'utilisation de classe pour la gestion d'évènement.
  • insérer un module de classe (destiné aux label LBCxx)
  • renommer ce module de classe (ici avec le nom Class_LBC)
  • dans le code de ce module de classe, insérer la ligne qui suit qui va permettre aux éléments qui sont du type ce module de classe de réagir aux évènements d'un label : Public WithEvents Label_LBC As MSForms.Label (label_LBC est un nom de votre choix)
Ensuite, il va falloir indiquer quels sont les contrôles du userform qui sont concernés par les évènements de cette classe.
Pour cela, on va remplir un tableau qui fera le "lien" entre les contrôles de type LBCxx et le module classe. Ce tableau est déclaré dans un module ordinaire qui est nommé mod_init_Class (nom à votre guise).
Dans le code de ce module, on déclare un tableau dynamique (à dimension variable). Ce tableau est nommé tClass_LBC() et il contiendra les contrôles de la classe Class_LBC. La déclaration du tableau se fait comme suit: Dim tClass_LBC() As New Class_LBC

Puis on implante la procédure Sub A_chaque_classe_son_tableau() qui va parcourir tous les contrôles du Userform EnregistrementHeures. Quand on rencontre un contrôle nommé LBCxx, on étend le tableau d'un élément puis on affecte ce contrôle à la propriété Label_LBC du dernier élément du tableau.
VB:
Sub A_chaque_classe_son_tableau()
Dim ctrl As Control, NBctrl As Integer
   ' dans le tableau tClass_LBC(), on affecte les contrôles
   ' LBC1, LBC2, ..., LBC30
   NBctrl = -1
   For Each ctrl In EnregistrementHeures.Controls
      If ctrl.Name Like "LBC*" Then
         NBctrl = NBctrl + 1
         ReDim Preserve tClass_LBC(0 To NBctrl)
         Set tClass_LBC(NBctrl).Label_LBC = ctrl
      End If
   Next ctrl


Nous avons jusqu'à maintenant:
  • créé un module de classe puis l'avons renommé.
  • inscrit une instruction dans ce module de classe permettant aux éléments de cette classe de réagir aux évènements de label.
  • créé un module d'initialisation permettant de définir quels labels doivent réagir aux évènement de type label.
  • dans ce module, créé un tableau dont les éléments sont de type le module de classe
  • puis dans ce module, rédiger un code qui pour chaque label concerné du userform le place dans le tableau.

Il reste maintenant, dans le code du module de classe, à rédiger le code de la procédure
évènementielle double-clique(). Dans l'exemple joint, si on double clique sur un label LBCxx, alors on affiche le nom du label cliqué ainsi que le texte de ce label.

le module d'initialisation sera lancé dans la procédure UserForm_Initialize()

Nous avons réalisé la même chose avec les contrôles Textbox nommés TBRxx.
Quand on double-clique sur un textbox TBRxx, on incrément sa valeur de 10.

On va donc trouver du code:
  • dans chaque module de classe
  • dans la procédure A_chaque_classe_son_tableau() dans le module mod_init_Class
Pour le test, afficher le userform puis double-cliquez sur un textbox de la colonne réalisé ou un label de la colonne chantier.
 

Pièces jointes

  • francoisC- équipes 2016 6- v1.xlsm
    270 KB · Affichages: 103
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 711
Messages
2 081 786
Membres
101 817
dernier inscrit
carvajal