Qu’est-ce que "Me" en langage VBA ?
Si vous débutez en programmation VBA, vous avez dû voir trainer le mot-clef
Me
dans plusieurs bouts de code. A quoi sert ce mot-clef ? Quand peut-on l’utiliser ? Quand ne doit-on pas l’employer ?
About Me
En programmation objet, Me
désigne l’instance de classe dans laquelle on se trouve.
Euh… si vous êtes débutant, ce genre de phrase ne va pas vous aider !
Pour faire mieux (quoique !) :
- Dans Access, le formulaire,par exemple, est un objet type, standard (une « classe », nommée précisément
Access.Form
). - Lorsque vous construisez un formulaire personnalisé (un formulaire Clients ou Produits, par exemple), vous créez une variante du formulaire type.
- Et lorsque vous ouvrez le formulaire Clients et le formulaire Produits, ces 2 objets précis « vivent » en simultané à l’écran. Ils n’ont pas les mêmes réglages, pas les mêmes données, etc. Ce sont ces 2 objets qu’on appelle des instances.
- Pour faire référence à l’une ou l’autre des instances, en VBA, vous écrivez
Forms![frm Clients]
etForms![frm Produits]
, par exemple. - Maintenant, si vous devez taper du code VBA dans le formulaire Clients, ce code fera souvent référence au formulaire Client lui-même. C’est ici qu’intervient
Me
: plutôt que d’écrireForms![frm Clients]
, utilisezMe
(« moi » ; sous-entendu : le formulaire dans lequel se trouve le code VBA). - Si vous avez suivi, lorsque
Me
est placé dans le VBA du formulaire Produits, il équivaut àForms![frm Produits]
.
Me
s’appelle this
.Où peut-on rencontrer Me ?
Comme Me
désigne une instance de classe, il ne peut être utilisé que dans du code VBA reposant sur des classes. Concrètement, vous ne pouvez utiliser Me
que dans :
- Un module de formulaire
Dans ce cas,Me
désigne l’objet Formulaire en question (donc une instance de la classeAccess.Form
). - Un module d’état
Dans ce cas,Me
désigne l’objet État en question (une instance de la classeAccess.Report
). - Un module de classe VBA
Dans ce cas,Me
désigne l’instance de classe concernée.
Me
dans ces modules.A quoi ça sert ?
Me
est d’abord un raccourci d’écriture. Imaginez ce bout de code qui modifie la légende de 2 formulaires :
1 2 3 4 |
Sub Test() Forms![frm Clients].Caption = "Test 1" Forms("frm Produits").Caption = "Test 2" End Sub |
Le code donne 2 variantes d’écriture équivalentes (avec crochets ou avec parenthèses). Si ce code est tapé hors des formulaires frm Clients
et frm Produits
(par exemple dans un module standard), il ne doit pas être modifié, puisque vous « pilotez » en quelque sorte des formulaires de l’extérieur. Il faut donc spécifier le chemin complet pour accéder à chaque formulaire.
Imaginons maintenant que le code soit tapé dans le formulaire Clients. Étant donné qu’on se trouve dans le formulaire lui-même, il n’est plus utile de le nommer entièrement. On peut donc simplifier en :
1 2 3 4 |
Sub Test() Me.Caption = "Test 1" Forms("frm Produits").Caption = "Test 2" End Sub |
La deuxième ligne reste inchangée, puisqu’on ne se trouve pas dans le formulaire Produits (il faut pointer ce formulaire explicitement).
- Comme on l’a dit plus haut, le premier avantage est que le code est plus court à écrire, donc plus efficace.
- Autre côté pratique : si vous renommez
frm Clients
enfrm Customers
, le 2ème listing fonctionne toujours. Alors que l’exemple plus haut lèvera une erreur. Il donc plus facile de faire évoluer la base de données.
bonjour,
Voilà, je n’est pas su comment faire pour mettre à jour le champ ‘quantité en stock’ de la table produit, aprés qu’une ‘quantité’ d’un produit donné ait fait objet d’une commande dans la table lignecommande. ceci se passe dans une application Access.
même en utilisant des requêtes de type mise à jour çà n’a rien donné( UPDATE produit, regrouper SET produit.nouveaustock = produit.qtestock-regrouper.qtite
WHERE produit.refprod=regrouper.refproduir;)
si vous pouvez m’aider merci.
Est-ce que le volume de données est important ? Si oui, le calcul peut être intéressant. Sinon, il vaut mieux effectuer le calcul dynamiquement, lorsqu’on a besoin des quantités. Ceci peut se faire par une requête de regroupement, ou un DSum() en VBA. L’avantage est qu’on est sûr d’avoir toujours des valeurs à jour.
bonjour mon professeur Hervee
dans le sujet de Me
j’ai un formulaire pour saisie les dates de vaccination des enfants
j’ai par exemple
1- le champ [bcgpo] qui reçoit une date le champ de [sbcgpo] reçoit la date de jour de saisie c a d » = Now »
2- le champ [hbv1] qui reçoit une date le champ de [shbv1] reçoit la date de jour de saisie c a d » = Now »
resume tous les champs ont un champ d’historique de saisie qui comence par s+nom de champ
comment si possible cree un procedure apele ensuite par l’ evenement after update de champ active pour que le champ d’historique reçoit la valeur now
j ai essaye plusieurs procedure qui consiste a concatene le
» ME& »S »&ActiveControleName » mais toujours erreur
et merci je suis desole pour le longueur de explication
Cet autre article devrait aider.
Mais si tous les champs de la table sont doublés par un champ d’historique, la table est sans doute mal construite. Il faudrait probablement une table d’historique distincte.
Bonjour et Merciiiiiiiiiiiiiiii
mais pourquoi en construire une nouvelle table ??????
meme ds l’article de date de mise a jour qui j’ai lus avant consiste a cree le champ a même table !!!!!! bref je trouve ça facile a gérer cad ts au meme table
AAAAAAA!!!!!! un autre question svp pourquoi avant mis ajour pas après mis ajour de champ quel est la différence
Si tous les champs sont systématiquement dupliqués, on va alourdir la table pour des raisons d’historique. C’est pour cette raison qu’une table Historique serait plus adaptée (elle séparera la table métier de la table d’historique). Dans l’article de « Date de mise à jour », il n’y a qu’un champ, ce qui n’alourdit pas encore la table.
Sinon : l’événement « Avant MAJ » se déclenche avant que les données ne soient écrites dans la table. C’est le meilleur endroit pour intervenir sur les données avant leur stockage.
bien j’ai compris
la solution de crée une table a part d’historique
mais quel est la relation entre ces deux table
je pense que la relation 1-1 ????????
et merci
Ça peut être une relation 1:n : la table principale peut avoir plusieurs versions de son historique (si c’est utile dans le projet).
Le mot réservé Me est utilisé dans un module de classe.
Dans ce module de classe, j’ai créé une fonction xxx() utilisant Me.
Je veux attacher cette fonction à un événement d’un formulaire.
Or, si je saisis le nom de la fonction du module de classe (=xxx()) à l’utilisation de mon formulaire la fonction n’est pas reconnue.
La même manière de faire avec un fonction dans un module standard fonctionne bien.
Comment déclarer une fonction d’un module de classe dans un événement d’un formulaire ???
Merci d’avance
QuestionAcc > N’ayant pas le détail de la classe, je ne vais pas être très précis. Mais à vue de nez :
Ça peut donner quelque chose comme :
possible924 > Pour faire référence aux champs, ce sont simplement 2 variantes de syntaxe.
Me![Nom de champ]
, pour un formulaire ou un état est conforme à la syntaxe Access générale. Par ex., si un formulaire 1 doit récupérer un champ d’un formulaire 2, on peut écrire :=Forms![Formulaire 2]![Champ 2]
. En VBA, on peut utiliser la même chose exactement, ouMe![...]
si le champ se trouve sur le formulaire en cours. Le champ entre crochets est celui de la table (écrit à l’identique), ou celui du formulaire, de l’état…Me.
est plus proche de la notation pointée des classes VBA. L’avantage est qu’ici on peut utiliser l’auto-complétion (le fait que VBE suggère les noms de champs après le point. L’inconvénient (petit) étant que le nom du champ peut être transformé :Me![Nom de champ]
devientMe.Nom_de_champ
. Mais VBE propose la version corrigée, donc pas de souci.Par contre, pour faire référence aux propriétés d’un formulaire, on utilisera seulement la notation pointée :
Me.Caption
, etc.Bonjour,
Quelle est la diffèrence entre Me. et Me!
Merci pour votre réponse