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
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
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) |
Pour forcer l'enregistrement de l'enregistrement courant, taper SHIFT-RETURN. En programmation, on peut forcer l'enregistrement avec Me.Refresh
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.
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
640X400 = 10 en hauteur et 16 en largeur en 1024X768
800X600 = 12,2 en hauteur et 20,2 en largeur en 1024X768
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...
On peut faire AFFICHAGE/OPTIONS/CREATION DE FORMULAIRE-D'ETAT et AFFICHER LES REGLES
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
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
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. |
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)
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
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
La touche ESCAPE permet d'annuler les opérations en cours, Mais il est possible de la moduler. Marche à suivre :
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
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.
Pour visualiser un champ en majuscule, sans pour autant le transformer, il faut mettre > dans format
Insertion automatique : Ctrl-Shift-D ; insère automatiquement la date du jour
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)
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
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 |
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).
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.
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).
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 :
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
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
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é)
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
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
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)
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 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")
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
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 |
Affichage du sablier le temps d'une fonction
Exemple :
DoCmd Hourglass True
Quand on désire savoir si un champ est nul, il ne faut pas faire : IF [NomChamp] = Null, mais IF IsNull[NomChamp]
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.
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.
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 lon veut rechercher dans une variable, et lancer la recherche dans lautre formulaire. Une fois que la recherche sest arrêtée sur un enregistrement, sil est différent du premier, tout va bien, mais sil sarrête sur le premier, cest soit parce que le numéro denregistrement nexiste pas, soit parce que cest réellement le premier que lon recherche. Ainsi donc, une fois que lon est dessus, il faut comparer la variable du début avec le numéro de lenregistrement que lon a sous les yeux : Sils ne concordent pas, cest que le numéro nexiste pas.
Il est possible d'ouvrir un formulaire uniquement sur un certain enregistrement.
DoCmd OpenForm "F_Article", , , "[IDArticle] = " & VARIDArticle
Il est possible avec linstruction OpenForm, douvrir un formulaire de façon à ce quil ne présente que lenregistrement 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)
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
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}")
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.
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
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
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.
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
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
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
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
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 |
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
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