Il est de bon ton de se souhaiter la bonne année. Mais vous, et vous seul, pourrez faire en sorte que cette année soit bonne, meilleure que celle qui vient de s'écouler. Apprenez à ne compter que sur vous, car personne n'est plus qualifié que vous-même pour bâtir, réparer ou améliorer votre propre vie. Personne ne fera les choses à votre place. D'ailleurs, tout ce que les autres peuvent faire, c'est souhaiter que vous le fassiez. Et ne croyez pas que tout ceux qui vous entourent vous apporteront des solutions : certains font juste partie de vos problèmes. Transformez vos résolutions en actes, et dans douze mois, retournez-vous et souriez-vous fièrement : C'était long. C'était difficile. Mais ça y est : 2017 était une bonne année, merci Moi.

Formulaires : Utilisation avancée

Globalité du formulaire

Formulaire en plein écran

Pour qu'un formulaire prenne tout l'écran, il faut le sélectionner, et aller dans l'événement SUR OUVERTURE et exécuter DoCmd.Maximize

Formulaire en dimension forcée

Pour forcer un formulaire à prendre une certaine partie 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

Exemple :

DoCmd MoveSize 2000, 1000, 7500, 7000 ' Chiffres pour obtenir une fenêtre bien carrée au milieu de l'écran.

Une technique plus simple consiste évidemment à dimensionner le formulaire en mode création, et de faire ensuite simplement docmd restore à l'ouverture. Encore plus simple . Utiliser la propriété AutoCenter : Oui

Evénements possibles :

EVENEMENT

QUAND SE PRODUIT-IL ?

OBSERVATIONS

Sur Activation Dès qu'un autre enregistrement apparaît à l'écran Ne pas confondre avec l'événement Activé
Avant insertion a à la frappe du premier caractère d'un nouvel enregistrement, ou à la première entrée dans une liste déroulante d'un nouvel enregistrement Instruction CancelEvent possible. Ne s'effectue pas lors de modifications de données.
Après insertion Juste après que l'enregistrement ait été sauvegardé ne s'effectue pas lors de modifications de données.
Avant MAJ Juste avant d'écrire les modifications sur disque Instruction CancelEvent possibleC'est ici que l'instruction CancelEvent est judicieuse en cas de vérification
Après MAJ Juste après avoir écrit les modifications sur disque  
Sur Suppression S'exécute dès l'appui de DEL Instruction CancelEvent Possible
Avant Suppression S'exécute Avant d'effacer l'enregistrement, juste avant la boîte de dialogue de confirmation Instruction CancelEvent possible
Après suppression Juste après une quelconque réponse à la boîte de dialogue de confirmation de suppression  
Sur ouverture A l'ouverture du formulaire (pas à l'agrandissement ni à l'activation), juste avant de l'afficher. Se passe juste avant Chargement Instruction CancelEvent Possible
Sur chargement Se passe juste après Sur Ouverture Ressemble énormément à Sur Ouverture.
Sur redimensionnement Juste après le redimensionnement. Attention : Lors d'un chargement de formulaire, cet événement peut se produire plusieurs fois.  
Sur libération   Instruction CancelEvent Possible
Sur fermeture A la fermeture du formulaire (pas à la diminution ni à la désactivation), juste avant de le faire disparaître  
Sur activé Dès que le formulaire est activé Ne pas conforndre avec l'événement Activation
Sur désactivé Juste après avoir cliqué sur une autre feuille (ce qui désactive automatiquement le formulaire)  
Sur réception focus Devrait se passer chaque fois que le formulaire devient actif, mais je n'arrive pas à déclencher l'événement  
Sur perte focus Même problème qu'avec Réception focus  
Sur clic Cliquer oú ???  
Sur double clic double-Cliquer oú ??? Instruction CancelEvent Possible
Sur souris appuyée   Instruction CancelEvent Possible
Sur souris déplacée Se passe perpétuellement  
Sur souris relâchée    
Sur touche appuyée A la place d'entrer le caractère à l'endroit voulu  
Sur touche activée   Instruction CancelEvent Possible
Sur touche relâchée Juste après avoir entré le caractère  
Sur erreur Dès qu'on tente de valider un champ non-correct (par exemple). Juste avant la boîte de dialogue par défaut.  
Sur minuterie Dès que l'intervalle minuterie est terminée  
Intervalle minuterie Se compte en millisecondes (0-65535)  

