Optimisation : event sur objet indexé

Yohng

XLDnaute Nouveau
Bonjour,

Je suis sur un gros (pour moi! :) ) projet.
Voici mon problème, illustré par le petit exemple (extrait) joint :
Dans le UserForm, j'ai plusieurs objets qui ont la même action (juste un index vari).

Je "triche" en créant mon code avec excel (voir exemple dans la feuille), puis copier/coller dans VBA editor. (et en plus, coup de chance, mon objet a le meme index que la colonne à laquelle il se réfère! ;) )

1/ n'y a-t-il pas un moyen plus simple genre "Private Sub avion_Click()"

2/ Dans une procédure comment savoir qui l'a appelé
exemple :
Private Sub ACF07_Click()
MSGBOX Cqui.name
End Sub
ou bien sûr, Cqui.name renverrait "ACF07".... Le "me" me renvoi la userform, et nom l'objet qui a déclenché l'action! (dans ce cas, j'aurai une autre idée de tricherie...)

3/ D'autres idées simples car j'ai parfois jusqu'à 30 objets (souvent des textBox) dans un UserForm ?

Merci.
 

Pièces jointes

  • Classeur1.zip
    22.6 KB · Affichages: 26
  • Classeur1.zip
    22.6 KB · Affichages: 27
  • Classeur1.zip
    22.6 KB · Affichages: 35
D

Denis

Guest
Re : Optimisation : event sur objet indexé

Bonjour Yohng et le Forum
pour ton projet, il suffit de passer par les modules de classe.
Par contre, j'ai fait un essais, mais qui est "Avion" ?? déclaré comme objet.
à plus
Denis
 

Luki

XLDnaute Accro
Re : Optimisation : event sur objet indexé

Salut à vous 2.
Une solution avec un gestionnaire d'événements commun à tous les checkbox:

attention, j'ai déplacé l'objet avion dans le module1, pour le rendre public et accessible au code du module de classe.

Dis nous.
 

Pièces jointes

  • classeur1v2.zip
    26.9 KB · Affichages: 32
  • classeur1v2.zip
    26.9 KB · Affichages: 29
  • classeur1v2.zip
    26.9 KB · Affichages: 37

Yohng

XLDnaute Nouveau
Re : Optimisation : event sur objet indexé

Qui est avion ?
ce sont pour cet exemple, toutes les checkbox:

Dim avion(16) As Object

/// Kouik! ///
For Each cc In Controls
If Left(cc.Name, 3) = "ACF" Then
i = Val(Right(cc.Name, 2))
Set avion(i) = cc
cc.Value = INIT.Cells(2, i)
coche i
cc.ControlTipText = cc.Caption
End If
Next
//// KOUIK ///
remarques : j'utilise ici le nom pour le repérer mais parfois, c'est plus commode avec la balise "TAG"

Modules de classe ? J'en ai entendu parler mais je ne maitrise pas! Un example STP?
 

Yohng

XLDnaute Nouveau
Re : Optimisation : event sur objet indexé

Merci Luki,

J'ai compris et je viens de découvrir quelque chose et je risque d'en abuser!
Du coup mon dim avion(16) n'a pu lieu d'être puisque je sais maintenant qui déclenche l'action : "TheCb"!

Un grand merci.
Maintenant, il faut revoir toute ma copie.... Ca fait beaucoup de codes!
 

Yohng

XLDnaute Nouveau
Re : Optimisation : event sur objet indexé

Re-bonjour,

Dans le même style, est-il possible d'ajouter des propriétés à un objet (control) ?
exemple : TheCb.numero ? (TheCb étant un control !)
ou encore Userform.ExTop .... etc ...etc...
 
Dernière édition:

Luki

XLDnaute Accro
Re : Optimisation : event sur objet indexé

Re Yohng,

Dans le cas présent, non; car on crée une collection d'objets "checkbox" et on fait appel à leurs propriétés intrinsèque.

Le module de classe n'est pas une nouvelle classe d'objets utilisateurs mais une classe d'événements.

Par contre on peut tout à fait créer une classe d'objet personnalisée; c'est ce que je fais pour afficher des listes de prix dans un userform ( prix achat, p vente, pertes, marges etc). On peut dans ce cas affecter des propriété issues d'un tableau par exemple, ou des propriétés calculées...

Voilà
 

Yohng

XLDnaute Nouveau
Re : Optimisation : event sur objet indexé

Merci pour tes réponses rapides.

Donc, si j'ai bien compris, j'ai repris tes suggestions et mon "dim avion(16)"
(En tout cas, j'ai bien compris la puissance du control de classe sur les évennements, c'est top!)

J'ai maintenant mon propre objet "avion", et comment j'y ajoute des propriétés?

Ma question est sans doute stupide, mais j'ai du mal à saisir la notion de propriété sur les objets ?
J'ai essayé :
For Each MyCtl In avion
ReDim Preserve All_avion(0 To icb
Set All_avion(icb).TheCb = MyCtl
avion(icb).Add Name:="colonne", Value:=Val(Right(avion(icb).Name, 2))
icb = icb + 1​
Next MyCtl)​


Il me manque, sans doute, une notion de base ?
 

Pièces jointes

  • classeur1v2.zip
    25.7 KB · Affichages: 23
  • classeur1v2.zip
    25.7 KB · Affichages: 30
  • classeur1v2.zip
    25.7 KB · Affichages: 25

Luki

XLDnaute Accro
Re : Optimisation : event sur objet indexé

Sans avoir regardé ton fichier, un exemple d'utilisation de classes d'objet personnalisées.

Regardes bien les 2 modules:

Le principe est de créer une classe ( comme l'objet worsheet, par exemple) et de lui créer des propriétés.

Ensuite, on va créer la collection de tous ces objet ( la collection WorksheetS par ex) et travailler à partir de là.

Vois si tu comprends les 2 modules dans le fichier joint.
 

Pièces jointes

  • exemple_Class.zip
    10.6 KB · Affichages: 28

Yohng

XLDnaute Nouveau
Re : Optimisation : event sur objet indexé

Merci, je vais étudier celà.

Une autre question (sans abuser) au sujet des événnements :
la commande application.enableevents= false ne marche pas dans les UserForm, pourquoi ? je m'en sorts en mettant des drapeaux dans les procedure d'évennnement (if flag=true then exit sub) et ca marche très bien mais je pense qu'il doit y avoir un autre moyen de bloquer les events !
 

Yohng

XLDnaute Nouveau
Re : Optimisation : event sur objet indexé

exemple_class.zip :

OUI! OUI! OUI! J'ai compris et c'est génial! (surtout le "P_Vente=PA*marge", je n'y aurais pas pensé!)

Entre les classes d'évennements et les classes d'objets, je viens de faire un bon en avant! Et ca m'ouvre des portes infinies dans le VBA pour Excel! Et surtout une simplification du code !

J'apprends avec la touche "F1" .... mais elle a ses limittes!

MERCI
 

Luki

XLDnaute Accro
Re : Optimisation : event sur objet indexé

Super!

Pour inhiber ces événements, j'utilise une variable publique , c'est utile pour éviter des événements intempestifs à l'initialisation d'un Uform. ( un click qui déclenche un autre événement, etc)

Donc dans un module standard, une variable publique:

public BloqueEvent as boolean

dans n'importe quel code en cours, je peux l'utiliser et la passer à true ou false.

Dans le module de classe d'événement, j'écris par ex:

Private Sub TheCb_Click()
If BloqueEvent Then Exit Sub

etc...

Voilà

Bon courage
 
Dernière édition:

Yohng

XLDnaute Nouveau
Re : Optimisation : event sur objet indexé

Oui, c'est ce que je faits aussi pour bloquer les events, donc, je continue comme ça...

(par contre, là ou je suis mauvais, c'est dans les déclarations de variables, je m'en appercois en parcourant tes réponces et ce forum.... Il faut que je m'y applique!) ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 845
Messages
2 092 770
Membres
105 531
dernier inscrit
Fidele Lebeni