Création et utilité d'un complément

Access 2007 - Utilisateurs avancés

Vous développez des bases de données à tour de bras, et vous constatez que vous réutilisez souvent les mêmes routines VBA. Vous finissez par faire des copier-coller de vos différentes fonctions dans toutes les bases de données que vous créez, car vous constatez que vous réutilisez perpétuellement les même routines VBA.

Au fur et à mesure de vos déveléoppements, vous constatez que vous améliorez régulièrement vos fonctions et procédures VBA, et, finalement, vous vous retrouvez avec je ne sais combien de bases de données (par exemple pour plusieurs clients), avec a peu près, approximativement, plus ou moins les mêmes fonctions, mais dans une base A, la fonction ressemblera a :

Function Surface (Longueur, Largeur)
   if Longueur = Largeur then
      Surface = Longueur * Longueur
   Else
      Surface = Longueur * Largeur
   End IF
   End
End Function

Et puis, en la regardant de plus près, vous constatez qu'on peut l'écrire plus simplement. Alors, dans une autre base (B), vous copiez-collez cette fonction, et vous l'améliorez :

Function Surface (Longueur as Long, Largeur as Long) as Long
    Surface = Longueur * Largeur
End Function

Mais vous ne prenez pas le temps ni l'énergie de rechercher toutes les bases qui contiennent l'ancienne version ! Du coup, c'est un peu le désordre

Intérêt du complément

L'idée est de créer ce qu'on appelle un "complément". C'est une base de données tout à fait normale, mais que vous renommerez avec le suffixe .ACCDA au lieu de ACCDB (Ou MDA au lieu de MDB si vous travailklez avec une version d'Access antérieure à 2007)

Ce complément contiendra particulièrement des Modules VBA, et pas tellement de tables, requêtes formulaires ou état - Bien que ce soit possible !

Ces modules contiendront toutes vos fonctions et procédures que vous utilisez fréquemment dans toutes vos bases de données.

Pour mieux comprendre, nous allons reprendre l'exemple de la fonction Surface, que nous avons vu en introduction. Nous allons créer cette fonction non pas dans une base de données normale, mais dans un complément.

Marche à suivre : Création du complément

  1. Ouvrez Access
  2. Créez une nouvelle base de données vide
  3. Appelez-là "Mon complément.accdb" (Ca ne sert a rien de préciser accda, Access ne comprendra pas : il vous créerait Mon Complément.accda.accdb), dans le dossier de votre choix.
  4. Créez-y un module
  5. Recopiez-y la fonction que nous avons vu en début de page :
  6. Testez-là. C'est à dire : créez Sub Test() juste en dessous, comme ceci, et appuyez sur la touche F5 pour l'exécuter :
  7. Si tout se passe bien, vous devriez avoir le message :
  8. Nommez votre module : P_MesFonctions :
  9. Quittez Access, et acceptez la confirmation d'enregistrement


  10. Allez dans l'explorateur Windows, et renommez Mon Complément.accdb en Mon Complément.accda :
    -------------->

Voilà. Fin de la construction du complément. Vous constaterez qu'il s'agit d'une simple base Access que nous avons renommé tout bêtement. Constatez que ce renommage a changé l'icône : Il y a un minuscule point rouge à côté de l'icône Access.