Forcer l'Enregistrement sur disque

Pour forcer l'enregistrement de l'enregistrement courant, taper SHIFT-RETURN. En programmation, on peut forcer l'enregistrement avec Me.Refresh

Formulaire trop long pour tenir sur un écran :

Pour éviter que quand on fait page down, il y ait tout le formulaire qui bouge de haut en bas, il faut rapprocher le pied de formulaire de la partie centrale.

Bordure dimensionnable

Dans Bordure (dimensionnable, trait simple, trait double) : Si on veut changer la propriété, il est nécessaire de fermer et de rouvrir le formulaire pour voir les changements

Taille des pixels selon la résolution

640X400 = 10 en hauteur et 16 en largeur en 1024X768

800X600 = 12,2 en hauteur et 20,2 en largeur en 1024X768

Raccourci sur le bureau d'un formulaire

Access 95

Lorsqu'on clique avec le bouton droit de la souris sur un formulaire, on peut choisir "Créer un raccourci". C'est à dire que le formulaire va s'installer en icône sur le bureau, et quand on clique 2 fois dessus, il appelle la dernière version d'Access et le formulaire correspondant. On peut également le faire glisser directement depuis Access jusque sur le bureau)

On peut d'ailleurs faire la même chose avec les tables, et dans ce cas, ça ne dérange cette fois plus d'ouvrir une base de données Access 95 avec Access 97...

Afficher les règles verticales et horizontales

On peut faire AFFICHAGE/OPTIONS/CREATION DE FORMULAIRE-D'ETAT et AFFICHER LES REGLES

Création d'une 2ème instance d'un formulaire

Il est possible d'ouvrir 2 fois le même formulaire :

Dans la partie déclarative :

Private NouveauForm As Form_F_Client

Quelque part dans un événement quelconque :

Set NouveauForm = New Form_F_Client
NouveauForm.Visible = True

Afin de se débarrasser de cette seconde instance :

Set NouveauForm = Nothing

On peut bien entedu corriger par programmation toutes les propriétés de la 2ème instance sans modifier l'original, puisque l'instance est un objet à part entière

Enregistrements sous-jacents

Dirty : Savoir si l'enregistrement en cours a été sauvegardé

Pour savoir si l'enregistrement en cours a été sauvegardé, on utilise la propriété

Me.Dirty

Elle renvoie Faux si l'enregistrement a été sauvegardé tel qu'il est, et Vrai si il est nécessaire de l'enregistrer. En d'autres mots, si on écrit

Me.Refresh
msgbox Me.Dirty

Dirty sera toujours Faux

Verrouillage

Il est possible de régler l'attitude d'un formulaire en mode multi utilisateur. Càd que l'on peut définir ce qui se passe quand un utilisateur est en train de modifier un enregistrement, et qu'un autre utilisateur est également en train de faire la même chose.

Général Le 2ème utilisateur ne peut même pas ouvrir le formulaire sur un autre enregistrement
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.

Filtrer les enregistrements

