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] et Forms![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’écrire Forms![frm Clients], utilisez Me (« 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].
Info
Dans les langages inspirés du C++ (C++ bien sûr, mais aussi Java, C#, PHP…), l’équivalent de 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 classe Access.Form).
  • Un module d’état
    Dans ce cas, Me désigne l’objet État en question (une instance de la classe Access.Report).
  • Un module de classe VBA
    Dans ce cas, Me désigne l’instance de classe concernée.
Attention
Les modules standard ne sont pas des modules de classe (par définition !). Donc, vous ne pouvez pas utiliser 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 :

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 :

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 en frm 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.

Vous aimerez aussi...

12 réponses

  1. HAIFED dit :

    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.

    • Hervé Inisan dit :

      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.

  2. bobe48000 dit :

    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

    • Hervé Inisan dit :

      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.

      • bobe48000 dit :

        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

        • Hervé Inisan dit :

          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.

          • bobe48000 dit :

            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

          • Hervé Inisan dit :

            Ça peut être une relation 1:n : la table principale peut avoir plusieurs versions de son historique (si c’est utile dans le projet).

  3. QuestionAcc dit :

    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

  4. Hervé Inisan dit :

    QuestionAcc > N’ayant pas le détail de la classe, je ne vais pas être très précis. Mais à vue de nez :

    1. Il faut que la méthode de classe (la fonction) soit publique, pour pouvoir être visible de l’extérieur de la classe.
    2. Il faut instancier la classe puis invoquer la méthode.
    3. La bonne pratique consiste à libérer la classe ensuite.

    Ça peut donner quelque chose comme :

  5. Hervé Inisan dit :

    possible924 > Pour faire référence aux champs, ce sont simplement 2 variantes de syntaxe.

    • La variante 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, ou Me![...] 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…
    • La variante 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] devient Me.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.

  6. possible924 dit :

    Bonjour,
    Quelle est la diffèrence entre Me. et Me!
    Merci pour votre réponse

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *