XL 2010 [VBA] désigner un contrôle comme "Me"

F22Raptor

XLDnaute Occasionnel
Hello
Pour désigner dans le code d'un Userform le UF lui-même, on utilise Me.

Mais existe t-il un équivalent pour désigner le contrôle dont on tape le code.

Sub TextBox1_Change()

MsgBox TextBox1.Value

End Sub


Plutôt que TextBox1, peut-on écrire quelque chose comme MsgBox Me.ActiveControl.Value
qui renvoie de manière générique le contrôle dont on tape la macro ?
 

Dranreb

XLDnaute Barbatruc
Bonjour.
À ma connaissance non. Encore que si l'exécution est bien due à une modif par l'utilisateur et non induite par une affectation, Me.ActiveControl.Value devrait faire l'affaire. Mais je n'en vois pas bien l'intérêt. Pour des besoins particuliers on peut toujours déclarer une variable globale As MSForms.TextBox et lui affecter par un Set un de l'UserForm.
 

F22Raptor

XLDnaute Occasionnel
Merci Dran, je testerai ça.

L'idée est la suivante :
un Userform avec 10 textbox, et pour chacune un TextBox_Change qui transforme toute saisie négative en saisie positive par exemple.
Il faut alors copier/coller le code 10 fois, et faire pour chaque TextBox une adaptation du code if TextBox1.Value <0 then TextBox1 = -TextBox1.Value

Pour éviter les erreurs (oubli de modif du N° de TextBox), un Me.ActiveControl.Value = etc .... permet de copier exactement le même code
 

Dranreb

XLDnaute Barbatruc
Vous pouvez définir un type d'objet au moyen d'un module de classe comportant une propriété
Public WithEvents TBx As MSForms.TextBox
et une seule TBx_Change. Vous pourrez ensuite en créer autant d'exemplaires que vous voudrez en les conservant dans une Collection de l'UserForm par exemple.
 

F22Raptor

XLDnaute Occasionnel
Je note ! Mais j'avoue mon ignorance totale des modules de classe ... Il faudra que je m'y mette un de ces jours.
 

Dranreb

XLDnaute Barbatruc
Jamais en fait… Non ? Donc alors, ce jour ci, là maintenant, tout de suite…

Un module de classe est à la fois un modèle d'objet, son plan de construction et la programmation destinée à fonctionner sur les exemplaires qui en seront créés. On préfèrera ce mot "exemplaire" à l'anglicisme "instance" du jargon informatique. Le nom du module de classe devient aussi le nom du type de donnée objet qu'il définit, de sorte qu'on peut le préciser derrière As dans une déclaration Dim, Private ou Public.
Dans la programmation extérieure au module de classe on ne voit de celui ci que les éléments y étant précisés avec le mot clé Public, mais, à la différence d'un module ordinaire, on ne peut y accéder qu'à condition de le faire précéder d'un point, puis encore devant, à moins d'une instruction With préalable la précisant déjà, d'une expression représentant un exemplaire de cet objet (sinon: erreur de compilation). S'il s'agit d'une variable, il faut en outre qu'une expression de son type lui ait été affectée par un Set (sinon: erreur d'exécution, cette fois). Fort heureusement, l'expression formée du mot clé New suivi du type d'objet (qui est en même temps le nom de son module de classe) représente un exemplaire tout juste créé de ce type d'objet.
Propriétés et méthodes sont les appellations conventionnelles de ces élements visibles de l'extérieur du module de classe, déjà vues dans l'aide de VBA à propos des objets de bibliothèques fournies. Une chose déclarée Public dans un module de classe a un statut de propriété quand il s'agit d'une simple variable, d'une Function ou d'une Property Get dépourvues de paramètre, ou d'une Property Let ou Set munie du seul faux paramètre formel représentant la valeur à lui attribuer. Dans tous les autre cas il s'agit d'une méthode, en particulier quand c'est une Sub avec ou sans paramètre.
Enfin, un objet peut aussi décrèter des évènements dans un autre module objet. Pour cela, il doit y être déclaré en tête avec le mot clé WithEvents. Cela a pour conséquence d'installer son nom dans la liste de gauche (Objet) qui surmonte la fenêtre de code. S'il y est sélectionné, celle de droite (Procédure) propose les différents modèles de procédures pouvant être installés automatiquement pour profiter de ces évènements. Le nom des procédures installées seront de la forme NomObjet_NomÉvènement. Dans le module de classe, ces évènements sont déclarés au moyen d'instructions Event, et, lors des exécutions, décrétés par des RaiseEvent.
Pour être tout à fait complet, il ne resterait qu'un tout petit point à aborder à propos d'une espèce bien étrange de module de classe: le module d'interface. Mais je crois que ça suffit pour aujourd'hui !
 

Discussions similaires


Haut Bas