Il faut aller dans la propriété Filtre du formulaire, et indiquer le critère de restriction. Par exemple, imaginons une table-système qui ne devrait afficher que le premier et unique enregistrement de la table T_Systeme, il faudrait indiquer dans Filtre, et écrire IDSYS=1 (En admettant qu'IDSYS soit la clé primaire)

Undo

Lorsqu'on désire effacer les madification d'un enregistrement de formulaire, on peut envoyer un Sendkeys("{ESC}"), mais une méthode plus propre consiste à écrire Me.Undo, sur la propriété BeforeUpdate d'un contrôle ou d'un formulaire

Forcer la sauvegarde d'un enregistrement :

DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

Le clavier

La touche ESCAPE

La touche ESCAPE permet d'annuler les opérations en cours, Mais il est possible de la moduler. Marche à suivre :

  1. Créer un bouton
  2. Sur Clic de ce bouton, écrire MsgBox "OK"
  3. Définir la propriété Annuler de ce bouton à OUI

Le résultat de ce fait est qu'à partir de maintenant :

- Si on clique sur lebouton, le message OK est affiché

- Si on appuie sur ESC, les modifications éventuelles sont annulées et ENSUITE,. le message OK est affiché

Moralité : Définir la propriété Annuler à OUI sur un bouton revient à obliger l'exécution du code ON CLICK quand on appuie sur ESC

Bouton de commande : AutoRépéter

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

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

Majuscules

Pour visualiser un champ en majuscule, sans pour autant le transformer, il faut mettre > dans format

Date du jour

Insertion automatique : Ctrl-Shift-D ; insère automatiquement la date du jour

Utiliser Alt-Lettre au lieu de cliquer sur un bouton

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)

Répétition de la saisie des enregistrements

Si on désire entrer plusieurs enregistrements, et qu'ils se ressemblent assez, il est possible, dans chaque champ de taper CTRL ' (apostrophe) pour répéter le contenu du même champ de l'enregistrement précédent

Sur Touche appuyée

L'événement Sur Touche Appuyée est bien pratique. Elle se compose de 2 paramètres : Keycode et Shift. On ne peut pas faire grand chose de correct quand on teste la valeur d'une lettre ou d'un chiffre, mais bien quand on utilise les touches de contrôle telles que Ctrl, Shift, Alt et AltGr

ATTENTION : AltGr est la seule touche qui ne répète pas le code à l'infini quand on presse dessus en permanence

