Ouvrir plusieurs fois le même formulaire
Parfois, il peut être pratique d’ouvrir plusieurs fois le même formulaire. Par exemple, pour comparer les fiches de deux clients, ou de trois produits. Ceci est possible depuis Access 97, mais nécessite un peu de VBA. Dans cet article, on va tâcher de voir le principe…
Mise en place
Je dispose d’un formulaire simple, appelé frm Personnes
. L’idée est d’ajouter un bouton, sur ce formulaire, pour ouvrir le même formulaire une nouvelle fois.
- Ouvrez votre formulaire en mode Création (je suppose que vous avez déjà placé un bouton dessus, en annulant l’Assistant Bouton de commande qui ne servira pas ici).
- Faites un clic du bouton droit sur votre bouton, et choisissez Propriétés.
- Dans le volet Propriétés, à droite de votre écran sur les Access récents, activez l’onglet Autres, et donnez un nom (propriété
Nom
, donc) à votre bouton. Le mien s’appellebtnAutreFiche
. - Activez ensuite l’onglet Événement.
- Cliquez sur les points de suspension à droite de l’événement
Sur clic
, et choisissez Générateur de code. - Adaptez l’événement
Sur clic
pour qu’il ressemble à ceci (Form_frm_Personnes
est le nom du formulaire, il va être proposé dans une liste par Access) :
1 2 3 4 5 6 |
Private frm As Access.Form Private Sub btnAutreFiche_Click() Set frm = New [Form_frm Personnes] frm.SetFocus End Sub |
La variable frm
doit être déclarée hors du bloc Sub / End Sub
, donc en tout début de module.
Si elle était déclarée dans le bloc Sub / End Sub
, le bouton ouvrirait une copie du formulaire, stockerait cette copie dans frm
… puis libèrerait aussitôt la variable frm, puisque le End Sub
est atteint. Le nouveau formulaire serait donc fermé… à peine ouvert !
En plaçant la variable hors procédure, vous garantissez que le formulaire copie existe… au moins tant que le formulaire de départ est ouvert.
Quelques imperfections
Hop, vous pouvez tester ! Tel que le système est en place pour l’instant, il y a encore quelques défauts (normaux). En effet, dans chaque nouveau formulaire ouvert se trouve une variable frm
(de type Form
), et une seule. Ceci veut dire que :
- Chaque formulaire ne peut lui-même ouvrir qu’une copie de
frm Personnes
(cette copie étant « stockée » dans la variablefrm
). Concrètement, si vous ouvrez un Form1, celui-ci a une variablefrm
, et un bouton pour ouvrir un Form2. Le Form2 aura sa propre variablefrm
, et un bouton pour ouvrir Form3… Et ainsi de suite. - Par conséquent, les différents formulaires doivent pour l’instant s’ouvrir en cascade : Form1 ouvre Form2, qui ouvre Form3, etc.
- Si vous appuyez sur le bouton de Form1, alors que Form2 et Form3 ont déjà été ouverts, vous allez – logiquement aussi – réinitialiser la variable
frm
du Form1, donc refermer Form2 et Form3.. Et ouvrir un Form2 tout neuf ! - De la même manière, comme chaque formulaire maintient un lien vers sa copie, si vous fermez le tout premier formulaire, vous fermez toute la série.
Malgré ces défauts, c’est le principe qui est intéressant ici. Mais bon, on a encore du boulot pour améliorer ça ! Un autre article bientôt… 🙂