Access

Nouveautés

Requêtes complexes - Le but est d'avoir une table des clients, et une sous-table des différents commentaires liés à ces clients. Nous allons faire apparaître les commentaires les plus récents. Cet exercice nous amène à étudier et utiliser : Requête d'agrégat, avec fonction MAX - Requête sur une autre requête - Liaison double entre deux tables - Propriété de la requête "Mise à jour globale" - La fonction "Top" dans les requêtes - Le mode SQL - Le critère "in" - Alias de tables

Voulez-vous gagner des millions ? - Ce programme est une version allégée et totalement personnalisable du célèbre jeu télévisé.

Réserviciel - Ce programme Access vous permettra de planifier facilement la réservation de terrains de badminton, squash, tennis, mais aussi de salles de conférences, ou de toute autre réservation horaire

Personnalisation du ruban en XML (En cours de construction)

Accéder aux sous-formulaires avec VBA - [Comment]![S'y retrouver].("Avec tous ces signes")("Et comment faut-il")!LesEcrire.("[?]")

Cours

Bases de données exemple, prêtes à l'emploi

Données de test : Cette base de données contient quelques tables, afin de vous faire la main avec Access : une centaine de célébrités fictives,(T_Client), quelques fournisseurs, la liste de tous les pays du monde, les localités de Genève et leur code postal, ainsi que la liste des 24 cantons suisses.

Liste des mots français - Tous les noms communs du dictionnaire, au singulier et au pluriel, et au féminin.

Best of Gestion : Un exemple de base de données professionnelle : La gestion d'une menuiserie, avec le mode d'emploi.

Testez-votre QI - Pour rire bien sûr ! Mais votre logique sera mise à rude épreuve avec ce petit programme !

Dictionnaire d'apprentissage d'Esperanto - Une application Access très sympathique qui utilise deux sous-formulaires côte à côte.

SpeedList - Vous partez souvent en voyage ? Au ski ? Au soleil ? Vous avez toujours peur d'oublier quelque chose ? Cette check-list vous permettre d'établir des listes prédéfinies de choses à ne pas oublier, modifiables à souhait.

Trucs et astuces

Menus contextuels personnalisés - Si vous cliquez avec le bouton droit de votre souris sur un de vos formulaires, vous pouvez faire apparaître un menu personnalisé au lieu du menu habituel. La marche à suivre est très différente pour Access 2003, Access 2007 et Access 2010.

Créer un complément .accda - Une manière d'augmenter drastiquement la puissance d'Access. Pour utilisateurs expérimentés uniquement.

Gardez l'historique des modifications - que vous effectuez dans les tables via vos formulaires

Enlevez la sécurité Access 2007-2010 - La philosophie ultra-sécuritaire de Microsoft crée parfois quelques blocages qui finissent par nous empêcher de travailler.

Partition - Cette fonction permet de regrouper les données numériques ou monétaires par tranche de 5'000, de 10'000, ou de n'importe quelle autre valeur dans une requête

Nouveautés d'Access 2007

La sécurité au niveau des utilisateurs, des groupes et des objets - Transformez votre base de données en forteresse (Attention : le format Access 2007 n'accepte plus cette fonctionnalité)

Les relations  - Intégrité référentielle, 1 à 1, 1 à plusieurs, une table liée avec elle-même, etc.

Répéter les titres de section dans un état avec le mot "Suite" si nécessaire - Un doigt de Visual Basic pour ajouter cette fonctionnalité bien pratique

Les objets essentiels d'Access : Tables, Requêtes, Formulaires, Etats, macros et Modules

Requête suppression basée sur 2 tables - Pas si simple ! Un doigt de SQL et la clause "IN" seront nécessaires

Liste déroulante restreinte - Une fois qu'on a choisi un pays dans une 1ère liste, il ne faudtrait pouvoir sélectionner que les villes de CE pays

Fonctions Excel au sein d'Access - Excel possède beaucoup plus de fonctions qu'Access. Comment faire pour les utiliser malgré tout ?

Boutons radios fonction Choisir - Des boutons radios représentent une alternative esthétique des listes déroulantes. Ils se combinent à merveille avec la fonction Choisir

Sélectionnez des fichiers et des dossiers - Affichez les boîtes de dialogues de sélection de fichiers et dossiers

Les limites/performance d'Access - Limites de tailles des différents composants (Bases de données, tables, requêtes, objets, Formulaires, états, macros)

Access 2000 <> 2003 - Différences, améliorations

Additionner des heures dont le total excède 24 - Et éviter qu'Access commence à compter les jours plutôt que les heures

Requêtes : l'opérateur Comme - Comment extraire aisément des parties de textes dans les champs

Accéder à Outlook depuis Access (VBA) - Envoyer un e-mail à tous les clients qui se trouvent dans une table

Accéder à Excel avec VBA - Importer toutes les feuilles d'un classeur en une fois

ADO - Accès aux données des tables via ActiveX Data Objects

Commutateurs de démarrage - Quand on lance Access, on peut lui demander de se comnporter de telle ou telle manière

Mot de passe Access perdu - Comment le retrouver ?

Raccourcis-clavier - Pour une saisie rapide et optimisée dans les tables, requêtes et formulaires

Utilisation d'une table-système - Compter le nombre de fois qu'une base de données a été ouverte, par exemple

Empilement de tables avec UNION - La requête de type UNION permet d'empiler deux ou plusieurs tables ou requêtes les unes au dessus des autres

NuméroAuto doit commencer par un autre nombre que 1

Etats : Comment gérer des champs trops larges ?

Graves problèmes système - Lorsque votre base de données ne s'ouvre plus, ou dysfonctionne gravement

Requêtes analyse croisée - Ce type de requête est le "parent pauvre" et ancien des tableaux croisés dynamiques, mais peut être parfois utile

Petites astuces diverses

Faire disparaître complètement le ruban sous Access 2007-2010

Lorsque vous avez terminé votre application Access, il est sage de limiter les choix du ruban aux utilisateurs. Aussi, je vious recommande de désactiver les menus complets en allant dans le menu Fichier/Options/Base de données active. Ensuite, à droite, sous la rubrique "Options de la barre d'outils et du ruban", décocher la case "Autoriser les menus complets". Mais, étrangement, lorsque vous fermez et rouvrez la base de données par la suite, les rubans sont très réduits, mais vous avez toujours accès au menu Fichier/Options, et aez le loisir de recocher cette case, ce qui n'êst pas bien. Aussi, mieux vaut carrément supprimer tout le ruban. Pour ce faire, mettez le code suivant sur "Sur ouverture" du formulaire que vous avez choisi d'afficher dès l'ouverture de votre base de données (Fichier/Options/Base de données active, et à droite : "Afficher le formulaire".) :

Private Sub Form_Open(Cancel As Integer)
    DoCmd.ShowToolbar "Ribbon", acToolbarNo
End Sub

Raccourcis-clavier

La liste complète des raccourcis-clavier Access 2010 se trouve sur cette page de Microsoft.

Requête liée sur une autre base de données

Il st possible de lier des tables d'une autre base de données grâce au ruban Données externes / Importer et lier, mais il est aussi possible de créer une simple requête basée sur une table (ou requête) située dans une autre base de données. Pour ce faire, faites apparaîtres les propriétés de votre requête (bouton droit dans une zone grise de votre requête ouverte en mode création et Propriétés). Dans la propriété Source, indiquez le chemin et le nom de la base de données dans laquelle se trouve la table ou requête sur laquelle vous désirez baser votre requête actuelle.

Mise en forme des champs mémo en texte enrichi (Access 2007-2010)

Vous pouvez désormais définir des champs Mémo en format HTML (Propriété "Format du texte" : "Texte enrichi"). Ca vous permettra de mettre en forme certaines partie du texte (en rouge, en gras, en italique, ...). Toutefois, en arrière plan, Access ajoute des balises HTML, invisibles. Par exemple, "Texte important" sera stocké ainsi : "Texte <strong>important</strong>". Ca ne gêne pas, puisque ces balises ne se voient pas, mais, dans certains cas, elles pourraient apparaître. Dans ce cas, vous créerez une requête basée sur la table qui contient ce champ mis en forme (disons qu'il s'appelle Remarque, et créerez une colonne calculée : plaintext(Remarque). Cette fonction retire toutes les balises HTML et donc les mises en forme de ce champ.

Affichage d'un certain nombre de décimales

Lorsque vous créez un champ en Numérique, vous pouvez définir, entre autres, 2 propriétés : Format et Nombre décimales. Si vous laissez la propriété Format vide, ou que vous écrivez "Format général", le chiffre que vous aurez indiqué dans la propriété Nombre de décimales sera sans effet. Il suffit de choisir un autre format (Standard, par exemple), pour que ces décimales soient toutes visibles.

Comment faire en sorte qu'un champ NuméroAuto n'ait pas de "trous" ?

Admettons une table avec 1000 enregistrements, mais lors de la saisie des données, il y a eu des annulations, des suppressions : bref, le NuméroAuto de cette table a des "trous" : c'est à dire que les numéros ne se suivent plus forcément. Le dernier enregistrement (le millième exactement) porte, par exemple, le numéro 1045. Attention : l'astuce présentée ne doit PAS s'effectuer si le champ NuméroAuto de cette table est en relation avec d'autres tables, car ça mélangerait tout !

1. Supprimez le champ NuméroAuto de cette table
2. Recréez-le

Si vos numéros se suivent biené mais que si vous créez un enregistrement, le numéro ne suit pas exactement l'avant-dernier, il suffit alors de compacter la base de données.

Inhibition de la touche Majuscule (shift) au démarrage

Lorsque vous ouvrez certaines bases de données, un formulaire s'affiche automatiquement au démarrage. Afin de ne pas afficher ce formulaire, il suffit d'appuyer sur SHIFT (Majuscule) en même temps que vous ouvrez la base de données en question. Mais on peut empêcher d'utiliser cette astuce du SHIFT : cette base de données montre par la pratique comment faire, grâce à l'instruction AllowBypassKey.

RunTime

Vous pouvez développer une application Access, et l'installer sur autant de PC que vous le désirez, gratuitement. téléchargez le complément Access RunTime (57Mo) pour Access 2007 ici, et pour Access 2010 ici.

Génération de PDF avec Access 2007

Access 2007 permet maintenant l'exportation en PDF. Rendez-vous sur cette page de Microsoft, téléchargez et exécutez le complément. Vous verrez maintenant dans le ruban "Données externes" une icône "PDF". Access 2010 permet de créer des PDF nativement, sans besoin de complément.

Comment rendre une table invisible ?

Il y a 2 techniques :

Cliquer avec le bouton droit de votre souris sur la table, et choisir Propriétés, cocher "Masqué".

Renommer votre table en la faisant commencer par USYS (T_Client deviendrait USYST_Client).

Access 2003 et avant : Pour les faire réapparaître, il faudra aller dans le menu Outils/Options, onglet Affichage, cocher "Objets système". Alors que si vous avez opté pour la première technique (Bouton droit/propriétés/Masqué), c'est "Objets masqués" qu'il faudra cocher. Ce préfixe USYS ne fonctionne qu'avec les tables (pas les requêtes, formulaires, etc.).

Access 2007-2010 : Cliquez avec le bouton droit de la souris quelque part dans le volet de navigation de gauche, mais pas sur un objet (Dans la zone blanche vide, en dessous, plutôt), et choisir Options de navigation. Les coches Masqué et Système de trouvent en bas de la boîte de dialogue.

Comment créer une requête qui retourne toutes les valeurs supérieure à la moyenne de tous les enregistrements ?

Admettons une table T_Salarie dans laquelle nous avons un champ Salaire, et qu'il s'agisse d'extraire tous les salaires supérieurs à la moyenne des salaires. Dans une requête, écrivez comme critère du salaire :
>MoyDom("[Salaire]";"T_Salarie")

Visualiser un champ en MAJUSCULES

Mettez juste le signe > dans la propriété Format

Une bonne manière de s'initier à VBA pour Access 2007

Créez une macro qui contient quelques actions, et pour savoir comment écrire la même chose en Visual Basic, fermez la macro, enregistrez-là, et sélectionnez-là en cliquant une fois dessus (sans l'ouvrir). Dans le ruban, cliquez sur "Outils de base de données", et dans la rubrique "Macro", cliquez sur "Convertir les macros en Visual Basic". La macro, ou le groupe de macros sur lequel vous êtes sera transformée en fonctions VBA.

Comment nettoyer une table de caractères parasites ?

Lorsque vous saisissez beaucoup de données, vous pouvez "riper" sur votre clavier, et taper Du^pont ou Dùpont à la place de Dupont. Créez une requête, et dans cinq lignes de critères, copiez collez ceci :

Comme "*[°§+ç%&/()=`¦@#¬|¢'´~`!{}$£<>\,;.:-_]*"
Comme "*[*]*" Ou Comme "*[[]*" Ou Comme "*]*" Ou Comme '*"*' Ou Comme "*[?]*"
Comme "*[àäâéèêîìôöòóûùúÿñ]*"
Comme "*[0123456789]*"
Comme " *"

Premier Comme : Caractères spéciaux
Deuxième Comme : Caractères tellement spéciaux qu'on doit les écrire de manière particulière : *, [ , ] , ", ?
Troisième et quatrième Comme : Caractères accentués et chiffres
Cinquième Comme : Enregistrements commençant par un espace tapé par erreur

Quelques critères de requête utilisant le mot-clé Comme

Comme"[F-H]*" Enregistrements commençant par E,F,G ou H
Comme"B*D" Enregistrements commençant par B et finissant par D (Bernard)
Comme"[*]ABC" permet d'utiliser l'étoile comme caractère fixte. Renvoie l'enregistrement *ABC
Comme"b?n" Un seul caractère alphanumérique
Comme"No#" Un seul chiffre (No1, No2, ...)
Comme"[!A-C]*" Enregistrements ne commençant pas par A ni B ni C
Comme"b[ae]lle" Renvoie belle et balle
Comme"b[a-e]lle" balle, bblle, bclle, bdlle, belle
Comme"b[!ae]lle" Tout sauf balle et belle

Comment agrandir la fenêtre Access en plein écran avec VBA ?

DoCmd.Maximize ' La fenêtre active au sein d'Access
DoCmd.RunCommand acCmdAppMaximize ' Le programme Access lui-même

Changer la valeur par défaut d'un champ dans une table via VBA ?

CurrentDb.TableDefs("T_Celebrite")("Ville").Properties("DefaultValue").Value = "Caracas"

Attention : Selon les propriétés, elles n'existent pas encore. Par exemple, si vous décidez de changer la propriété Caption (légende) d'un champ, il faut qu'auparavant il y ait eu au moins une fois une légende, sinon une erreur est générée.

Comment fermer Access depuis VBA

Fermer la base en laissant Access ouvert :
Application.CloseCurrentDatabase

Fermer la base et Access

Application.Quit

Créer dynamiquement une table à l'aide de SQL

Allez dans une nouvelle requête, en mode SQL, et copiez-y le code suivant :

CREATE TABLE T_Ami
([IDAmi] int,
[NomAmi] text,
[Prenom] text,
CONSTRAINT [MonBelIndex] PRIMARY KEY ([IDAmi]));

Ensuite, fermez la requête. Vous verrez cette requête dans votre liste de requêtes, à gauche, avec un icone particulier. Si vous double-cliquez sur cette requête, vous allez créer une table T_Ami avec les Champs IDAmi, NomAmi et Prenom. IDAmi sera en numérique Entier Long, et défini en clé primaire. Cette requête ne peut se créer qu'en SQL.

Cette requête ne doit pas être confondue avec la plus classique requête Création de table, qui, elle, crée une table à partir d'une table existante, et y transfère également tous les enregistrements. Cette requête peut être créée en mode normal (QBE) sans SQL. Mais voici le code SQL d'une requête création de table qui crée T_Ami2 a partir de T_Ami :

SELECT IDAmi, NomAmi, Prenom INTO T_Ami2 FROM T_Ami;

Créer dynamiquement une requête et l'effacer, à l'aide de VBA

CurrentDb.CreateQueryDef "R_Client", "SELECT * FROM T_ListeClient;"
DoCmd.DeleteObject acQuery, "R_Client"

SysCmd : affichage d'infos intéressantes

Debug.Print SysCmd(acSysCmdAccessDir) ' Le dossier qui contient MSAccess.EXE
Debug.Print SysCmd(acSysCmdAccessVer) ' La version d'Access
Debug.Print SysCmd(acSysCmdGetWorkgroupFile) ' Le fichier de groupe de sécurité MDW utilisé
(Jusqu'à la version 2003 max.)

Quelques idées de ce qu'il est possible d'écrire dans la colonne "Si" d'une Macro

[Ville]="Paris"
CpteDom("[RéfCommande]", "Commandes")>35
CpteDom("*", " Détails Commandes ", "[RéfCommande]=Forms![Commandes]![RéfCommande]")>3
[DateEnvoi] Entre #2-Fév-2006# Et #2-Mar-2006#
Forms![Produits]![UnitésEnStock]<5
EstNull([Prénom])
[Pays/Région]="Royaume-Uni" And Forms![Total des ventes]![Commandes 
cumulées]>100
[Pays/région] In ("France", "Italie", "Espagne") 
And Len([Code Postal])<>5
BoîteMsg ("Confirmer modifications ?" ,1) = 1
[TempVars]![MsgBoxResult]=2

Créer un champ de type "mot de passe" (Pour masquer des données sensibles) ?

Si vous avez besoin d'un champ ou, quand on écrit quelque chose dedans, on ne voit que des petites étoiles à la place, allez dans la table qui vous intéresse, cliquez sur le champ à protéger, et, en bas, dans les options, dans l'option "Masque de saisie", écrivez :

Mot de passe

En plus, on ne pourra même pas le copier coller dans une autre application !

Créer un raccourci sur le bureau

Si vous allez dans l'explorateur, et que vous le redimensionnez en petite fenêtre, vous pouvez glisser votre base de données avec la souris jusque sur le fond de votre bureau Windows.

Mieux encore : si vous êtes dans votre base de données, et que vous redimensionnez Access en petite fenêtre, vous pourrez alors glisser les tables, requêtes, formulaires, états et macros directement sur le fond de votre bureau Windows. Lorsque vous double-cliquerez dessus, Access se lancera, la base de données s'ouvrira, et l'objet s'épanouira (J'allais dire "Et la bobinette cherra").

Comment changer le mot de passe de plusieurs bases de données en même temps ?

Il faut que vous vous trouviez dans une autre base de données, dont vous ne désirez pas changer le mot de passe (On ne peut pas changer le mot de passe d'une base de données ouverte). Dans VBA, vous allez dans Outils/Références/ cochez :
Microsoft ActiveX Data Objects 2.1 Library
avant d'utiliser ce code :

Sub ChangerMotDePasse()
    Dim objConn As ADODB.Connection
    Set objConn = New ADODB.Connection
    objConn.Mode = adModeShareExclusive
    objConn.Provider = "Microsoft.Jet.OLEDB.4.0"
    objConn.Properties("Jet OLEDB:Database Password") = "ancien"
    objConn.Open "Data Source=D:\Mes documents\Compta.mdb"
    objConn.Execute "ALTER DATABASE PASSWORD [nouveau] [ancien]"
    objConn.Close
    Set objConn = Nothing
End Sub

Comment créer une table avec VBA ?

Sub CreeTable()
    Dim TableContact As TableDef
    Set TableContact = CurrentDb.CreateTableDef("T_Contact")
    TableContact.Fields.Append TableContact.CreateField("NomContact", dbText)
    TableContact.Fields.Append TableContact.CreateField("Prenom", dbMemo)
    CurrentDb.TableDefs.Append TableContact
    CurrentDb.TableDefs.Delete "T_Contact"
End Sub

Imbrication de code SQL dans le critère d'une requête

Si vous désirez la liste des clients dont le salaire est supérieur à la moyenne des salaires, écrivez ceci dans le critère du salaire :

>(SELECT Avg(SalaireMensuel) FROM T_Client)

N'oubliez pas d'encadrer la requête avec des parenthèses

Que sont les requêtes action ?

Requête Ajout - Lors d'une requête AJOUT, il s'agit d'ajouter des données depuis une autre table. Il faut et il suffit que les noms des champs correspondent (par exemple, on peut très bien vouloir ajouter une table avec pour unique champ NOM à une autre table avec pour champs NOM et PRENOM). Ca marche même si les champs sources sont définis comme plus longs que les champs-cibles. ATTENTION : Si, dans une table, on ajoute des données trop grandes, on aura même pas un message d'erreur (juste que des lignes vont être rajoutées)

Requête Suppression  - Il s'agit d'une requête sélection dont le résultat sera retiré de la table

Requête Création de table - Le résultat de la requête sera tout simplement exporté vers une nouvelle table dont il faudra définir le nom.

Requête Mise à jour - Une requête Mise A Jour est une requête qui permet de modifier les enregistrements eux-mêmes à l'aide d'une formule et de certains critères. Par exemple, pour ajouter 10% au prix de chaque article "Charcuterie", il faut demander une requête ajout, taper =Charcuterie dans le champ "TypeArticle" et simplement effectuer une requête sélection, et le résultat sera créé dans une nouvelle table

ASTUCE : Admettons un formulaire facture avec un sous formulaire FactureDetail. Pour mettre à jour automatiquement la réduction de stock la table Article avec les différentes quantités commandées dans le détail du formulaire, au lieu de faire de la programmation compliquée, il suffit de créer une requête de mise à jour comprenant les tables Facture, FactureDetail et Article. On aura besoin des champs IDFacture de facture, Qté de facture detail et ResteStock de Article. Le paramètre de IDFacture doit être le champ IDFacture du formulaire facture, et la mise à jour de ResteStock doit être [ResteStock]-[Qte].

Lorsque vous exécutez une requête -action, ou une macro qui exécute plusieurs requêtes-action à la chaîne, vous devrez répondre à chaque demande de confirmation d'exécution de cette requête action. Ces messages peuvent être supprimés en allant dans Fichiers/Options/Paramètres du client - Confirmer : Requêtes action. Cette option peut se programmer par Macro (Action Avertissements - Avertissements actifs : Non) et par VBA : DoCmd.SetWarnings True.

Requêtes paramétrées

Si vous désirez qu'une requête vous demande à chaque lancement votre critère de sélection, écrivez votre question entre [crochets]. Par exemple, si vous avez un champ DateLivraison, et que vous désirez tous les enregistrements entre telle et telle date, mais ça change à chaque lancement de la requête, écrivez ceci comme critère de DateLivraison :

Entre [Date du début de la période] Et [Date de la fin de la période]

Répéter automatiquement le code VBA sur Clic d'un bouton

Lors de la création d'un bouton, si on met la proprété de ce bouton Répéter automatiquement à Oui, le code Sur Clic de ce bouton sera automatiquement répété tant que l'utilisateur laisse le doigt appuyé sur ce bouton.

Ne pas oublier d'insérer un DoEvents dans ce code pour voir la progression.

Raccourcis-clavier sur un bouton grâce a &

Afin de définir des raccourcis-clavier automatiques pour cliquer sur les boutons d'un formulaire, il suffit de faire précéder la lettre (généralement la première) d'un signe & dans la légende (p.ex. &Contrôle des ventes) et quand on fait ALT-C, on clique sur ce bouton.

Dans le cas ou il y a malencontreusement 2 contrôles qui possèdent la même lettre, c'est le premier dans l'ordre des tabulation qui prend le contrôle (A éviter, donc)

Comment montrer visuellement qu'un champ doit obligatoirement être rempli ?

Lorsqu'on définit un champ "Null interdit : Oui", il est alors obligatoire de renseigner ce champ. Or, quand l'utilisateur remplit les données, il ne sait pas quels sont les champs à remplir obligatoirement. Une méthode élégante consiste à écrire en rouge "(obligatoire)" directement dans le champ. Lorsque l'utilisateur clique dedans, ce texte disparait aussitôt. Pour ce faire, dans la propriété "Format" de ce champ, écrivez :

@;[Rouge]"(Obligatoire)"

Multi-sélection dans une liste modifiable

Il est possible de sélectionner plus d'un élément dans une liste modifiable (pas déroulante évidemment). Pour ce faire, il faut définir la propriété Multi-sélection à :

Aucun Pour ne pas permettre de sélectionner plus d'un élément
Simple Pour que l'utilisateur n'aie plus qu'a cliquer sur plusieurs éléments s'ils le désire pour les sélectionner automatiquement
Etendu Pour sélectionner un élément à la fois, mais utiliser la possibilité des touches SHIFT et CTRL pour en sélectionner plusieurs

L'exemple suivant affiche élément après élément tous les éléments sélectionnés dans une liste modifiable :

For Ctr = 0 To LISCouleur.ListCount - 1
    If LISCouleur.Selected(Ctr) Then
       MsgBox LISCouleur.Column(0, Ctr)
    End If
Next Ctr

Sablier

Affichage du sablier le temps d'une fonction

DoCmd Hourglass True

Un champ est-il vide ?

Afin de contrôler de manière absolue si un champ est vide :

if isNull(NomChamp) or isEmpty(NomChamp) or NomChamp=""

Quel bouton de souris a été appuyé ?

Les événements de souris peuvent se programmer très finement. MouseUp permet de définir quel bouton de la souris a été cliqué, ainsi que l'utilisateur a appuyé sur SHIFT ou pas. Cet événement remplace plus richement l'événement simple CLICK.

Private Sub Politesse_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ' Mieux vaut privilégier MouseUp
End Sub

Private Sub Prenom_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Select Case Button
        Case LEFT_BUTTON: MsgBox "Clic gauche"
        Case RIGHT_BUTTON: MsgBox "Clic droit"
        Case MIDDLE_BUTTON: MsgBox "Clic centre (roulette)"
    End Select
    ' L'utilisateur a-t-il appuyé sur SHIFT en cliquant ?
    If Shift = 1 Then MsgBox "Clic + appui sur MAJ (Shift) en même temps)"
    ' X et Y : Emplacement de la souris (au pixel près je suppose)
    MsgBox X & " " & Y
End Sub

' Click sera effectué après MouseUp
' Click ne prend pas en compte le clic droit, mais prend le SHIFT clic
Private Sub Prenom_Click()
    MsgBox "Clic simple"
End Sub

Les événements de souris (Clic, Double-clic, appuyée, relâchée) possèdent 4 arguments (Button , Shift , X et Y). Button représente le bouton qui a été appuyé. Ce bouton est représenté par les constantes prédéfinies LEFT_BUTTON , RIGHT_BUTTON et MIDDLE_BUTTON.

Ouvrir un formulaire sur un enregistrement précis

DoCmd OpenForm "F_Article", , ,  "[IDArticle] = " & VARIDArticle

Recalcul de champs de formulaires

Dans certains cas, les champs calculés d'un formulaire ne sont pas immédiatement mis à jour. Pour remettre un champ calculé à jour, il faut créer un bouton sur le quel on met le code suivant sur clic :

NomChampCalcule.Recalc

Envoi de touches de clavier avec SendKeys

VBA pour Access permet théoriquement d'absolument tout faire. Mais, dans certains cas "récalcitrants", on aimerait pouvoir lui dire de taper physiquement certaines séquences de touches sur le clavier, vraiment, comme s'il y avait des petits doigts qui sortaitn de l'ordinateur.

C'est possible, et cette instruction se nomme SendKeys.

Si l'on désire supprimer la confirmation d'une boîte de dialogue, on peut tout à fait utiliser SendKeys, mais il faut envoyer la touche juste avant l'appel à l'instruction que l'on sait qui va générer une boîte de dialogue avec confirmation.

Il est possible d'envoyer un certain nombre de fois la même touche : ici nous envoyons 100 fois la combinaison de touches SHIFT TABULATION. La liste complète des touches spéciales et leur utilisation se trouve ici.

SendKeys "+{TAB 100}", 1

Le 2ème paramètre, quand il est à 1, oblige SendKeys de terminer son travail avant de continuer à traiter la suite du code VBA.

Il est également possible, en une seule instruction SendKeys, d'envoyer à la fois du texte et des touches spéciales :

L'exemple suivant envoir CTRL-S, F_aaa et enter

SendKeys ("^{s}" &

"F_aaa" & "{enter}")

Il s'agit donc de faire CTRL-s (Fichier/Enregistrer sous), écrire comme nom de formulaire (en admettant que nous soyons dans un formulaire) F_aaa, et de cliquer sur OK (D'appuyer sur ENTER, ce qui revient au même.

Evénement Changement d'onglet

Quand on utilise le contrôle onglet, on ne peut pas définir sur click pour exécuter une procédure quand on choisit un onglet, mais Sur Changement. On peut alors tester la propriété value qui s'échelonne de 0 à nombre d'onglets -1 dans le contrôle général onglet (pas dans un onglet)

Texte défilant

Très joli, et très utile pour mettre en exergue des informations très importantes !

Private Sub Form_Timer()
TXTTexte.Caption = Right$(TXTTexte.Caption, Len(TXTTexte.Caption) - 1) & Left(TXTTexte.Caption, 1)
End Sub

Lancez le formulaire en mode saisie de données : vous verrez défiler votre texte, et vous pourrez travailler normalement dans votre formulaire.

Récupérer le contenu du champ actif

Sans devoir spécifier de quel champ il s'agit : Par exemple, récupération du contenu du champ NomClient, sur l'événement après MAJ de ce même champ :

msgbox screen.activecontrol

Forcer les dimensions d'un formulaire

Voici comment obtenir une fenêtre bien carrée au milieu de l'écran.

DoCmd Restore ' Pour faire venir la fenêtre en taille moyenne (Sinon on ne peut pas la dimensionner)
' DoCmd MoveSize droite, bas, largeur, hauteur
DoCmd MoveSize 2000, 1000, 7500, 7000
Attention : dès Access 2007, il faut d'abord préciser que les fenêtres sont des fenêtres superposées, et pas des documents à onglets (Fichier/Options/Base de données active : Options de la fenêtre document.

Attitude d'un formulaire en mode multi-utilisateurs

Que se passe-t-il lorsque plusieurs utilisateurs utilisent le même formulaire d'une même base de dpnnées simultanément ? Voyons ça dans la propriété Verrouillage (Onglet Données).

Général Le 2ème utilisateur ne peut même pas ouvrir le formulaire du tout
Enr. Modifié Lorsque le 2ème utilisateur arrive sur l'enregistrement modifié par le premier, une sorte de petit signal "parcage non autorisé" s'affiche dans le sélecteur, et il ne peut rien modifié
Aucun Les 2 utilisateurs peuvent faire en même temps des modifications, et s'ils s'emmêlnt les pinceaux du style que c'est le premier qui commence à entrer les infos, mais c'est le 2ème qui finit, il y aura un message de conflit proposant la priorité à l'un ou à l'autre au choix.

Couleurs de boutons

A partir d'Access 2007, on peut attribuer des couleurs différentes aux boutons selon que la souris passe dessus sans cliquer, ou qu'on clique.

Regardez les propriétés suivantes de votre bouton :

Roulette de la souris et enregistrements de formulaire

Dans les versions précédentes d'Access, lorsque vous étiez dans un formulaire avec un enregistrement par écran, et que vous rouliez la roulette de votre souris, vous vous déplaciez d'entregistrement en enregistrement. A partir d'Access 2007, la roulette a été désactivée. Marche à suivre pour réactiver cette fonction : Allez dans les propriétés de votre formulaire : Propriétés/Onglet événements/Sur roulement de la souris/générateur de code, et copiez le code suivant :

Private Sub Form_MouseWheel(ByVal Page As Boolean, ByVal Count As Long)
    On Error Resume Next
    If Count < 0 Then
       DoCmd.GoToRecord , , acPrevious
    Else
       DoCmd.GoToRecord , , acNext
    End If
End Sub

Filtre dans une table, requête, formulaire ou état

Si vous désirez qu'un objet soit filtré, le plus rationnel est souvent de créer une requête. Mais voici une autre méthode : Imaginons une table, requête, formulaire ou états dans lequel il y a les champs Titre et Prenom, et qu'on veuille que dès l'ouverture de l'objet, nous n'ayons que les "monsieur", dont le Prneom commence par la lettre A :

Dans la propriété Filtre de l'objet, mettez : Politesse="Monsieur" and Prenom Like "A*"

Mettez la propriété Filtrer sur chargement à Oui

Attention : Si, par la suite, vous cliquez avec le bouton droit de votre souris sur l'un de ces champs pour modifier le filtre, c'est ce nouveau filtre qui sera mémorisé !

Si vous désirez appliquer un filtre depuis un bouton :

Private Sub BoutonDeFiltre_Click()
    Me.Filter = "Politesse='Monsieur' and Prenom Like'a*'"
    Me.FilterOn = True
End Sub

Notez les apostrophes dans les guillemets (Car il s'agit de texte. Si les données avaient été numériques, il n'aurait pas fallu les écrire).

Confirmation de modification d'un enregistrement

Soit un formulaire F_Client, basé sur une table T_Client. Un utilisateur modifie certains champs d'un enregistrement : il suffit de fermer le formulaire pour que les données soient remplies dans T_Client sans demande de confirmation. Si vous désirez qu'une boîte de dialogue s'affiche pour demander la confirmation des changements, créez un bouton sur votre formulaire sur lequel vous écrivez "OK"

Sur clic de ce bouton, mettez le code suivant :

Private Sub BDCOK_Click()
    ' Si rien n'a changé, on ferme sans rien demander :
    If Me.Dirty = False Then
        DoCmd.Close
        Exit Sub
    End If
    ' Si quelque chose a changé, on affiche la boîte de dialogue :
    Confirme = MsgBox("Confirmer les changements ?", vbYesNoCancel)
    Select Case Confirme
        Case vbYes: DoCmd.Close ' Oui : On ferme (Et donc Access enregistre les changements)
        Case vbNo:  Me.Undo ' Non : On annule les changements...
                    DoCmd.Close '  ... et on ferme
        Case vbCancel: ' Rien ne se passe : On reste dans le formulaire
    End Select
End Sub

Traiter la touche ESC (Escape - Echap)

Quand on appuie sur la touche ESC, l'enregistrement sur lequel on faisait des modifications annule ces dernières. Mais il est possible d'exécuter une procédure VBA à la place. Pour ce faire :

Créez un bouton sur le formulaire, et écrivez-y : MsgBox "Vous avez appuyé sur ESC"

Dans les propriétés de ce bouton, sur l'onglet Autre, définissez la propriété Annuler à Oui.

Maintenant, dans ce formulaire, quel quel soit le champ dans lequel vous êtes, si vous appuyez sur ESC, le message va s'afficher.

Il est possible d'assigner des macros et du VBA à toutes les touches spéciales du clavier (ALT-Lettre, F1, F2, ..., Etc.). Détails sur cette page de Microsoft.

Ecriture dans la barre d'état

La propriété StatusBarText permet d'écrire dans la barre d'état. Par exemple, quand on clique sur le champs Prenom d'un client, on voudrait afficher dans la barre d'état la date du jour, corretement formatée.

Il faut aller (en toute logique) dans l'événement OnGotFocus (Sur réception focus) de Prenom, et écrire :

Prenom.StatusBarText = Format(Date(), "dddd dd mmmm yyyy")

On peut bien sûr en mode création définir la propriété de la barre d'état pour un contrôle, mais j'ai testé : On ne peut pas insérer une fonction

A partir d'ici, ce sont plus des notes personnelles que de véritables pages web :

Les objets de base Access

Tables : Réinitialiser le numéro automatique, diverses astuces
Tables liées - Retrouver le chemin et le fichier d'ou elles
sont issues
Requêtes : Action (mise à jour, suppression, création de table), Regroupement, paramètres, champs calculés, union, à tables multiples, premières valeurs, relations, requêtes imbriquées, analyse croisée, Create Table
SQL : Utilisation et explication de SQL, Innenr Join, Inner Join imbriqués, DistinctRow, Top, Appel SQL depuis VBA comparaison avec les requêtes faites avec le QBE (Query By Example)
Formulaires : Extrait du fichier : Gestion de la dimension, événements, plusieurs instances, verrouillage d'enregistrements, listes modifiables, sous-formulaires, clavier, événement ToucheAppuyée, barre d'état, jauge de progression, FindRecord (trouver un enregistrement), filtre, cancelEvent, Control
Etats : Cumul, Dessin de lignes, Regroupement, Evénement AuFormatage, Colonnes, Ouverture en VBA en mode création, Ecriture de texte dynamiquement, Numérotation des lignes, Utilisation avancée
Macros : Fonctionnement, Conditions, Sous-Macros, Interaction avec VBA, macros automatiques AutoExec et AutoKeys

Programmation VBA : DAO - ADO

ATTENTION : La bibliothèque DAO 3.6 reconnaît les fichiers MDB, mais pas les fichiers ACCDB (Access 2007)

DAO : Référence complète et exhaustive des méthotes et propriétés
DAO  : (Data Access Object) - sauf les RecordSets - Versions de Jet, Création d'objets (Tables, utilisateurs, Bases de données, propriétés, formulaires, EventProcedure), Notion de collection, For Each, Count, Object, Workspace, DBEngine, Traitement des requêtes, Refresh, With, Objets par défaut...
DAO : Recordsets : RecordSetClone, FindFirst, CurrentDb, OpenDataBase, MoveFirst, Dynaset, Snapshot, EOF, Edit, Update, AddNew, GetRows, Index, Seek, NoMatch, Delete, Close...
ADO - ActiveX Data Object : la nouvelle alternative de Microsoft remplaçant DAO pour les accès aux données

Programmation VBA : Divers

Création de fonctions, procédures et types personnalisés - Exemple simple, Paramètres optionnels, préservation des variables, nombre variable d'arguments, Call, Types
Fonctions existantes dans Access : Tableaux, Conversion, Dates et heures, Regroupement de domaine, Financières, Inspection (IsNuméric, IsDate, ..., ), mathématiques, Iif, Switch, Traitement de textes, Retours des fonctions, Explications et astuces
Fonctions personnalisées prêtes à l'emploi Récupérer le nom de l'ordinateur, de l'utilisateur, Déterminer la langue d'Access, Chercher le dernier jour du mois, Qui fait partie de quel groupe (sécurité), Transformer un montant en toutes lettres, calculer un barême horaire, arrondissement à 5 centimes, calcul d'un montant sans TVA, etc.
DDE : Les liaisons DDE (Dynamic Data Exchange), principalement avec Word et Excel : DEPUIS ACCESS : Insérer du texte dans Word, Ajouter une feuille dans Excel, Exploitation d'une fonction Excel, 
Débuggage : Débuggage Express, Raccourcis Clavier, Points d'arrêts, Visualisation des variables
Fichiers et dossiers : accès en Lecture/écriture à un fichier texte, Dir, EOF, BOF, FileAttr, FreeFile, Input, Seek, ChDir, MKDIR, Kill, Input, Write, Print, ...
ActiveX : (Principalement CommonDialog) Utilisation et importation, Common Dialog, RTF, InitDir, ShowOpen...
API : Comportement et utilisation, DLL les plus usités, marche à suivre, Exemple simple, Analyse détaillée, Fonctions API intéressante : GetTickCount, mciExecute, sndPlaySound, GetWiindowsDirectory, GetComputerName, GetUserName...
OLE : (Object Linking and Embedding) - Liaison et incorporation d'objets divers par VBA, insertion de feuilles Excel
Assistant : Programmation de l'assistant Office : Exemple
Visual Basic : Déclaration de variables et de tableaux : Dim, General/Declaration, Tableaux dynamiques, Taille des types
Visual Basic : Opérations globales sur les objets d'Access : Ouverture-Fermeture de formulaires, d'états, Recherche d'un enregistrement dans un formulaire, Importation de fichier texte dans une table
Visual Basic : Utilisation de mots-clé de base : Do, Until, Loop, For, Next
Visual Basic : Remarques générales : Variables système, Opérateurs mathématiques et logiques, Echo, Option Explicit, F5, Collection personnalisée, Exécution d'un menu, Case Sensitive, Scinder le code en 2 lignes, Guillemets entre guillements, Msgbox, InputBox, Dsum, Dcount, Variables-Objets, Types de données...

Divers

Progiciel : Conseils pour la finalisation d'une base de données destinées à être distribuées au grand public, Barres d'outils et menus personnalisés, Menus contextuels, Fonctions personnalisées, .MDE, Options de démarrage, Kit de développement, Compactage et réparation automatique
Compléments : Utilisation des compléments Access, et Compléments personnalisés (.MDA), Gestionnaire, Analyseur, Attaches, Importation,
Configuration nécessaire à Access : Installation d'Office, Matériel, Logiciel, Réseau, Espace disque, Composants optionnels
Conseils personnels : Normalisation des noms de tables, de champs, d'objets, Abréviations, Création d'une base de données classique, Marche à suivre
Les fichiers d'aide (.HLP). Je m'appuie sur ForeHelp (logiciel indépendant d'Access)
Formats d'affichage complexes : Multi-Format selon la valeur, Dates, Texte, Valeur vide, format en couleur
Généralités globales d'Access (notamment le paramètre Command), Compactage, réparation, Lancement d'Access, Rendre un objet invisible...
Internet : Interaction Access avec Internet : Liens hypertexte, Télécommander un moteur de recherche, Envoyer par E-Mail
.LDB : (Log Data Base) Utilité et accès : accès par VBA

Menus et barres d'outils : Création et utilisation de menus et barres d'outils personnalisées
Réplication : Théorie, Utilité, fonctionnement, marche à suivre, gestion des conflits, Réplica-Maître : Création, récupération, cas pratique, Multi-Réplicas, Gestion des clés primaires, Réplica créé depuis un réplica, Réplication partielle, Réplication par DAO...
Ressources systèmes : Fichiers attachés à Access, base de registres, Tables systèmes, Accès par DAO, System.MDA, Utility.MDA, Wzbldr.MDA, Wzfrmrpt,.MDA, Wzlib.MDA, Wvquery.MDA, WzTable.MDA, Msacc2.ini, Install.stf
Sécurité : Les utilisateurs, les groupes, les groupes de travail .MDW (notamment System.MDW), premières démarches, l'administrateur, Codage/Décodage, Mots de passe, Propriétaires (Par défaut, Engine, Inconnu), Utilisateurs et groupes prédéfinis, Invités, Sécurité absolue, Sécurité par DAO...
Réseau local : Utilisation d'Access en réseau local, Intervalle d'actualisation
Utilisation de l'utilisateur courant et du domaine courant Windows NT

Le code suivant remplit une table qui doit être existante (T_TableChamp, pourvue des champs texte NomTable et NomChamp) avec les noms de tous les champs de toutes les tables de la base de données courante :

Sub StatistiqueTableChamps()
  Dim MaTable As New ADODB.Recordset
  MaTable.Open "T_TableChamp", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
  For Ctr = 0 To CurrentDb.tabledefs.Count - 1
    If Left(CurrentDb.tabledefs(Ctr).Name, 4) <> "MSYS" Then
      For C2 = 0 To CurrentDb.tabledefs(Ctr).Fields.Count - 1
        MaTable.AddNew
        MaTable("NomTable") = CurrentDb.tabledefs(Ctr).Name
        MaTable("NomChamp") = CurrentDb.tabledefs(Ctr).Fields(C2).Name
        MaTable.Update
      Next
    End If
  Next
  MaTable.Close
  Set MaTable = Nothing
End Sub

Afin d'éviter les apostrophes (') et les guillemets(") dans les champs, car ces deux caractères donnent bien du fil à retordre dans les filtres crées avec VBA, voici un bout de code tout bête qui permet de remplacer les apostrophes par des accents graves (´) et les guillemets par un double accent grave (´´). Vous allez sur l'événement "perte focus" (Lost focus) du champ qui vous intéresse :

Private Sub LeChamp_LostFocus()
    LeChamp = Replace(LeChamp, "'", "´")
    LeChamp = Replace(LeChamp, """", "´´")
End Sub

La même chose, mais juste avant qu'on enregistre les données, tous les champs en texte (A l'exclusion des listes déroulantes et autres) seront transformés :

Private Sub Form_BeforeUpdate(Cancel As Integer)
   On Error Resume Next
   For ctr = 0 To Me.Controls.Count - 1
     If Me.Controls(ctr).ControlType = 109 Then
        Me.Controls(ctr).Value = Replace(Me.Controls(ctr).Value, "'", "´")
        Me.Controls(ctr).Value = Replace(Me.Controls(ctr).Value, """", "´´")
     End If
   Next
End Sub

Divers VBA Sympa, en vrac

Enum, Type et tableaux avec For Each

Liens

Un excellent site de trucs et astuces Access | Liste des bugs connus sous Access

Office Systeème Access - Utilisation d'ActiveX, mais aussi des tonnes d'astuces avancées

Comment répéter un entête dans un sous état :

1- Dans la requête sous-jacente au sous-état ajouter une colonne :
Test: 1=1
Le code est bizarre puisqu'il c'est toujours vrai mais il est indispensable à la technique.

2- Dans le sous-état, créer un groupe sur la fameuse donnée "Test" qu'il faut positionner en tête de tous les (éventuels) regroupements.

3- Placer dans l'en-tête du Groupe "Test", les informations (les titres de colonnes ...) que l'on veut voir se répéter à chaque changement de page. Il devrait se situer après l'en-tête d'état et après l'en-tête de page (ces 2 en-têtes sont donc vides)

4- Dans les propriétés de l'en-tête du groupe "Test", positionner les propriétés (onglet Format) :
- Section insécable sur Oui
- Répéter Section sur Oui
- Saut de Page sur Non

5-Dans les propriétés du pied de page du groupe "Test", positionner :
- Section insécable sur Oui
- Saut de Page sur Non