Touches enfoncées Valeur de Keycode Valeur de Shift
Ctrl 17 2
Shift 16 1
Alt 18 4
AltGr 18 6
Ctrl Shift 16 3
Ctrl Alt 18 6 (pareil que AltGr, mais à l'infini)
Ctrl AltGr 18 6
Shift Alt 18 5
Shift AltGr 18 7
Ctrl Shift Alt 18 7
Ctrl Shift AltGr 18 7

Listes modifiables

Une liste déroulante n'est rien d'autre que l'affichage condensé d'une table, ou d'une partie d'une table (ou requête).

Rafraîchissement

Pour rafraîchir une liste déroulante d'un formulaire (en fait pour réinterroger la base de données), il faut utiliser la méthode REQUERY de la façon suivante. Dans notre exemple, nous sommes dans un formulaire principal, et dans le sous-formulaire il existe une liste déroulante basée sur la table des articles. L'idée est que cette liste déroulante ne doit comporter que les articles vendus par le fournisseur dont le numéro se trouve dans le formulaire principal. Il est alors nélcessaire de rafraîchir cette liste à chaque MAJ de la liste déroulante du formulaire principal. Le code de l'exemple suivant est à placer SUR RECEPTION FOCUS de la liste en question

Exemple :

Me![DésignationDuSous-Formulaire].Formulaire![ListeDéroulanteArticle].Requery

Quand on installe une liste déroulante, elle n'est pas triée. Pour la trier par une certaine colonne plutôt qu'une autre, il faut aller dans la propriété des données, et compléter la requête SQL par ORDER BY [Nom du champ à trier]

Comme il s'agit d'une requête SQL, il est possible de la créer en tant qu'entité complète, et de la nommer dans le champ approprié. On aura donc le nom de la requête au lieu du code SQL, ce qui est plus lisible.

Référencement des colonnes

Il est possible de faire référence à une certaine colonne d'une zone de liste dans le cas d'une zone de liste multicolonnes. La première colonne est référencée par la propriété Column(0).

Exemple :

pour référencer la 1ère colonne :

ZoneDeTexte=[LIMListeModifiable].Column(0)

Ou

ZoneDeTexte=[LIMListeModifiable]

pour référencer la 2ème colonne :

ZoneDeTexte=[LIMListeModifiable].Column(1)

La propriété column s'utilise sur les listes modifiables de toutes sortes. Elle permet de retrouver un élément quelconque de cette liste grâce aux paramètres NoColonne et NoLigne. Par exemple :

LIMClient.Column(2,4)

Renvoie la 3ème colonne (0,1,2), et le 4ème élément de cette liste. On n'utilise généralement que le premier paramètre, le 2ème étant facultatif, mais il trouve son utilité dans la propriété Multi-Select (voir ce terme).

Gestion des éléments inexistants et effacement de rubriques inutiles

Lorsqu'on désire choisir un élément dans une liste qui n'existe pas encore dans la table servant de base à cette liste, il est nécessaire d'ouvrir la table ou le formulaire correspondant, ajouter l'élément, et revenir au formulaire qui contient la liste pour enfin pouvoir choisir cet élément. Même cas de figure dans le cas ou on désire simplement retirer une catégorie définitivement de la table des catégories. Le code suivant est à placer sur l'événement ApresMAJ de la liste déroulante. Voici ce qu'il fait :

SUPPRESSION D'UN ELEMENT

AJOUT D'UN ELEMENT

Dim TableCategorie As Recordset
Set TableCategorie = CurrentDb.OpenRecordset("T_Categorie", dbOpenDynaset)
If IsNull(Categorie) Then
If DCount("[Categorie]", "T_Categorie", "[Categorie] = '" & Categorie.OldValue & "'") = 0 Then Exit Sub
Reponse = MsgBox("Vous venez d'effacer la catégorie " & Categorie.OldValue & ". Désirez-vous l'effacer définitivement des catégories ?", vbYesNo + vbExclamation, "Confirmation")
If Reponse = vbNo Then Exit Sub
TableCategorie.FindFirst ("[Categorie] = '" & Categorie.OldValue & "'")
Me.Refresh
TableCategorie.Delete
TableCategorie.Close
Categorie.Requery
Exit Sub
End If
If DCount("[Categorie]", "T_Categorie", "[Categorie] = '" & Categorie & "'") = 1 Then
Exit Sub
End If
Reponse = MsgBox("La catégorie " & Categorie & " n'existe pas. Voulez-vous l'ajouter à la liste ?", vbYesNo + vbExclamation, "Confirmation")
If Reponse = vbNo Then
SendKeys ("{ESC}")
Exit Sub
End If
TableCategorie.AddNew
TableCategorie("Categorie") = Categorie
TableCategorie.Update
TableCategorie.Close
Categorie.Requery

Remarque : J'ai bien essayé d'utiliser l'événement SurAbsenceDansListe, mais je n'arrive pas à capturer la valeur actuelle de la liste (il me donne l'ancienne valeur), car cet événement se passe avant les événements mises à jour

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

Sous-formulaires

Mode d'affichage d'un sous-formulaire

Pour obtenir un affichage différent d'un sous-formulaire (autre que le mode feuille de données), il faut aller dans le sous-formulaire, et changer les propriétés affichage par défaut, (et éventuellement affichage autorisé)

Largeur des colonnes d'un sous-formulaire

Dans un sous-formulaire en mode feuille de données , quand on constate que les colonnes sont trop larges ou trop étroites, il faut aller dans le sous-formulaire, demander l'affichage en feuille de données, rectifier à la main les largeurs de colonnes, et sauver avec CTRL-S

Somme dans un sous formulaire

Il est souvent bien agréable d'avoir en dessous d'un sous formulaire la somme de l'ensemble des champs d'un certain nom. Par exemple, dans un sous formulaire de facturation, il faudrait pouvoir indiquer en permanence le total temporaire de ce que le client à acheté jusque-là. Il suffit dans ce cas d'aller dans le pied du sous-formulaire et d'insérer une zone d'édition dont la source contrôle sera Somme([NomDuChamp]).

On constatera que ce champ Somme ne sera mis à jour que lors de l'écriture sur dique de l'enregistrement courant. Pour forcer cette mise à jour, il faut taper : Me.Refresh

Focus sur des éléments de sous-Formulaire

Lorsqu'on veut donner le focus à un élément d'un sous formulaire depuis le formulaire principal, il est nécessaire de placer le focus d'abord au nom du contrôle général "Sous-Formulaire", et ensuite seulement le focus au contrôle particulier (Il reste à voir si l'instruction FindRecord fonctionne dans le sous-formulaire). Par contre, pour replacer le focus sur un élément du formulaire principal, on peut le nommer directement (on reste dans le même enregistrement)

Diverses astuces

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 "C'est le prénom".

Il faut aller (en toute logique) dans l'événement On Got Focus de Prenom, et écrire :

Prenom.StatusBarText = Format(DateCours, "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

Me

Me représente l'objet en cours. Généralement un formulaire. Les deux lignes suivantes sont identiques si nous sommes dans un formulaire appelé "F_Client" :

Me

Forms("F_Client")

Imprimer

Cet exemple imprime deux copies triées des quatre premières pages de la feuille de données ou du formulaire actif:

DoCmd.PrintOut acPages, 1, 4, , 2

CANCELEVENT

Si on met dans le code du formulaire, dans l'événement Avant suppression, l'instruction DoCmd CancelEvent, le ou les enregistrements ne seront pas effaçables.

Evénements pouvant être annulés par l'action AnnulerEvénement

Avant suppression Au formatage Avant insertion Touche activée
Avant MAJ Souris appuyée Double clic Ouverture
Suppression Impression Sortie Libération

HOURGLASS

Affichage du sablier le temps d'une fonction

Exemple :

DoCmd Hourglass True

IsNull, IsEmpty

Quand on désire savoir si un champ est nul, il ne faut pas faire : IF [NomChamp] = Null, mais IF IsNull[NomChamp]

MOUSE

Les événements MOUSE dans un formulaire permettent de gérer la souris. Chaque événement MOUSEXXX possède 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.

MOVESIZE

Permet de redimensionner et de déplacer la fenêtre active.

Syntaxe : DoCmd MoveSize Gauche, Haut, Largeur, Hauteur

1 élément au moins est nécessaire, il faut laisser des espaces vides entre les cellules le cas échéant.

FINDRECORD

Attention : Lorsqu'on effectue une recherche avec FINDRECORD, si Access trouve l'enregistrement recherché, tout va bien, sinon, il se positionne sur le premier enregistrement de la table sans qu'on se rendre compte qu'on n'est pas sur le bon enregistrement. Pour contourner ce problème, il faut sauvegarder le numéro que l’on veut rechercher dans une variable, et lancer la recherche dans l’autre formulaire. Une fois que la recherche s’est arrêtée sur un enregistrement, s’il est différent du premier, tout va bien, mais s’il s’arrête sur le premier, c’est soit parce que le numéro d’enregistrement n’existe pas, soit parce que c’est réellement le premier que l’on recherche. Ainsi donc, une fois que l’on est dessus, il faut comparer la variable du début avec le numéro de l’enregistrement que l’on a sous les yeux : S’ils ne concordent pas, c’est que le numéro n’existe pas.

Il est possible d'ouvrir un formulaire uniquement sur un certain enregistrement.

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

Recherche dans un autre formulaire d’un certain ID

Il est possible avec l’instruction OpenForm, d’ouvrir un formulaire de façon à ce qu’il ne présente que l’enregistrement désiré, ce qui évite les instructions FindRecord. Dans l'exemple, A_READONLY ajoute l'avantage que quand on se trouve sur l'enregistrement correspondant, on ne peut pas aller au suivant ni sur un nouveau.

Exemple :

VARIDArticle = Me![IDArticle]
DoCmd OpenForm "F_Article", , , "[IDArticle] = " & VARIDArticle, A_READONLY

REQUERY : Permet de rafraîchir une requête (de la rappeler à un moment donné) par exemple une requête de liste déroulante qui n'est plus à jour à chaque enregistrement parce que tout simplement cette liste déroulante est basée sur une requête qui est basée sur la même table. Il faut donc à chaque nouvel enregistrement ou à chaque effacement rafraîchir la requête. Ca se fait comme ceci :

DoCmd Requery "LIMNomListeQuelconque" (Avec le nom du Contrôle-listeModifiable entre guillemets)

SHOWTOOLBAR

Pour afficher ou masquer une barre d'outils :

Sub Form_Activate ()
DoCmd ShowToolbar "NomBarreOutil", A_TOOLBAR_YES
End Sub
Sub Form_Deactivate ()
DoCmd ShowToolbar " NomBarreOutil ", A_TOOLBAR_NO
End Sub

Envoi d'une touche du clavier

Permet d'envoyer des touches comme si on les avait entrées au clavier. 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

Exemple :

SendKeys "+{TAB 100}", 1

Le 2ème paramètre, quand il est à 1, oblige SendKeys de terminer son travail avant de continuer.

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 (opération de sauvegarde d'un formulaire sous un certain nom)

SendKeys ("^{s}" & "F_aaa" & "{enter}")

Evénements Touches appuyée/Activée

Evenements de champs de formulaire (et de formulaire mais alors là, j'ai pas tout pigé...) qui surviennent quand on frappe une touche (code ANSI, ou ASCII 0-128). La différence entre les 2 est que TOUCHE APPUYEE survient en remplacement de l'affichage de la touche tapée (le code de la touche est mangé), tandis que TOUCHE ACTIVEE survient en plus de l'affichage du caractère.

Recalculer immédiatement les champs calculés

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 faire :

NomChampCalcule.Recalc

Evénement "Sur 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)

Attention donc, quand on double clique sur un contrôle onglet, ou que ce soit, c'est systématiquement l'onglet courant qui est sélectionné. La seule méthode pour sélectionner tout le contrôle est de dessiner un rectangle qui touche le contrôle onglet

Propriété décimales

La propriété concernant le nombre de décimales à afficher n'a aucun effet si la propriété Format est à Nombre Général. Il suffit de mettre dans Format 0.0, et de demander 4 décimales par exemple pour que le nombre apparaisse en 4 décimales.

Faire défiler du texte en circuit fermé

Il faut mettre le code suivant dans la propriété Timer du formulaire:

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

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

Générateur d'expression sur un événement

Il est possible d'assigner une macro ou un Event Procedure sur un objet ou un formulaire. mais également une expression. Dans ce cas, ce doit être une fonction qui existe dans un module ou dans le formulaire qui exécute du code. Ce peut être intéressant quand plusieurs objets exécutent toujours le même code

Groupe de contrôle

Il faut d'abord poser le groupe de contrôle, et ensuite seulement les éléments (Boutons bascule, Cases à cocher ou boutons radio, le fonctionnement étant identique) à l'intérieur. Ces contrôles, suivant qu'ils sont installés dans un groupe de contrôle ou pas, n'ont pas les mêmes propriétés, notamment la SOURCE CONTROLE pour un bouton isolé devient VALEUR CONTROLE dans un groupe d'options.

Pour définir les procédures qui vont s'exécuter suivant le contrôle que l'on clique, il faut les définir dans NomGroupeOption.Click. Là, il faut programmer logiquement en regardant la VALEUR CONTROLE de chaque contrôle, comme ceci :

Exemple :

Dans cet exemple, il existe seulement 2 contrôles :

Sub GroupOption_Click ()
If Forms![NomFormulaire]!NomGroupOption.Value = 1 Then
MsgBox "bouton 1 pressé"
Else
MsgBox "bouton 2 pressé"
End If
End Sub

Méthodes et propriétés de Control - Controls

Chaque contrôle posé sur un formulaire à un type. Ce type est numérique et est défini selon des constantes VB condensées dans ce tableau.

Exemple : On parcourt chaque enregistrement du formulaire, et on affiche son type. Attention : C'est un chiffre qui va être affiché.

Dim Ctl As Control
For Each Ctl In Me
MsgBox Ctl.ControlType
Next

Autre exemple : On parcourt le formulaire F_Client à la recherche des étiquettes, et quand on les trouve, on ajoute le signe ":" sur leur droite :

Dim Ctl As Control
For Each Ctl In Forms("F_Client")
If Ctl.ControlType = acLabel Then
Ctl.Caption = Ctl.Caption & ":"
End If
Next

Un exemple d'application particulièremen intéressant est quand on désire que la plupart des champs d'un formulaire ne peuvent pas contenir une valeur nulle(càd se prémunir contre les utilisateurs qui effacent les champs sans écrire 0), il faut mettre simplement ce code à chaque événement après MAJ de chaque zone que l'on ne veut pas nulle :

If IsNull(Screen.ActiveControl) Then
Screen.ActiveControl = 0
End If

Constante VB

Signification

acLabel Étiquette
acRectangle Rectangle
acLine Trait
acImage Image
acCommandButton Bouton de commande
acOptionButton Bouton d'options
acCheckBox Case à cocher
acOptionGroup Groupe d'options
acBoundObjectFrame Cadre d'objet dépendant
acTextBox Zone de texte
acListBox Zone de liste
acComboBox Zone de liste modifiable
acSubform Sous-formulaire/Sous-état
acObjectFrame Cadre d'objet indépendant ou graphique
acPageBreak Saut de page
acPage Page
acCustomControl Contrôle ActiveX (personnalisé)
acToggleButton Bouton bascule
acTabCtl Onglet

Condensation d'écriture et valeurs par défaut

Admettons que nous avons ouvert un seul formulaire nommé "Formulaire2", et que ce formulaire contienne un seul champ nommé "IDPersonne". Dans ce cas, toutes les manières d'écrire suivantes renvoient strictement le même résultat, à savoir la valeur contenue dans ce champ :

1 : on référence la totale :

Debug.Print Forms("Formulaire1").Controls("IDPersonne").Value

2 : La collection Forms numérote les formulaires OUVERTS de 0 à NombreFormulairesOuverts -1

Debug.Print Forms(0).Controls("IDPersonne").Value

3 : Le formulaire courant peut être représenté par Me

Debug.Print Me.Controls("IDPersonne").Value

4 : Il n'est pas nécessaire de préciser qu'IDPersonne est un contrôle, car Control est la collection par défaut de la collection Forms

Debug.Print Me("IDPersonne").Value

5 : On peut remplacer ("") par [ ]. Apparemment, ça va plus vite

Debug.Print Me![IDPersonne].Value

6 : On peut se permettre de ne pas mettre les crochets si le nom du champ ne contient pas d'espaces

Debug.Print Me!IDPersonne.Value

7 : On n'est pas obligé d'indiquer la propriété Value, car c'est la propriété par défaut de la collection Controls

Debug.Print Me!IDPersonne

8 : Si on enlève encore le Me, Ca marche encore, pour autant qu'on aie pas défini de variable portant ce nom, car ce serait elle qui serait utilisée.

Debug.Print IDPersonne

Jauge de progression : SYSCMD

Permet de contrôler la règle de progression dans la barre d'état. Par exemple lors d'un long traitement, afin d'informer l'utilisateur de l'état d'avancement de la tâche

Exemple :

DoCmd Hourglass True Affichage du sablier
Bidon = SysCmd(SYSCMD_INITMETER, "Remplissage en cours", 100)
Texte apparaissant dans la barre d'état, suivi du nombre de choses à faire (quelles qu'elles soient)
Bidon = SysCmd(SYSCMD_UPDATEMETER, 49) Le premier paramètre est fixe, le 2ème indique à quelle chose on est. La barre va indiquer la progression sous forme de pourcentage
Bidon = SysCmd(SYSCMD_REMOVEMETER) On efface la barre
DoCmd Hourglass False On enlève le sablier