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
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
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
La liste complète des raccourcis-clavier Access 2010 se trouve sur cette page de Microsoft.
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.
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.
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.
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-leSi 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.
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.
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
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 |
DoCmd.Maximize' La fenêtre active au sein d'Access
DoCmd.RunCommand acCmdAppMaximize' Le programme Access lui-même
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.
Application.CloseCurrentDatabase
Fermer la base et Access
Application.Quit
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;
CurrentDb.CreateQueryDef "R_Client", "SELECT * FROM T_ListeClient;" DoCmd.DeleteObject acQuery, "R_Client"
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.)
[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
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 !
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").
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
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
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
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
.
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]
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.
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)
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)"
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
Affichage du sablier le temps d'une fonction
DoCmd Hourglass True
Afin de contrôler de manière absolue si un champ est vide :
if isNull(NomChamp) or isEmpty(NomChamp) or NomChamp=""
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
Private Sub Prenom_Click() MsgBox "Clic simple" End Subpasen compte le clic droit, mais prend le SHIFT clic
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.
DoCmd OpenForm "F_Article", , , "[IDArticle] = " & VARIDArticle
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
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.
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)
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.
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
Voici comment obtenir une fenêtre bien carrée au milieu de l'écran.
DoCmd RestoreAttention : 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.' 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
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. |
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 :
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 IfEnd Sub
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 = TrueEnd 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).
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 SelectEnd Sub
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.
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
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
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
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...
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
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