Création d'une base de données qui va utiliser ce complément

  1. Lancez Access
  2. Créez une AUTRE base de données toute vide
  3. Appelez-là Client.accdb
  4. Créez également un module
  5. Mettez-y le code suivant :
    Sub TestComplement()
        MsgBox Surface(6, 7)
    End Sub
  6. Appuyez sur F5, et, évidemment, nous avons un message d'erreur :

    C'est normal : nous n'avons pas encore précisé à Access que Client.accdb doit être lié au complément Mon Complément.accda. C'est ce que nous allons faire maintenant :
  7. Toujours dans l'environnement VBA, allez dans le menu Outils/Références
  8. Cliquez sur "Parcourir..."
  9. Rendez-vous dans le dossier ou vous avez créé votre complément, choisissez tout en bas : "Fichiers de type Tous les fichiers" (Je ne sais pas pourquoi il n'y a pas de filtre ACCDA... Choisissez "Mon Complément.accda", et cliquez sur "ouvrir"

    Il se trouve maintenant dans la liste des bibiothèques (qui sont des sortes de compléments, mais programmées différemment : de sont des DLL, mais ça dépasse le cadre de ce chapitre. Bref : la coche veut dire que votre complément est chargé en mémoire :
  10. Cliquez sur OK

Voilà, c'est terminé.

Miantenant, si vous appuyez à nouveau sur F5 sur votre fonction TestComplement, vous aurez le message :

A partir de maintenant, si vous fermez Access, chaque fois que vous ouvrirez Client.accdb, Mon Complément.accda sera disponible. Mais si vous ouvrez une autre base de données, Mon Complément.accda ne sera pas disponible. Si vous avez quinze bases de données auxquelles vous voulez attacher Mon Complément.accda, vous devrez vous rendre dans chacune d'entre elles, et chaque fois, aller dans l'environnement Visual Basic, et aller chercher votre complément via la commande Outils/Références.

Par contre, l'avantage immense est le suivant : lorsque vous modifierez les fonctions du complément, les quinze bases de données bénéficieront du changement : nul besoin d'aller dans les quinze bases pour modifier quoi que ce soit.

Mais... du coup, si vous désirez envoyer votre base de données par e-mail à un client, pensez bien à lui envoyer également le complément, parce que sinon, il va se retrouver avec une base qui va essayer de chercher des fonctions (surface par exemple) qu'elle ne trouvera pas ! Il faut non seulement lui envoyer également le complément, mais encore faut-il que ce client enregistre ce complément dans un certain dossier de son PC, et qu'il aille rétablir la liaison dans le menu Outils/Références... Eh oui ! Sur mon PC, je lui ai bien dit d'aller chercher Mon Complément.accda dans le dossier D:\Atelier... Mais le destinataire de votre base de données va enregistrer son complément dieu sait ou...

Remarque importante

Lorsque vous êtes dans Client.accdb, dans l'environnement Visual Basic, vous avez la possibilité de visualiser le contenu des modules de Mon Complément.accda, comme ceci :

Du coup, vous pouvez-vous dire : "Chouette ! Pas besoin d'ouvrir expressément Mon Complément.accda pour ajouter ou modifier des fonctions, je peux le faire directement depuis n'importe quelle base liée à Mon Complément.accda"

N'en faites Rien !!!

Regardez : Je modifie mon Sub Test() du complément :

Sub Test()
    MsgBox Surface(3, 7)
    MsgBox "Coucou"
End Sub

Et, sale surprise, impossible d'enregistrer (C'est en grisé)

Sachez donc que si vous essayez de modifier ainsi le contenu d'un complément :

  1. Access ne vous empêchera pas de le faire
  2. Si vous appuyez sur CTRL S, il ne vous signalera pas "Lecture seule"
  3. Si vous quittez l'environnement VBA, vous n'aurez AUCUN MESSAGE d'erreur
  4. Si vous quittez même Access, aucun message non plus

Vos modifications auront été irrémédiablement et silencieusement perdues. Pour modifier le contenu d'un complément, vous DEVEZ ouvrir le complément lui-même.

Dernière remarque : Vous pouvez créer des tables, requêtes, formulaires, états. macros et modules dans un complément, mais, depuis les bases utilisant le complément, vous ne pourrez pas accéder aux tables du complément via DAO (Recorset et Cie.). Par contre, vous pourrez très bien ouvrir des formulaires du complément, qui eux-mêmes sont basées sur des tables du complément.

Toutefois, c'est une procédure ou fonction qui se trouve dans le complément qui doit contenir l'instruction OpenForm.

Je m'explique : Imaginons que vous ayez dans le complément un formulaire F_Client basé sur T_Client qui est une table créée dans le complément.

Dans la base de données qui utilise ce complément, si vous avez cette procédure :

Sub Machin
    DoCmd.OpenForm "F_Client"
End Sub

Vous aurez un message d'erreur "Objet non trouvé".

Par contre, si dans le complément, vous avez ceci :

Sub Truc
    DoCmd.OpenForm "F_Client"
End Sub

Et que dans la base de données qui appelle le complément, vous avez ceci :

Sub Machin
    Truc
End Sub

Machin de la base principale appelle Truc qui se trouve dans le complément, et du coup, pas d'erreur ! Vous suivez ?

Voilà. C'est tout poour aujourd'hui ! Le café est prêt, et les aspirines sont dans la pharmacie. :-)